Arduino, отображение времени, температуры и влажности - PullRequest
0 голосов
/ 02 мая 2018

Я делаю проект цифровых часов на Arduino Uno. Меня просят сделать цифровые часы, которые отображаются на ЖК-дисплее без использования модуля RTC. Но я хотел бы добавить некоторые вещи, такие как датчик температуры и влажности DHT11. Я хотел отобразить ВРЕМЯ: ЧЧ: ММ: СС в первой строке, а во второй строке я хотел отобразить TEMP (* C): XX.YY, немного подождав, очистив вторую строку (я сделал это с помощью пробела пробел), затем для отображения HUM (%): XX.YY. И так далее. Я просто хотел отложить вторую строку на 2 секунды при переходе от температуры к влажности, чтобы четко видеть значения температуры и влажности. Но это задерживает всю систему, и значение времени также уменьшается на величину времени задержки. Я просто хочу, чтобы часы отображались все время и отображали температуру и влажность отдельно. Это мой код ниже:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <dht.h>
#define dht_apin   2
LiquidCrystal_I2C lcd(0x27, 16, 2);
dht DHT;  
int h=14; //hour
int m=50; //minute
int s=20; //second
int flag; 
int TIME; 
const int hs=8; 
const int ms=9; 
void setup()
{
lcd.begin();
lcd.backlight();
}

void loop() 
{ 
delay(1000);
lcd.setCursor(0,0); 
s=s+1;  
lcd.print("TIME:");
lcd.print(h); 
lcd.print(":"); 
lcd.print(m); 
lcd.print(":"); 
lcd.print(s);     
delay(400);
if(flag==24)flag=0; 
delay(1000); 
lcd.clear(); 
if(s==60){ 
 s=0; 
 m=m+1; 
} 
if(m==60) 
{ 
 m=0; 
 h=h+1; 
 flag=flag+1; 
}        

//Temperature and humidity
DHT.read11(dht_apin);
lcd.setCursor(0,1);
lcd.print("TEMP(*C):");  
lcd.print(DHT.temperature);
delay(2000);
lcd.setCursor(0,1);
lcd.print(' '); 
lcd.setCursor(0,1);
lcd.print("HUM(%):"); 
lcd.print(DHT.humidity); 
delay(1000); 
} 

Спасибо! * * 1004

1 Ответ

0 голосов
/ 03 мая 2018

Как сказал DigitalNinja, delay блокирует все. Если вы хотите, чтобы все работало, вы должны использовать прерывание.

Прерывание останавливает выполнение кода для перехода к определенной функции вне цикла. Это не блокирует часы как delay. Все работает, но вы просто в основном вставляете свою функцию, когда она необходима, основываясь на внешнем событии (подъем на выводе, время истекло ...)

Вы можете использовать библиотеку Timer1 для выполнения действия каждые X секунд. Или создайте свою собственную систему, используя attachInterrupt .

Я взял этот пример на справочных страницах TimerOne и прокомментировал его

void setup()
{
  // Your variables here
  // ...

  Timer1.initialize(500000);         // initialize timer1, and set a 1/2 second period
  Timer1.attachInterrupt(callback);  // attaches callback() as the function to call when Timer is done
}

void callback()
{
  // Do your thing when Timer is elapsed
  // The timer goes automatically to zero. You don't need to reset it.
}

void loop()
{
  // your program here...
  // You never need to call callback() function, it is called WHEN Timer is done
}
...