vineri, 17 octombrie 2014

Ceas RTC cu DS1307 si date mediu cu DHT22 pe afisaj alfanumeric LCD1602 folosind Arduino

   In septembrie, am postat articolul Ceas RTC cu DS1307 si date mediu cu DHT11 pe afisaj alfanumeric LCD1602 folosind Arduino si 
dupa cum spune si titlul, am inlocuit senzorul DHT11 cu DHT22 (AM2302), care este mult mai performant si are domeniul de masura mai larg (precizie +0,50C si +2 unitati umiditate, domeniul de masura este de -40..+800C si 0..100% umiditate).
   Ca si in cazul senzorului DHT11, mai raspandit (fiind mai ieftin), senzorul DHT22 (sau AM2302) se vinde ca modul cu 3 pini, sau ca piesa cu 4 pini, evident ca varianta ca poiesa e mai ieftina, necesitand o rezistenta de 4k7 conectata intre iesire (OUT/DATA) si (VDD/5V).
   Pentru informatii suplimentare recomand articolul DHTxx Sensors postat pe site-ul Adafruit.
DHT11 / DHT22
   Deoarece ministatia meteo cu ceas, varianta propusa de Janos, mi s-a parut ok, am refacut schema partial (practic nu am mai pus cele trei butoane fara retinere pentru reglare ore si minute).
   Daca aveti modulul cu 3 pini, schema de conectare este identica:
iar daca este doar senzorul (inscriptionat AM2302) schema devine:
   Practic, montajul arata asa, iar pe ecran informatiile sunt prezentate astfel (am schimbat 3 afisaje, care cu fundal rosu, albastru si galben):
   Sketch-ul adaptat, pentru a indica si temperaturi negative, este:
// Date and time functions using a DS1307 RTC 
// original sketck from http://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/
// add part with SQW=1Hz from http://tronixstuff.wordpress.com/ & http://www.bristolwatch.com/arduino/arduino_ds1307.htm
// DHT library from https://github.com/adafruit/DHT-sensor-library
// adapted sketch by niq_ro from http://nicuflorica.blogspot.ro/
// original article from http://nicuflorica.blogspot.ro/2013/06/ceas-de-timp-real-rtc-cu-ds1307-si.html
// adapted sketch drom http://nicuflorica.blogspot.ro/2014/09/ceas-rtc-cu-ds1307-si-date-mediu-cu.html

#include <Wire.h>
#include "RTClib.h"

// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

/*                                    -------------------
                                      |  LCD  | Arduino |
                                      -------------------
 LCD RS pin to digital pin 7          |  RS   |   D7    |
 LCD Enable pin to digital pin 6      |  E    |   D6    |
 LCD D4 pin to digital pin 5          |  D4   |   D6    |
 LCD D5 pin to digital pin 4          |  D5   |   D4    |
 LCD D6 pin to digital pin 3          |  D6   |   D3    |
 LCD D7 pin to digital pin 2          |  D7   |   D2    |
 LCD R/W pin to ground                |  R/W  |   GND   |
                                      -------------------
*/
// http://arduino.cc/en/Reference/LiquidCrystalCreateChar
byte grad[8] = {
  B01100,
  B10010,
  B10010,
  B01100,
  B00000,
  B00000,
  B00000,
};

RTC_DS1307 RTC;

#include <DHT.h>
#define DHTPIN 8     // what pin we're connected DHT11/22
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22

DHT dht(DHTPIN, DHTTYPE);

byte SW0 = A0;
byte SW1 = A1;
byte SW2 = A2;

// use for hexa in zecimal conversion
int zh, uh, ore;
int zm, um, miniti;

// 
float t1;

void setup () {
  // DHT init
  dht.begin();
  // create custom symbol
  lcd.createChar(0, grad);
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a logo message to the LCD.
  lcd.print("www.tehnic.go.ro");  
  lcd.setCursor(0, 1);
  lcd.print("creat de niq_ro");
  delay (2500);
  lcd.clear();
    
  // Print a logo message to the LCD.
  lcd.print("ministatie meteo");  
  lcd.setCursor(0, 1);
  lcd.print("cu DHT22 ver.1.0");
  delay (2500);
  lcd.clear();
   // Serial.begin(9600);
    Wire.begin();
  
// part code from http://tronixstuff.wordpress.com/
Wire.beginTransmission(0x68);
Wire.write(0x07); // move pointer to SQW address
Wire.write(0x10); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave
Wire.endTransmission();
// end part code from http://tronixstuff.wordpress.com/

    RTC.begin();
  if (! RTC.isrunning()) {
    //Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

  pinMode(SW0, INPUT);  // for this use a slide switch
  pinMode(SW1, INPUT);  // N.O. push button switch
  pinMode(SW2, INPUT);  // N.O. push button switch

  digitalWrite(SW0, HIGH); // pull-ups on
  digitalWrite(SW1, HIGH);
  digitalWrite(SW2, HIGH);

}

void loop () {
   DateTime now = RTC.now();
  int h = dht.readHumidity();

  float t = dht.readTemperature();
// float t = 23.56;
//float t = 7.32;
//float t = 0.01;
//float t = 0;
//float t = -0.02;
//float t = -6.45;
//float t=-13.25;


   lcd.setCursor(4, 0);
   if ( now.hour() < 10)
   {
     lcd.print(" "); 
     lcd.print(now.hour(), DEC);
   }
   else
   {
   lcd.print(now.hour(), DEC);
   }
   lcd.print(":");
   if ( now.minute() < 10)
   {
     lcd.print("0"); 
     lcd.print(now.minute(), DEC);
   }
   else
   {
   lcd.print(now.minute(), DEC);
   }
   lcd.print(":");
   if ( now.second() < 10)
   {
     lcd.print("0"); 
     lcd.print(now.second(), DEC);
   }
   else
   {
   lcd.print(now.second(), DEC);
   }
     lcd.print(" "); 
 
  lcd.setCursor(0, 1);
  // lcd.print("t=");
 if (t < 0) 
 {t1=-t;}
 else t1=t;
  
    if ( t1 < 10)
   {
     lcd.print(" "); 
   }
   if (t>0) lcd.print("+"); 
   if (t==0) lcd.print(" "); 
   if (t<0) lcd.print("-");
   lcd.print(t1,1);
   //lcd.print(",0");
//   lcd.write(0b11011111);
   lcd.write(byte(0));
   lcd.print("C  ");
    

   lcd.setCursor(10, 1);
  // lcd.print("H=");
   lcd.print(h);
   lcd.print("%RH");
 
   if (!(digitalRead(SW0))) set_time(); // hold the switch to set time

 
   delay(500);
}

void set_time()   {
  byte minutes1 = 0;
  byte hours1 = 0;
  byte minutes = 0;
  byte hours = 0;

  while (!digitalRead(SW0))  // set time switch must be released to exit
  {
    minutes1=minutes;
    hours1=hours;
    
     
    while (!digitalRead(SW1)) // set minutes
    { 
     minutes++;  
   // converting hexa in zecimal:
    zh = hours / 16;
    uh = hours - 16 * zh ;
    ore = 10 * zh + uh; 
    zm = minutes / 16;
    um = minutes - 16 * zm ;
    miniti = 10 * zm + um; 
  
  /*  
     for(int i = 20 ; i >0  ; i--) {
     displayNumber01(ore*100+miniti); 
     }
   */
   lcd.setCursor(4, 0);
   if ( ore < 10)
   {
     lcd.print(" "); 
     lcd.print(ore);
   }
   else
   {
   lcd.print(ore);
   }
   lcd.print(":");
   if ( miniti < 10)
   {
     lcd.print("0"); 
     lcd.print(miniti);
   }
   else
   {
   lcd.print(miniti);
   }
   lcd.print(":");
   lcd.print("00"); 
      
      if ((minutes & 0x0f) > 9) minutes = minutes + 6;
      if (minutes > 0x59) minutes = 0;
      Serial.print("Minutes = ");
      if (minutes >= 9) Serial.print("0");
      Serial.println(minutes, HEX);
    delay(150);    
    }

    while (!digitalRead(SW2)) // set hours
    { 
     hours++;          
     
   // converting hexa in zecimal:
    zh = hours / 16;
    uh = hours - 16 * zh ;
    ore = 10 * zh + uh; 
    zm = minutes / 16;
    um = minutes - 16 * zm ;
    miniti = 10 * zm + um; 
    
   /*
     for(int i = 20 ; i >0  ; i--) {
     displayNumber01(ore*100+miniti); 
     }
   */
   lcd.setCursor(4, 0);
   if ( ore < 10)
   {
     lcd.print(" "); 
     lcd.print(ore);
   }
   else
   {
   lcd.print(ore);
   }
   lcd.print(":");
   if ( miniti < 10)
   {
     lcd.print("0"); 
     lcd.print(miniti);
   }
   else
   {
   lcd.print(miniti);
   }
   lcd.print(":");
   lcd.print("00");
      
      if ((hours & 0x0f) > 9) hours =  hours + 6;
      if (hours > 0x23) hours = 0;
      Serial.print("Hours = ");
      if (hours <= 9) Serial.print("0");
      Serial.println(hours, HEX);
    delay(150);
    }

    Wire.beginTransmission(0x68); // activate DS1307
    Wire.write(0); // where to begin
    Wire.write(0x00);          //seconds
    Wire.write(minutes);          //minutes
    Wire.write(0x80 | hours);    //hours (24hr time)
    Wire.write(0x06);  // Day 01-07
    Wire.write(0x01);  // Date 0-31
    Wire.write(0x05);  // month 0-12
    Wire.write(0x09);  // Year 00-99
    Wire.write(0x10); // Control 0x10 produces a 1 HZ square wave on pin 7. 
    Wire.endTransmission();
  
    // converting hexa in zecimal:
    zh = hours / 16;
    uh = hours - 16 * zh ;
    ore = 10 * zh + uh; 
    zm = minutes / 16;
    um = minutes - 16 * zm ;
    miniti = 10 * zm + um; 
    
   /*  for(int i = 20 ; i >0  ; i--) {
     displayNumber01(ore*100+miniti); 
     }
 //  delay(150);
    */

   lcd.setCursor(4, 0);
   if ( ore < 10)
   {
     lcd.print(" "); 
     lcd.print(ore);
   }
   else
   {
   lcd.print(ore);
   }
   lcd.print(":");
   if ( miniti < 10)
   {
     lcd.print("0"); 
     lcd.print(miniti);
   }
   else
   {
   lcd.print(miniti);
   }
   lcd.print(":");
   lcd.print("00");
}
}
   In filmuletul numit ministatie meteo cu DHT22 si ceas cu DS1307 am prezentat aceasta ministatie meteo c senzorul DHT22, partea de ceas este fara butoanele de reglaj:

11 comentarii:

  1. Salut,
    sunt incepator,am comandat o placa de dezvoltare arduino uno pentu ca mi-a placut cubul cu leduri 8x8x8 si am construit acel cub.Acum daca tot am vazut si alte tutoriale arduino,am mai comandat o placa arduino uno (am observat ca este cel mai des utilizata) si as vrea sa construiesc aceasta ministatie meteo (am comandat si senzorul si modulul rtc).Ideea este ca nu am acest display pe care l-ai folosit tu,nu l-am comandat pentruca am un display cu 8 pini + 2(lumina de fundal) TM202TCCWUGWA ma gandeam ca poate ma poti ajuta sa il adaptez.

    RăspundețiȘtergere
    Răspunsuri
    1. fiind incepator, intai "imiti", abia apoi incep teste cu mici modificari... nu cunosc afisajul tau..

      Ștergere
    2. Corect,multumesc pentru raspuns.

      Ștergere
  2. Salut tine,
    L-am mulțumim pentru binele proiectului dumneavoastră, vă urez un cod care poate ajuta la controlul un releu poate deschide la timp pentru față (vreau să fac un sistem de a transforma ouale pentru incubator).
    Îmi pare rău că nu știu limba și de a traduce prin intermediul Google.
    Mulțumesc.

    RăspundețiȘtergere
  3. Hello Friend,
    We thank him for the good of your project, I wish you a code that can help control one relay can open in time for the front (I want to make a system to turn the eggs for the incubator).
    Sorry that I do not know your language and to translate through google.
    Thank you.

    RăspundețiȘtergere
  4. Salut,

    Foarte bun tutorialul! am copiat modelul dvs si merge foarte bine, am o intrebare: se poate adauga un senzor de presiune, un BMP 180(https://ardushop.ro/ro/electronice/259-modul-senzor-presiune-atmosferica-bmp280.html) intreb daca se poate pentru ca comunica tot prin A4 Si A5.
    Sunt incepator, daca se poate ca raspunsul sa fie tot pt nivelul meu.
    Multumesc anticipat,

    RăspundețiȘtergere
    Răspunsuri
    1. sigur ca merge... se poate muta ceasul in stanga si sa pui si presiunea in dreapta... vezi ca am un articol si cu BM180 pe afisaj 1602... dar indicatie e eronata in camera inchisa, trebuie pus afara....

      Ștergere
    2. http://nicuflorica.blogspot.ro/2014/10/senzorul-de-presiune-bmp180.html?m=1

      Ștergere
    3. Salut,

      Multmesc pt sfat, a mers doar ca a trebuit sa folosesc libraria cu i2c.

      Ștergere
    4. normal, altfel nu merge, ca lucreaza pe acel protocol...

      Ștergere