สวัสดีครับทุกท่าน ช่วงนี้ไม่ค่อยได้เข้ามาเขียนบทความเลยเพราะยุ่งมากๆ แต่ครั้งนี้พอดีว่ามีพี่ใจดีให้ตัววัดฝุ่นผมมาเล่นแบบฟรีๆ ผมก็เลยมีไฟในการเขียนบทความนี้ขึ้นมาครับ
ขอกราบขอบพระคุณมา ณ ที่นี้นะครับ
บทความนี้จะเน้นเรื่องการทำลูกเดียวนะครับ ด้านทฤษฏีต่างๆ ดูบทความอื่นประกอบได้ผมจะแนบไว้ท้ายบทความนะครับ
ซื้อมานะครับ ก็มีสายไฟห้าเส้น ต่อดังนี้ครับ
สังเกตุรูปดีๆครับ จะได้เรียงลำดับสายไฟถูก
โหลด lib ครับ จะมีสองไฟล์ แตกไฟล์แล้วนำไปวางไว้ที่โฟลเดอร์ Document/Arduino/librarie/ แบบนี้นะครับ ปิดเปิดโปรแกรมอดุยโน่รอบนึงครับ
ดาวน์โหลด
http://www.mediafire.com/file/ncd0cc5fc966cpc/lib.zip/file
ขั้นตอนต่อไปเป็นการเตรียมพร้อมทางด้านของ Anto ถ้ายังไม่รู้จักให้เข้าไปอ่านบทความนี้ก่อนนะครับ ส่วนใครเข้าใจแล้วก็ข้ามไปได้เลย
บทความ: https://antoiot.gitbooks.io/th-document/content/
คราวนี้ถ้าเราต้องการส่งค่าขึ้น Anto และ OpenAQI เราต้องไปเพิ่ม things ก่อนครับตั้งชื่อว่า “openaqi” แล้วสร้าง channel (type float) ชื่อว่า pm25 ครับ และสุดท้ายเราก็ต้องสร้าง key ขึ้นมาครับติ้กทั้ง update และ read ครับ
เมื่อเตรียมพร้อมเสร็จแล้ว กลับไปที่โปรแกรม Arduino ครับ กด new sketch แล้ว copy code ไปวางครับ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
#include <Arduino.h> #include <AntoIO.h> #include <M5Stack.h> #include "sps30.h" #include "hw_i2c/sample-implementations/arduino/sensirion_hw_i2c_implementation.cpp" const char *ssid = "SSID"; const char *pass = "PASSWORD"; const char *uuid = "USERNAME"; const char *thing = "openaqi"; const char *token = "KEY"; AntoIO anto(uuid, token, thing); struct sps30_measurement measurement; s16 ret; //time unsigned long previousMillis = 0; const long interval = 5000; //pmvalue float pmValue; void setup() { M5.begin(true, true, true); display(); printOnlineStatus(0); while (!anto.wifi.begin(ssid, pass)); Serial.println("\nConnected, trying to connect to broker..."); while (!anto.mqtt.connect(uuid, token, true)); Serial.println("\nConnected"); while (sps30_probe() != 0) { Serial.write("probe failed\n"); delay(1000); } if (sps30_start_measurement() != 0) { Serial.write("error starting measurement\n"); } printOnlineStatus(1); delay(2000); } void loop() { anto.mqtt.loop(); unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; readPM(); checkwificonnect(); printDisplay(pmValue); } // sps30_stop_measurement(); } void readPM(){ ret = sps30_read_measurement(&measurement); if (ret < 0) { Serial.write("read measurement failed\n"); pmValue = 999; } else { pmValue = measurement.mc_2p5; Serial.write("PM 2.5: "); Serial.println(pmValue,DEC); } } void checkwificonnect(){ if(WiFi.status() != WL_CONNECTED){ while (!anto.wifi.begin(ssid, pass)){ unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { readPM(); printDisplay(pmValue); } printOnlineStatus(0); } while (!anto.mqtt.connect(uuid, token, true)); } else { printOnlineStatus(1); anto.mqtt.pub("pm25",pmValue); } } void printDisplay(float pm){ String show,textStatus; int colorText,textPosition; if(pm >= 50 && pm < 100){ colorText = YELLOW; textStatus = "NORMAL"; textPosition = 110; } else if (pm >= 100) { colorText = RED; textStatus = "BAD"; textPosition = 140; } else { colorText = GREEN; textStatus = "GOOD"; textPosition = 130; } M5.Lcd.fillRect(270, 40, 50, 20, 0x409d78); M5.Lcd.fillRect(10, 80, 300, 180, 0x409d78); M5.Lcd.setTextSize(2); M5.Lcd.setCursor(275,43); M5.Lcd.setTextColor(colorText); M5.Lcd.println("2.5"); M5.Lcd.setTextSize(3); M5.Lcd.setTextColor(colorText); M5.Lcd.setCursor(textPosition,185); M5.Lcd.println(textStatus); M5.Lcd.setTextSize(8); M5.Lcd.setTextColor(WHITE); show = String(pm); M5.Lcd.setCursor((320 - (show.length()*40))/2,112); M5.Lcd.println(show); } void printOnlineStatus(int online){ M5.Lcd.fillCircle(300, 16, 7, WHITE); if(online == 1){ M5.Lcd.fillCircle(300, 16, 4, GREEN); } else { M5.Lcd.fillCircle(300, 16, 4, RED); } } void display(){ M5.Lcd.fillScreen(0x409d78); M5.Lcd.fillRect(0, 0, 320, 30, 0x506991); M5.Lcd.setTextSize(2); M5.Lcd.setTextColor(WHITE); M5.Lcd.setCursor(7,9); M5.Lcd.println("OPEN AQI"); printOnlineStatus(1); M5.Lcd.fillRect(10, 70, 300, 1, WHITE); M5.Lcd.setCursor(240,43); M5.Lcd.println("PM"); M5.Lcd.setCursor(275,43); M5.Lcd.setTextColor(WHITE); M5.Lcd.println("2.5"); } void messageReceived(String topic, String payload, char * bytes, unsigned int length) { Serial.print("incoming: "); Serial.print(topic); Serial.print(" - "); Serial.print(payload); Serial.println(); } |
เอาหละมีส่วนที่แก้ไม่เยอะครับนั่นคือ SSID ,PASSWORD ,USERNAME ,KEY
เป็นอันจบครับ กดเลือก hardware เป็น M5stack แล้วกด upload โปรแกรมได้เลยครับ
รอดูผลลัพธ์ครับผม !!!! ถ้าใครมีคำถามหรือติดขัดอะไรเข้ามาถามได้ที่กลุ่ม facebook นี้นะครับ ต้องกราบขออภัยที่ต้องเขียนรวบรัดนะครับ