#include <LiquidCrystal_I2C.h>
#include "DHTesp.h" // Click here to get the library: http://librarymanager/All#DHTesp
#include <Ticker.h>
#include "OneWireESP32.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Streaming.h>
#include "ESPDateTime.h"
#ifdef ESP8266
#include <ESP8266WiFi.h> // esp8266
#else
#include <WiFi.h> // esp32
#endif
//#include "OneWireESP32.h"
int sensorPin = 16;
OneWire oneWire (sensorPin); // creates the OneWire object using a specific pin
DallasTemperature sensor (&oneWire);
#define DHT22_PIN 18
#define DS18B20_PIN 16
#define LED_PIN 2
#define LIGHTA_PIN A0
#define LIGHTD_PIN 19
#define BUZZER_PIN 4
//uint8_t address[8]; // Создаем массив для адреса
//OneWire oneWire(DS18B20_PIN);
//DallasTemperature sensors(&oneWire);
//float currTemp[MaxDevs];
//uint64_t addr[MaxDevs];
TaskHandle_t tempTaskHandle = NULL; /** Task handle for the light value read task */
Ticker tempTicker; /** Ticker for temperature reading */
ComfortState cf; /** Comfort profile */
String str1;
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
DHTesp dht;
const char* months[]={"January", "February", "March", "April", "May", "June" "July", "August", "September", "October", "November", "December"};
const char* monthss[]={"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
const char* dows[]={"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
const char* dowss[]={"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
char fullYear[5]; // Оголошуємо масив для року
byte degreec[] = {0x08,0x14,0x08,0x03,0x04,0x04,0x03,0x00};
byte degree[] = {0x07,0x05,0x07,0x00,0x00,0x00,0x00,0x00};
uint8_t degc[8] = {0x08,0x14,0x08,0x03,0x04,0x04,0x04,0x03};
uint8_t degh[8] = {0x08,0x14,0x08,0x05,0x05,0x07,0x05,0x05};
byte copyright[] = {0x00,0x0E,0x15,0x1B,0x19,0x1B,0x15,0x0E};
// Функція для отримання двоцифрового року
char* getShortYear(char* year) {
return year + 2; // Повертаємо підстрічку, починаючи з третього символу (нумерація з нуля)
}
bool getTemperature() {
// Reading temperature for humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
TempAndHumidity newValues = dht.getTempAndHumidity();
// Check if any reads failed and exit early (to try again).
if (dht.getStatus() != 0) {
Serial.println("DHt22 error status: " + String(dht.getStatusString()));
return false;
}
float heatIndex = dht.computeHeatIndex(newValues.temperature, newValues.humidity);
float dewPoint = dht.computeDewPoint(newValues.temperature, newValues.humidity);
float cr = dht.getComfortRatio(cf, newValues.temperature, newValues.humidity);
String comfortStatus;
switch(cf) {
case Comfort_OK:
comfortStatus = "Comfort_OK";
break;
case Comfort_TooHot:
comfortStatus = "Comfort_TooHot";
break;
case Comfort_TooCold:
comfortStatus = "Comfort_TooCold";
break;
case Comfort_TooDry:
comfortStatus = "Comfort_TooDry";
break;
case Comfort_TooHumid:
comfortStatus = "Comfort_TooHumid";
break;
case Comfort_HotAndHumid:
comfortStatus = "Comfort_HotAndHumid";
break;
case Comfort_HotAndDry:
comfortStatus = "Comfort_HotAndDry";
break;
case Comfort_ColdAndHumid:
comfortStatus = "Comfort_ColdAndHumid";
break;
case Comfort_ColdAndDry:
comfortStatus = "Comfort_ColdAndDry";
break;
default:
comfortStatus = "Unknown:";
break;
};
str1=String(comfortStatus);
str1.replace("Comfort_","");
comfortStatus=str1.c_str();
lcd.setCursor(0,1);
//Serial.println(" T:" + String(newValues.temperature) + " H:" + String(newValues.humidity) + " I:" + String(heatIndex) + " D:" + String(dewPoint) + " " + comfortStatus);
lcd.print(" T:" + String(newValues.temperature));
lcd.write(0);
lcd.print(" H:" + String(newValues.humidity));
lcd.write(3);
lcd.setCursor(3,2);
lcd.print(comfortStatus);
return true;
}
void myGetDateTime() {
DateTimeParts p = DateTime.getParts();
/* Serial.printf("%04d/%02d/%02d %02d:%02d:%02d %ld (%s)\n", p.getYear(),
p.getMonth(), p.getMonthDay(), p.getHours(), p.getMinutes(),
p.getSeconds(), p.getTime(), p.getTimeZone());
*/
itoa(p.getYear(), fullYear, 10); // Перетворюємо ціле число в рядок і записуємо його у fullYear
lcd.setCursor(0,0);
lcd << _FMT("%, % %'% %:%",
dowss[p.getWeekDay()], _WIDTHZ(p.getMonthDay(),2), monthss[p.getMonth()], _WIDTH(atoi(getShortYear(fullYear)),2),
_WIDTHZ(p.getHours(),2), _WIDTHZ(p.getMinutes(), 2)) << endl;
}
void setup()
{
Serial.begin(115200);
Serial.println("\ntest capture DTH22");
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN,OUTPUT);
tone(BUZZER_PIN,300,300);
lcd.init();
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Weather station");
lcd.setCursor(2,1);
lcd.write(4);
lcd.print("by Arest, 2024");
// lcd.setCursor(0,2);
dht.setup(DHT22_PIN, DHTesp::DHT22);
delay(2000);
lcd.setCursor(0,1);
lcd.print(F(" "));
lcd.setCursor(0,2);
lcd.print(F(" "));
lcd.createChar(0, degreec);
lcd.createChar(1, degree);
lcd.createChar(2, degc);
lcd.createChar(3, degh);
lcd.createChar(4, copyright);
sensor.begin ();
WiFi.begin("Wokwi-GUEST", "");
while (WiFi.status() != WL_CONNECTED) delay(100);
Serial.println("Connected");
DateTime.setServer("0.ua.pool.ntp.org");
DateTime.setTimeZone("EET");
DateTime.begin();
if (!DateTime.isTimeValid()) {
Serial.println(F("Failed to get time from server."));
} else {
Serial.printf("Date Now is %s\n", DateTime.toISOString().c_str());
Serial.printf("Timestamp is %ld\n", DateTime.now());
}
myGetDateTime();
/*
OneWire32 ds(DS18B20_PIN, 0, 1, 0);
uint64_t addr[MaxDevs];
uint8_t devices = ds.search(addr, MaxDevs);
Serial.print("Devices: "); Serial.print(devices);
for (uint8_t i = 0; i < devices; i += 1) {
Serial.printf("%d: 0x%llx,\n", i, addr[i]);
char buf[20]; snprintf( buf, 20, "0x%llx,", addr[i] ); Serial.println(buf);
}
*/
}
void loop() {
myGetDateTime();
getTemperature();
sensor.requestTemperatures ();
float temp = sensor.getTempCByIndex (0);
lcd.setCursor(0,3)
// lcd.print ("Temperature: ");
lcd.print (temp);
lcd.write(0);
// Serial.println ("ºC");
// delay (3000);
/*
sensors.requestTemperatures(); // Send the command to get temperatures
float tempC = sensors.getTempCByIndex(0);
lcd.setCursor(0,3);
if (tempC != DEVICE_DISCONNECTED_C) {
lcd.print(tempC);
} else {
lcd.print("***");
}
*/
int lightD=digitalRead(LIGHTD_PIN);
int lightA=analogRead(LIGHTA_PIN);
lcd.setCursor(8,3);
lcd.print(lightD);
lcd.setCursor(14,3);
lcd.print(lightA);
lcd.setCursor(19,1);
//lcd.cursor();
lcd.blink();
delay(2000); //Collecting period should be : >1.7 second
lcd.noBlink();
// lcd.noCursor();
}