الخميس، 23 أبريل 2020

عمل ساعة رقمية مع تحسس الحرارة والرطوبة باستخدام اردوينو نانو



عمل ساعة رقمية مع تحسس الحرارة والرطوبة باستخدام اردوينو نانو

Arduino Nano 7SEG clock (whitout RTC)+ temp. + humid

المكونات واللوازم

أحتاج إلى التحكم في الرطوبة ودرجة الحرارة لبعض النباتات آكلة اللحوم في الدفيئة ، وهذا يتطلب درجات حرارة ورطوبة ثابتة طوال العام ، بالإضافة إلى أنني أدخلت ساعة أثبتت أنها مفيدة جدًا عندما أقضي الكثير من الوقت في الدفيئة.

لقد طلبت نموذج RTC وأنا في انتظار وصوله.


بمجرد توفره ، سأقوم بتعديل وتحديث البرنامج لإضافة RTC أكثر دقة.


كود البرمجة


#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <SevSeg.h>
DHT dht(A2,DHT22);
SevSeg Display; 
char text[10][6]; 
int i = 0;
unsigned long timer;

//----------------------SET OROLOGIO
const unsigned long period = 1000; //durata 1 sec.
const unsigned long led_period = 500; //durata lampeggio :
unsigned long startMillis;
unsigned long led_startMillis;
unsigned long currentMillis;
unsigned long led_currentMillis;
const int hrs_btn = A0; //set ore
const int min_btn = A1; //set minuti
const int ledPin = 13; //pin lampeggio :
int Hrs = 0;
int Min = 0;
int Sec = 0;
int Time = 0000;
int ledState = HIGH;

void setup() {
  pinMode(hrs_btn, INPUT_PULLUP);
  pinMode(min_btn, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  byte numDigits = 4;
  byte digitPins[] = {12, 10, 9, 11};
  //byte digitPins[] = {11, 9, 10, 12};
  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8,0};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_CATHODE; // See README.md for options
  bool updateWithDelays = false; // Default 'false' is Recommended
  bool leadingZeros = true; // Use 'true' if you'd like to keep the leading zeros
  bool disableDecPoint = true; // Use 'true' if your decimal point doesn't exist or isn't connected
  Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
  updateWithDelays, leadingZeros, disableDecPoint);
  Display.setBrightness(100);
  dht.begin();
  pinMode(ledPin, OUTPUT); // PIN 13 lampeggio :
  pinMode(A2, INPUT); // input DHT22
 }
  
  void loop() 
{    
  char mychar[ ] = "ORA";
  float hu = dht.readHumidity();
  float t = dht.readTemperature();
  float orario = Time;
   
      
      
      String e = String (mychar);           //memorizza mychar
      String f = e.substring (0,4);   //memorizza cifra a 4 digit 
      f.toCharArray(text[1],5);       //visualizza come 1 (ARRAY)
      
      
      orario=orario*10;
      String c = String (orario);        //memorizza ora
      String d = c.substring (0,4);      //memorizza cifra a 4 digit 
       d.toCharArray(text[2],5);        //visualizza come 2 (ARRAY)
      
               
      t=t*10;
      String k = String(t);             //memorizza t
      String r = k.substring (0,3)+"*"; //memorizza cifra a 3 digit + C
      r.toCharArray(text[3],5);       //visualizza come 3 (ARRAY)
      
      
      hu=hu*10;
      String A = String(hu);           //memorizza hu
      String B = A.substring(0,3)+"h"; //memorizza cifra a 3 digit
      B.toCharArray(text[4],5);        // visualizza come 4 (ARRAY)
      
       switch (i)
{
  case 1:
      digitalWrite(ledPin, LOW); //pin 13 on  Humid
       break;
   case 2:
      digitalWrite(ledPin, HIGH); //pin 13 off  ORA
       break;
   case 3:
      digitalWrite(ledPin, LOW);  //orario
      Display.setNumber(Time);
      if (digitalRead(hrs_btn) == LOW){goto X;}
        if (digitalRead(min_btn) == LOW){goto X;}
        break;
   case 4:
      digitalWrite(ledPin, LOW);  //gradi
       break;
}
     if (millis() > (timer + 6000)) //tempo di visualizzazione
     {
    switch(i);
    Display.setChars(text[i]);
    i++;
    if (i >= 5) i = 1; // (ARRAY)conta fino a 5 poi torna a 1
    timer = millis();}
    
    //--------------------------------OROLOGIO

  X:      currentMillis = millis();
  if (currentMillis - startMillis >= period)
  {
    Sec = Sec + 1;
    startMillis = currentMillis;
  }
  led_currentMillis = millis();
  if (led_currentMillis - led_startMillis >= led_period)
  {  led_startMillis = led_currentMillis;
    
    if (ledState == LOW) {   ledState = HIGH;
      
      if (digitalRead(hrs_btn) == LOW) //avanzamento ore
      {  Hrs = Hrs + 1; }
      
      if (digitalRead(min_btn) == LOW) //avanzamento min
      {  Min = Min + 1;  Sec = 0; }
    }
    else
    { ledState = LOW; }
    digitalWrite(ledPin, ledState);
  }
  if (Sec == 60)
  {
    Sec = 0;
    Min = Min + 1;
  }
  if (Min == 60)
  {
    Min = 0;
    Hrs = Hrs + 1;
  }
  if (Hrs == 24) //12/24 ore
  {
    Hrs = 0;
  }
  Time = Hrs * 100 + Min;
  
   Display.refreshDisplay();
}


Clock without rtc 529x1024 zmh10k0uq1

ليست هناك تعليقات:

إرسال تعليق