Zobrazují se příspěvky se štítkemschemata a zapojeni. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemschemata a zapojeni. Zobrazit všechny příspěvky

středa 9. října 2019

Teploměr & vlhkoměr se spínáním ventilátoru do garáže.

   V garáži pozoruji již delší dobu zvýšenou vlhkost. Ta působí zvýšený výskyt koroze na brzdových kotoučích i jiných částech automobilu. Proto jsem se rozhodnul vytvořit nejen dva větrací otvory, ale i podpořit cirkulaci vzduchu pomocí ventilátoru spínaném v okamžiku, kdy vlhkost stoupne. 

Použité součástky:
Arduino Nano
DHT 11
Rezistor 10kΩ
LCD 20x4
Relé modul 5V, 4-kanálový
Ventilátor průměr 80 mm; 12V

Požadavky na zdroj: 12V/600mA

   Zapojení  je vlastně úplně jednoduché. DHT11 měří vlhkost (teplota je v podstatě bonus). Pokud vlhkost stoupne, nastavená hanice je 40%, zapne se ventilátor. Hystereze je nastavená tak, aby se ventilátor vypnul při vlhkosti nižší, než 35%.
   Využil jsem však dostatku místa na CD displeji a trošku si pohrál s kódem. Je zde zobrazena nejen aktuální teplota a vlhkost, ale i minimální a maximální dosažená hodota vlhkosti a také zda od posledního měření klesá, stoupá, nebo je stálá. Rovněž je zde signalizován stav ventilátoru ON/OFF.

LCD displej



Výpis kódu:
-------------------------------------------------------------------------------------------------------------------------------

// **************Teploměr a vlhkoměr s DHT11/22 *****************
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"

LiquidCrystal_I2C lcd(0x27,20,4);

// nastavení čísla pinu s připojeným DHT senzorem
#define pinDHT 5

// odkomentování správného typu čidla
#define typDHT11 DHT11     // DHT 11
//#define typDHT22 DHT22   // DHT 22 (AM2302)

// inicializace DHT senzoru s nastaveným pinem a typem senzoru
DHT mojeDHT(pinDHT, typDHT11);

int tep;
int vlh;

const int rele_vetrak = 13;
boolean vetrak_toci = false;
int vlh_vyp = 35;
int vlh_zap = 40;
int vlh_stara = 0;
int vlh_max = 0;
int vlh_min = 100;
 

void setup() {
 
  Serial.begin(9600);
  // zapnutí komunikace s teploměrem DHT
  mojeDHT.begin();
  lcd.begin(16, 2);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("---------------------");
  lcd.setCursor(0,1);
  lcd.print("|    Teplomer a    |");
  lcd.setCursor(0,2);
  lcd.print("|     vlhkomer     |");
  lcd.setCursor(0,3);
  lcd.print("---------------------");
  delay(5000);
  test_ventilatoru();

}

void loop() {
 
  mereni();
  //serialovy_vypis();
  vypis_lcd();
  hystereze_vlhkost();
  stav_vlhkosti();
  vlhkost_max();
  vlhkost_min();
 
 
 
 
 
  delay(5000); // pauza pro dalsi mereni
}

// funce mereni
void mereni(){
  tep = mojeDHT.readTemperature();
  vlh = mojeDHT.readHumidity();

}


// funkce vypis serial
void serialovy_vypis(){
  if (isnan(tep) || isnan(vlh)) {

    Serial.println("Chyba při čtení z DHT senzoru!"); // při chybném čtení vypiš hlášku
  } else {                                            // pokud jsou hodnoty v pořádku, vypiš je po sériové lince
   
    Serial.print("Teplota: ");
    Serial.print(tep);
    Serial.print(" stupnu Celsia, ");
    Serial.print("vlhkost: ");
    Serial.print(vlh);
    Serial.println("  %");
}
}
void hystereze_vlhkost() {
 
  if ((vlh < vlh_vyp) && (vetrak_toci))
  {
    digitalWrite(rele_vetrak, LOW);
    vetrak_toci = false;
  }
  else if ((vlh > vlh_zap) && (!vetrak_toci))
  {
    digitalWrite(rele_vetrak, HIGH);
    vetrak_toci = true;
  }

  if (vetrak_toci == true)
  {
    lcd.setCursor(17,3);
    lcd.print(" ON");
  }
  else {
    lcd.setCursor(17,3);
    lcd.print("OFF");
  }


}

void vypis_lcd(){
 
  lcd.setCursor(0,0);
  lcd.print("Teplota:");
  lcd.setCursor(16,0);
  lcd.print(tep);
  lcd.print((char)223); // symbol "°" (stupne)
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("Vlhkost:");
  lcd.setCursor(17,1);
  lcd.print(vlh);
  lcd.print("%");
  lcd.setCursor(0,3);
  lcd.print("Ventilator:");
  }

  void stav_vlhkosti(){

    if(vlh_stara == 0){
    lcd.setCursor(14,1);
    lcd.print(" ");
  }
  else if(vlh_stara > vlh){
    lcd.setCursor(9,1);
    lcd.print("klesa ");
  }
  else if(vlh_stara < vlh){
    lcd.setCursor(9,1);
    lcd.print("stoupa");
  }
  else if(vlh_stara == vlh){
    lcd.setCursor(9,1);
    lcd.print("stala ");
  }
    vlh_stara = vlh;
  }

  void vlhkost_max(){
   
 
  if(vlh > vlh_max){
    vlh_max = vlh;
    lcd.setCursor(2,2);
    lcd.print("Max:");
    lcd.setCursor(7,2);
    lcd.print(vlh_max);
    lcd.print("%");
  }
 
  }

  void vlhkost_min(){
   
 
  if(vlh < vlh_min){
    vlh_min = vlh;
    lcd.setCursor(12,2);
    lcd.print("Min:");
    lcd.setCursor(17,2);
    lcd.print(vlh_min);
    lcd.print("%");
  }
 
  } 

  void test_ventilatoru(){
  digitalWrite(rele_vetrak, HIGH);
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("  Test ventilatoru  ");
 
 
  for (int i=1; i<19; i++){
    lcd.setCursor(i,2);
    lcd.print("|");
    delay(250);
   
  }
  digitalWrite(rele_vetrak, LOW);
  delay(1000);
  lcd.clear();
  delay(1000);
  }



-------------------------------------------------------------- 

V části LOOP používám jen funkce, přijde mi tak celý kód přehlednější.



Jednoduché schéma zapojení. (Chybí tu rezistor 10kΩ zapojený mezi datovým vodičem na 5 a napájením 5V na DHT11).    
Postupem času jsem zařízení několikrát aktualizoval nyní (9/20)už j v provozu verze 4 s dvema dht senzory, webovým serverem, ovládáním otáček ventilátoru pomocí PWM a chlazením, protože teplo z Arduina a ethernetshieldu ovlivňovalo měření teploty i vlhkosti. Bude li čas, zaktualizuji i tady.

Knihovny:
DHT-sensor-library.zip
LiquidCrystal_I2C-1.1.2.zip

pondělí 29. července 2019

BME 280/380 - schema a zmena adresy I2C

Změna adres I2C na senzoru BME280/380 se provadi jednoduše. Základní tovární adresa je 0x76, zmena na 0x77 je na obrázku. 
Na rozbočovací desce je tento adresní přepínač realizován jako tři kontakty. Adresu I2C můžete zvolit zkratováním prvních dvou nebo posledních dvou kontaktů, jak je znázorněno na obrázku níže. 



Schematicky vypadá BME 280 takto:


Ve schématu je také vidět přepínač S1 SW SPDT (zelený rámeček) připojený k lince SDO, který umožňuje přepínat mezi adresami I2C 0x76 a 0x77 senzoru. Poslední bit adresy je řízen pinem SDO (vysoký nebo nízký)



neděle 18. března 2018

Double click na Arduinu aneb Two Buttons - 6 Functions

Pomocí softwaru můžeme vzít jedno tlačítko a nechat ho zapnout nebo vypnout, nebo dokončit komplikovanější funkci, pokud si to přejeme. Ale co když máme dvě funkce, ale stále jen jedno tlačítko? Mnozí z nás používají takové tlačítko, například na smartphonech, každý den; toto se nazývá krátký stisk a dlouhé stisknutí (stiskněte a podržte).

http://www.instructables.com/id/Arduino-Dual-Function-Button-Long-PressShort-Press/

sobota 30. ledna 2016

Termostatický spínač s OZ 741


Sepne při poklesu teploty relé. Používané při spínání větráků na radiátoru. Trimrem se nastvuje úroveň sepnutí/vypnutí.


Schema

  Video - zkouška na nepájivé desce



 
Video - funkční obvod