#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <HTTPClient.h>
#include <WiFi.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// OLED物件初始化
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// 修改成上述寄到登入郵箱的 Token權杖號碼
#define LINE_TOKEN "eET6NcHj1Q4jmKBjoXzG7hfdlokJntRA6xyd24YYZRw"
// DHT感測器設定
#define DHT_PIN 16
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
HTTPClient http;
// 定義笑臉位圖
const uint8_t PROGMEM smileyBitmap[] = {
B00111100,
B01000010,
B10100101,
B10000001,
B10100101,
B10011001,
B01000010,
B00111100
};
//led 接腳
const int pinR = 33;
const int pinG = 25;
const int pinB = 32;
void setup() {
Serial.begin(115200);
{ //模擬wifi,內建的wifi
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
}
// 初始化 OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;)
;
}
// 初始化 DHT 感測器
dht.begin();
display.clearDisplay();
display.display();
//設定led接腳出輸
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
}
void loop() {
// 讀取溫濕度數據
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// 顯示溫濕度數據
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(5, 0);
display.print("Temperature: ");
display.print(temperature, 2);
display.print("C");
display.setCursor(5, 10);
display.print("Humidity: ");
display.print(humidity, 2);
display.print("%");
// 顯示舒適度描述
display.setCursor(5, 30);
display.print("Comfort Level: ");
display.println(getComfortLevelDescription(temperature));
// 顯示笑臉位圖
display.drawBitmap(110, 10, smileyBitmap, 8, 8, SSD1306_WHITE);
display.display();
//發送給line通知
String temp = String(temperature);
String humi = String(humidity);
String message1 = getComfortLevelDescription(temperature);
String message = ("temperature:"+temp+"\nhumidity:"+humi+"\n"+message1);
sendLineNotify(message);
delay(1000);
}
void sendLineNotify(String message) {//自訂函數傳送line通知
http.begin("https://notify-api.line.me/api/notify");
http.addHeader("Authorization", "Bearer " + String(LINE_TOKEN));
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpCode = http.POST("message=\n" + message);
if (httpCode > 0) {
String response = http.getString();
Serial.print("HTTP Response code: ");
Serial.println(httpCode);
Serial.print("Server response: ");
Serial.println(response);
if (httpCode == 200){ // 判斷訊息是否成功傳送code200為發送成功
Serial.println("line通知發送成功");
}
} else {
Serial.println("Error sending Line Notify message");
} http.end();
}
// 根據溫度返回舒適度描述和led偵測
String getComfortLevelDescription(float temperature) {
if (temperature > 41.0) {
analogWrite(pinR, 0);
analogWrite(pinG, 128);
analogWrite(pinB, 50);
return "Very Hot, Extremely Uncomfortable";
} else if (temperature >= 35.0) {
analogWrite(pinR, 0);
analogWrite(pinG, 0);
analogWrite(pinB, 254);
return "Hot, Very Uncomfortable";
} else if (temperature >= 29.0) {
analogWrite(pinR, 60);
analogWrite(pinG, 60);
analogWrite(pinB, 512);
return "Warm, Uncomfortable";
} else if (temperature >= 23.0) {
analogWrite(pinR, 254);
analogWrite(pinG, 0);
analogWrite(pinB, 1024);
return "Warm, Comfortable";
} else if (temperature >= 18.0) {
analogWrite(pinR, 254);
analogWrite(pinG, 0);
analogWrite(pinB, 0);
return "Cool, Comfortable";
} else if (temperature >= 13.0) {
analogWrite(pinR, 125);
analogWrite(pinG, 254);
analogWrite(pinB, 0);
return "Cool, Uncomfortable";
} else if (temperature >= 8.0) {
analogWrite(pinR, 0);
analogWrite(pinG, 254);
analogWrite(pinB, 0);
return "Cold, Very Uncomfortable";
} else {
analogWrite(pinR, 0);
analogWrite(pinG, 254);
analogWrite(pinB, 0);
return "Cold, Extremely Uncomfortable";
}
}