//Kết nối ThingSpeak
#include <WiFi.h>
#include <HTTPClient.h>
//Dùng LCD I2C nên phải khai báo thư viện này
#include <Wire.h> //Để giao tiếp với I2C
#include <LiquidCrystal_I2C.h> //Điều khiển LCD qua I2C
//Tạo một đối tượng tên là lcd
LiquidCrystal_I2C lcd(0x27, 16, 2); //Sẽ có 16 cột và 2 dòng
//Khai báo network
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* apiKey = "5F0ZQ2FMI7NQKEWW";
unsigned long lastSend = 0; // để giới hạn tần suất gửi
//Định nghĩa các chân led
#define LED_PIN_GREEN 2
#define LED_PIN_YELLOW 4
#define LED_PIN_RED 16
//Định nghĩa các chân để đo khoảng cách
#define PIN_TRIG 12
#define PIN_ECHO 14
//Định nghĩa chân để còi buzzer kêu
#define SPEAKER_PIN 17
void sendData(long distance) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "https://api.thingspeak.com/update?api_key=" + String(apiKey) + "&field1=" + String(distance);
http.begin(url);
int httpCode = http.GET();
Serial.println("HTTP code: " + String(httpCode));
if (httpCode > 0) {
Serial.println("ThingSpeak OK");
} else {
Serial.println("ThingSpeak failed");
}
http.end();
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
//Sử dụng LCD
lcd.init();
lcd.backlight();
lcd.setCursor(4, 0);
lcd.print("San sang!");
lcd.clear();
//Đo khoảng cách
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
//Đèn LED
pinMode(LED_PIN_GREEN, OUTPUT);
pinMode(LED_PIN_YELLOW, OUTPUT);
pinMode(LED_PIN_RED, OUTPUT);
//Kết nối Wifi
WiFi.begin(ssid, password, 6);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println("\nWifi connected!");
}
void loop() {
//Đo khoảng cách nè
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
//Tính khoảng cách đo được
//Dùng công thức vật lý để tính.
long duration = pulseIn(PIN_ECHO, HIGH);
long distance = duration / 58;
Serial.print("Khoang cach don vi cm: ");
Serial.println(distance);
//Ghi khoảng cách lên màn LCD I2C
lcd.setCursor(5, 0);
lcd.print("Ready");
lcd.setCursor(0, 1);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print(" cm");
//Bắt đầu viết theo yêu cầu của đề bài
if (distance < 100) {
//Tất cả đèn sáng hết
digitalWrite(LED_PIN_GREEN, HIGH);
digitalWrite(LED_PIN_YELLOW, HIGH);
digitalWrite(LED_PIN_RED, HIGH);
//Chuông kêu
tone(SPEAKER_PIN, 262, 250);
Serial.println("TH1: < 100: Full led sáng, còi kêu");
sendData(distance);
}
else if (distance < 120) {
digitalWrite(LED_PIN_YELLOW, HIGH);
digitalWrite(LED_PIN_GREEN, LOW);
digitalWrite(LED_PIN_RED, LOW);
Serial.println("TH2: >=100 & <120: Only Yewllow sáng");
}
else {
digitalWrite(LED_PIN_GREEN, HIGH);
digitalWrite(LED_PIN_YELLOW, LOW);
digitalWrite(LED_PIN_RED, LOW);
Serial.println("TH3: >= 120: Only Green sáng");
}
delay(10); // this speeds up the simulation
}