ชื่อโปรเจกต์: เครื่องเพิ่มความชื้นในอากาศแบบ DIY พร้อมไฟแบ็คไลท์ควบคุมด้วย Alexa
Intro
ที่กรุงเคียฟ ประเทศยูเครน ฤดูหนาวอากาศหนาวจัดมาก ระบบทำความร้อนส่วนกลางจึงจำเป็นอย่างยิ่งในการรักษาอุณหภูมิห้องให้อบอุ่น แต่นอกจากการทำให้บ้านของฉันอุ่นขึ้นแล้ว ระบบทำความร้อนส่วนกลางยังทำให้อากาศในอพาร์ตเมนต์ของฉันแห้งอีกด้วย อากาศที่แห้งทำให้โพรงจมูกของฉันแห้งผากและทำให้ผ่านพ้นฤดูหนาวไปได้โดยไม่เจ็บป่วยเป็นเรื่องยาก ด้วยความเบื่อหน่ายกับการเจ็บป่วย ฉันจึงตัดสินใจจัดการกับอากาศแห้งในบ้านของฉันในปีนี้ แม้จะมีเครื่องเพิ่มความชื้นมากมายวางขายตามร้านค้า แต่ฉันก็ตัดสินใจว่าการสร้างเครื่องเพิ่มความชื้นอัจฉริยะที่ควบคุมด้วย Alexa สำหรับตัวเองจะเป็นความท้าทายที่น่าสนใจ
Reverse Engineering ของ Numidifier


ในการควบคุมโมดูลเครื่องเพิ่มความชื้น เราจำเป็นต้องรู้วิธีเปิดและปิด และวิธีรับสถานะปัจจุบันของเครื่องเพิ่มความชื้น (ว่าเปิดหรือปิดอยู่)

ในภาพ เราจะเห็นด้านล่างของแผงวงจรเครื่องเพิ่มความชื้น มีคอนเนกเตอร์จ่ายไฟและปุ่มกด จากคู่มือของโมดูล ฉันรู้ว่าหน้าสัมผัสภายในของคอนเนกเตอร์จ่ายไฟแบบกลมคือขั้วบวกของไฟเลี้ยง และหน้าสัมผัสภายนอกคือกราวด์ โมดูลนี้ถูกควบคุมโดยการกดปุ่ม ในภาพเราจะเห็นว่าปุ่มมี 4 พิน: สองพินเชื่อมต่อกับกราวด์ หนึ่งพินไม่ได้เชื่อมต่อ และอีกหนึ่งพินเชื่อมต่อกับเส้นทางที่ต่อไปยังพินที่ 4 ของชิปสี่เหลี่ยมสีดำ ในการสลับสถานะการทำงานของโมดูล เราจำเป็นต้องช็อตพินนี้กับกราวด์ ฉันค้นพบว่าจุดใดบนแผงวงจรมีการเปลี่ยนแปลงแรงดันไฟฟ้าเมื่อโมดูลเปิดหรือปิด โดยการกดปุ่มซ้ำๆ และตรวจสอบแรงดันไฟฟ้าที่จุดต่างๆ บนแผงวงจรแบบสุ่ม พินที่ 5 ของชิปสี่เหลี่ยมสีดำจะมีค่า 0V เมื่อเครื่องเพิ่มความชื้นปิดอยู่ และ 2.5V เมื่อเปิดอยู่ ดังนั้น สถานะของเครื่องเพิ่มความชื้นสามารถทราบได้โดยการอ่านสถานะบนพินนี้

ตอนนี้เรามีเกือบทุกอย่างที่จำเป็นในการควบคุมโมดูลนี้แล้ว พินที่ห้าของชิปดูเหมือนจะเป็นเอาต์พุต ฉันวัดความถี่บนพินนี้ได้ประมาณ 110 kHz ไม่สะดวกที่จะวัดสัญญาณโมดูเลตแบบนี้ด้วย Arduino เนื่องจากมันสามารถเป็น HIGH หรือ LOW (ได้ตลอดเวลา) ดังนั้นฉันจึงตัดสินใจใช้วงจรอินทิเกรเตอร์แบบพาสซีฟเพื่อแปลงสัญญาณ PWM จากโมดูลเป็นสัญญาณ DC ที่ง่ายต่อการอ่านด้วย Arduino

ไฟ LED
เพื่อให้เครื่องเพิ่มความชื้นดูสวยงามยิ่งขึ้น ฉันจึงตัดสินใจเพิ่มไฟแบ็คไลท์เข้าไป ฉันเลือก WS2812 RGB LEDs สำหรับวัตถุประสงค์นี้

มีไลบรารีจำนวนมากให้ใช้งานสำหรับการควบคุม LED เหล่านี้ และเชื่อมต่อได้ง่ายโดยใช้สายไฟเพียงไม่กี่เส้น
แผนผังวงจร

การเชื่อมต่อระหว่างส่วนประกอบทั้งหมดแสดงอยู่ในแผนผังด้านบน ฉันบัดกรีสายไฟเข้ากับพิน GND, +5V, Button และ State และเสียบเข้ากับ breadboard องค์ประกอบที่เหลือถูกประกอบบน breadboard ฉันเชื่อมต่อสายไฟเข้ากับแหล่งจ่ายไฟของ breadboard และวางทั้งหมดไว้ใต้ฝาเครื่องเพิ่มความชื้น
โค้ด
อุปกรณ์เชื่อมต่ออินเทอร์เน็ตโดยใช้โปรโตคอล MQTT ฉันใช้ test.mosquito.org สำหรับการสาธิต เพราะไม่ต้องมีการยืนยันตัวตนและไม่ต้องตั้งค่าเพิ่มเติม หลังจากที่อุปกรณ์เชื่อมต่อกับเครือข่าย ซึ่งคุณอาจระบุโดยตรงในโค้ดของสเก็ตช์ มันจะเชื่อมต่อกับ broker และสมัครรับหัวข้อ (topic) ต่อไปนี้:
"humidifier/on" - เพื่อรับคำสั่ง 'เปิด'
"humidifier/off" - เพื่อรับคำสั่ง 'ปิด'
"humidifier/reportState" - เพื่อรับคำสั่งรายงานสถานะ (เปิด/ปิด)
"humidifier/reportColorState" - เพื่อรับคำสั่งรายงานสถานะไฟแบ็คไลท์
"humidifier/color" - เพื่อรับคำสั่งเปลี่ยนสีไฟแบ็คไลท์
เมื่อใดก็ตามที่อุปกรณ์ได้รับข้อความเหล่านี้ มันจะดำเนินการตามคำสั่งที่เกี่ยวข้องและส่งข้อความกลับพร้อมข้อมูลสถานะของอุปกรณ์
#include <SoftwareReset.h>
// เลือกรุ่นโมเด็มของคุณ:
#define TINY_GSM_MODEM_ESP8266
// กำหนดพินสำหรับบอร์ดของคุณ
#define LED_STRIP_PIN 5
#define TOGGLE_PIN 4
#define STATE_PIN 2
#define ESP_ENABLE_PIN 6
#define LED_NUM 8
uint32_t color;
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_NUM, LED_STRIP_PIN, NEO_GRB + NEO_KHZ800);
#include <TinyGsmClient.h>
#include <PubSubClient.h>
const char ssid[] = "ssid";
const char pass[] = "password";
//// ใช้ Hardware Serial บน Mega, Leonardo, Micro
#define SerialAT Serial1
TinyGsm modem(SerialAT);
TinyGsmClient client(modem);
PubSubClient mqtt(client);
// ตั้งค่า broker
const char* broker = "test.mosquitto.org";
const char* mqttDeviceId = "yourDeviceId";
const char* mqttUsername = "";
const char* mqttPass = "";
// ตั้งค่า topic
const char* topicTurnOn = "humidifier/on";
const char* topicTurnOff = "humidifier/off";
const char* topicReportState = "humidifier/reportState";
const char* topicStateReport = "humidifier/stateReport";
const char* topicReportColorState = "humidifier/reportColorState";
const char* topicSetColor = "humidifier/color";
const char* topicColorStateReport = "humidifier/colorStateReport";
long lastReconnectAttempt = 0;
// กำหนดสีของ strip หรือ WS2812 โมดูลใดๆ
void setStripColor(uint32_t c) {
// เติมสีทีละจุดด้วยสีที่กำหนด
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
}
strip.show();
}
// เปิดหรือปิดเครื่องเพิ่มความชื้น
void ToggleHumidifier() {
digitalWrite(TOGGLE_PIN, LOW);
delay(100);
digitalWrite(TOGGLE_PIN, HIGH);
}
void setup() {
pinMode(TOGGLE_PIN, OUTPUT);
digitalWrite(TOGGLE_PIN, HIGH);
pinMode(ESP_ENABLE_PIN, OUTPUT);
digitalWrite(ESP_ENABLE_PIN, HIGH);