#include "ThingSpeak.h" //khai báo thư viện thingspeak
#include <WiFi.h> //khai báo thư viện wifi
#include <WiFiClient.h>
#include <OneWire.h> //giao tiếp onewire
#include <DallasTemperature.h> //thư viện lấy giá trị ds18b20
#include <DHT.h> //khai bao cac thu vien su dung
const float BETA = 3950; //khai bao bien BETA tinh toan NTC
#define WIFI_SSID "Wokwi-GUEST" // Thay đổi tên wifi của bạn
#define WIFI_PASSWORD "" // Thay đổi password wifi của bạn
#define ONE_WIRE_BUS 4 //chân kết nối với ds18b20
OneWire oneWire(ONE_WIRE_BUS); //kết nối với function onewire
DallasTemperature sensors(&oneWire); //kết nối địa chỉ onewire đến function dallas
WiFiClient client; //đặt tên function
#define DHTPIN 15 // dinh nghia chan dht o gpio 15 (adc2)
#define DHTTYPE DHT22 // dinh nghia loai DHT se su dung
DHT dht(DHTPIN, DHTTYPE); //dat ten va dua bien vao ham DHT
#define led 14 //dinh nghia chan led o gpio 26
unsigned long myChannelNumber = 2184893; //mã định danh kênh
const char * myWriteAPIKey = "Q8T9B9O367D1VQCQ"; //mã API ghi lên sever thingspeak
const char * myReadAPIKey = "49KQM4INTA7SQL4V"; //mã API để đọc dữ liệu từ sever
// Hàm chớp LED
unsigned long blinkTime = 0;
void blinkLED(void *parameter) {
while (true) {
if(blinkTime>0)
{
digitalWrite(led, LOW); // Bật LED
delay(blinkTime);
digitalWrite(led, HIGH); // Tắt LED
delay(blinkTime);
}
else digitalWrite(led, LOW); // Bật LED
}
}
void setup() {
Serial.begin(9600); //mở cổng giao tiếp
delay(1000);
analogReadResolution(10); //dat do phan giai adc 10 bit
sensors.begin();
dht.begin(); // khoi dong ham dht
pinMode(led, OUTPUT); //cau hinh ngo ra cho led
// Tạo một luồng (task) để chớp LED
xTaskCreatePinnedToCore(
blinkLED, // Hàm chớp LED
"BlinkLEDTask", // Tên của luồng
4096, // Kích thước ngăn xếp luồng
NULL, // Tham số truyền vào cho luồng (không sử dụng trong ví dụ này)
1, // Ưu tiên luồng
NULL, // Đối tượng xử lý luồng (không sử dụng trong ví dụ này)
1 // Core mà luồng sẽ được chạy (0 hoặc 1)
);
WiFi.begin (WIFI_SSID, WIFI_PASSWORD); //khởi tạo wifi
Serial.print("Dang ket noi"); //kết nối
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
pinMode(14, OUTPUT); //cấu hình chân led ngõ ra
Serial.println ("");
Serial.println ("Da ket noi WiFi!");
Serial.println(WiFi.localIP()); //địa chỉ IP
WiFi.mode(WIFI_STA); //set MCU node la mot tram phat wifi
ThingSpeak.begin(client); //khoi tao giao tiep với thingspeak
}
void loop() {
sensors.requestTemperatures(); //yêu cầu giá trị nhiệt độ
float t = sensors.getTempCByIndex(0); //đọc giá trị nhiệt độ
float temperature = dht.readTemperature(); // đọc ADC DHT.
float humidity = dht.readHumidity();// đọc ADC DHT.
int analogValue = analogRead(34);// đọc ADC NTC.
Serial.print("Nhiet do ds18b20:");
Serial.println(t);
Serial.print("Nhiet do dht22:");
Serial.println(temperature);
Serial.print("Do am dht22:");
Serial.println(humidity);
ThingSpeak.setField(1, t);
ThingSpeak.setField(2, temperature);
ThingSpeak.setField(3, humidity);
if(temperature>=37 && temperature<=45)
{
blinkTime=1000;
}
else if (temperature>45)
{
blinkTime=250;
}
else blinkTime=0;
int statusCode = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); //giao tiếp trên giao thức HTTP với các mã trạng thái
delay(100);
//int statusCode1 = ThingSpeak.readMultipleFields(myChannelNumber,myReadAPIKey); //có thể dùng để nhận dữ liệu về
if(statusCode == 200){ //mã trạng thái trả về giá 200 là gửi gói tin thành công
Serial.println("Channel update successful.");
}
//if(statusCode1 == 200) //nhận dữ liệu từ sever và in ra
//{
// Fetch the stored data
//int windDir = ThingSpeak.getFieldAsInt(1); // Field 1
//float windSpeed = ThingSpeak.getFieldAsFloat(2); // Field 2
//Serial.print(windDir);
// Serial.println(windSpeed);
//Serial.println("Read successful");
// }
delay(200);
}