ทดลอง ESP32 วัดค่าจาก DHT22 ส่งขึ้นแพลตฟอร์ม
วันนี้นำเอาโค้ดสำหรับ ESP32 มาให้ดาวน์โหลดไปทดสอบกัน
เป็นตัวอย่างสำหรับการ ใช้งาน กับ Sensor DHT22 และส่งข้อมูลไปเก็บยังแพลตฟอร์ม IOT ของเรา
การติดตั้ง Sensor เข้ากับ ESP32 ใช้สัญญาณต่อเข้ากับ GPIO 17 และบวก ที่ 3V3 ลบ ที่ GND ตามปกติ
ส่วนของโค้ด ก็ตามด้านล่างนี่เลย
Library ที่ใช้ในกรณีนี้คือ DHTesp.h และ WiFi.h
Host ที่อ้างอิงถึง คือ otrixiot.com
ตัวแปรสำหรับการส่งค่า อุณหภูมิคือ data1 = temp_0 ที่ได้มาจาก function ของ DHT และ data2 = humid_0
การทดสอบผ่านไปได้อย่างฉลุยครับ
/* * This sketch sends data via HTTP GET requests to data.sparkfun.com service. * * You need to get streamId and privateKey at data.sparkfun.com and paste them * below. Or just customize this script to talk to other HTTP servers. * Set board NodeMCU-32S pr ESP32 Dev Module * Set Programmer AVRISP mkll */ //===== DHT setting #include "DHTesp.h" #include "Ticker.h" #ifndef ESP32 #pragma message(THIS EXAMPLE IS FOR ESP32 ONLY!) #error Select ESP32 board. #endif //========= #include <WiFi.h> //====== DHTesp dht; void tempTask(void *pvParameters); bool getTemperature(); void triggerGetTemp(); /** Task handle for the light value read task */ TaskHandle_t tempTaskHandle = NULL; /** Ticker for temperature reading */ Ticker tempTicker; /** Comfort profile */ ComfortState cf; /** Flag if task should run */ bool tasksEnabled = false; /** Pin number for DHT11 data pin */ int dhtPin = 17; /** * initTemp * Setup DHT library * Setup task and timer for repeated measurement * @return bool * true if task and timer are started * false if task or timer couldn't be started */ //==== const char* ssid = "Arsenae_2.4G"; const char* password = "kb075699212"; //const char* ssid = "dlink_DWR-932C_0C4E"; //const char* password = "gkyVD35784"; const char* host = "otrixiot.com"; const char* code = "ESP32-002"; float temp_0 = 0; float humid_0 = 0; float vHumidity = 0; float vTemperature = 0; float data1=55; float data2=33; float data3=33; float data4=33; float data5=33; float data6=33; float data7=33; float data8=33; float data9=33; float data10=33; float data11=33; float data12=33; float data13=33; float data14=33; float data15=33; float data16=33; float data17=33; float data18=33; float data19=33; float data20=33; /* void setup_Sensor_Box_Temperature() { dht.begin(); } */ /// === bool initTemp() { byte resultValue = 0; // Initialize temperature sensor dht.setup(dhtPin, DHTesp::DHT22); Serial.println("DHT initiated"); // Start task to get temperature xTaskCreatePinnedToCore( tempTask, /* Function to implement the task */ "tempTask ", /* Name of the task */ 4000, /* Stack size in words */ NULL, /* Task input parameter */ 5, /* Priority of the task */ &tempTaskHandle, /* Task handle. */ 1); /* Core where the task should run */ if (tempTaskHandle == NULL) { Serial.println("Failed to start task for temperature update"); return false; } else { // Start update of environment data every 20 seconds tempTicker.attach(20, triggerGetTemp); } return true; } /** * triggerGetTemp * Sets flag dhtUpdated to true for handling in loop() * called by Ticker getTempTimer */ void triggerGetTemp() { if (tempTaskHandle != NULL) { xTaskResumeFromISR(tempTaskHandle); } } /** * Task to reads temperature from DHT11 sensor * @param pvParameters * pointer to task parameters */ void tempTask(void *pvParameters) { Serial.println("tempTask loop started"); while (1) // tempTask loop { if (tasksEnabled) { // Get temperature values getTemperature(); } // Got sleep again vTaskSuspend(NULL); } } /** * getTemperature * Reads temperature from DHT11 sensor * @return bool * true if temperature could be aquired * false if aquisition failed */ 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("DHT 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; }; temp_0 = newValues.temperature; humid_0 = newValues.humidity; // Serial.println(" T:" + String(newValues.temperature) + " H:" + String(newValues.humidity) + " I:" + String(heatIndex) + " D:" + String(dewPoint) + " " + comfortStatus); return true; } void DHT22setup() { Serial.begin(115200); Serial.println(); Serial.println("DHT ESP32 example with tasks"); initTemp(); // Signal end of setup() to tasks tasksEnabled = true; } // Main setup ======== void setup() { Serial.begin(115200); DHT22setup(); delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } int value = 0; void loop() { delay(5000); DHT22_loop(); // scanSensor_Box_Temperature(); //data1 = vTemperature; ++value; data1 = temp_0; data2 = humid_0; Serial.print("connecting to "); Serial.println(host); // Use WiFiClient class to create TCP connections WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } // We now create a URI for the request String url = "/api/insertData?device_id=" + String(65)+"&code="+String(code)+"&data1=" +String(data1) +"&data2=" + String(data2)+"&data3=" +String(data3)+"&data4=" +String(data4)+"&data5=" +String(data5) +"&data6=" +String(data6)+"&data7=" +String(data7)+"&data8=" +String(data8)+"&data9=" +String(data9) +"&data10=" +String(data10)+"&data11=" +String(data11)+"&data12=" +String(data12)+"&data13=" +String(data13) +"&data14=" +String(data14)+"&data15=" +String(data15)+"&data16=" +String(data16)+"&data17=" +String(data17) +"&data18=" +String(data18)+"&data19=" +String(data19)+"&data20=" +String(data20); Serial.print("Requesting URL: "); Serial.println(url); // This will send the request to the server client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { Serial.println(">>> Client Timeout !"); client.stop(); return; } } // Read all the lines of the reply from server and print them to Serial while(client.available()) { String line = client.readStringUntil('\r'); //Serial.print(line); } Serial.println(); Serial.println("closing connection"); delay(50000); } void DHT22_loop() { if (!tasksEnabled) { // Wait 2 seconds to let system settle down delay(2000); // Enable task that will read values from the DHT sensor tasksEnabled = true; if (tempTaskHandle != NULL) { vTaskResume(tempTaskHandle); } } //yield(); }
แถมแหล่งอ้างอิงสำหรับการศึกษา ESP32 ตามนี้เลยครับ https://microcontrollerslab.com/esp32-pinout-use-gpio-pins/