Advertisement
mudhita_triari

Perbaikan Tugas Akhir - ESP32 Publisher - Influxdb

Jun 25th, 2024
519
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.34 KB | Source Code | 0 0
  1. #include <Arduino.h>
  2. #include <WiFi.h>
  3. #include <WiFiMulti.h>
  4. #include <WiFiManager.h>
  5. #include <InfluxDbClient.h>
  6. #include <InfluxDbCloud.h>
  7. #include <ArduinoJson.h>
  8. #include <otadrive_esp.h>
  9.  
  10. WiFiManager wm;
  11.  
  12. // WiFi and InfluxDB credentials
  13. char ssid[32];
  14. char password[32];
  15.  
  16. const char* INFLUXDB_URL =      "https://us-east-1-1.aws.cloud2.influxdata.com";
  17. const char* INFLUXDB_TOKEN =    "bY5Y8WsUTkW4aPPhvbrx6XWXi-s_-Da8JA3sN14ti2_QdzyCKBkoht93Ms_aoiYlZNuwGa2OmGwSuAPiwVJoYQ==";
  18. const char* INFLUXDB_ORG =      "023982a3a96b797a";
  19. const char* INFLUXDB_BUCKET =   "INDOBOT_FSID";
  20. const char* TZ_INFO =           "UTC7";
  21.  
  22. // UART communication settings
  23. const int SERIAL_BAUD_RATE = 115200;
  24. const int SERIAL_RX_PIN = 16;
  25. const int SERIAL_TX_PIN = 17;
  26.  
  27. // WiFiMulti instance
  28. WiFiMulti wifiMulti;
  29.  
  30. // HardwareSerial instance for UART2
  31. HardwareSerial SerialESP32_7(2);
  32.  
  33. // InfluxDB client instance
  34. InfluxDBClient influxClient(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);
  35.  
  36. // Data point for InfluxDB
  37. Point sensor("sensor_data");
  38.  
  39. String FW_VERSION = "1.0.4";
  40.  
  41. unsigned long previousSyncMillis = 0;
  42. const long syncInterval = 60000; // Sync every 60 seconds
  43.  
  44. // LED pin
  45. const int LED_PIN = 2; // Ganti dengan pin yang sesuai untuk LED
  46.  
  47. // Function prototypes
  48. void saveWifiCallback();
  49. void configModeCallback(WiFiManager *myWiFiManager);
  50. void onUpdateProgress(int progress, int total);
  51. void sync_task();
  52. void sendDataOverUART(const char* chipId, const char* tempOffset, const char* humOffset, const char* ppmOffset,
  53.                       const char* luxOffset, const char* longitude, const char* latitude, const char* elevation);
  54. void printAligned(const char* label, const char* value);
  55. void logData(const char* label, float value, int decimalPlaces = 2);
  56. void logData(const char* label, const char* value);
  57. void blinkLED(int times, int duration);
  58.  
  59. void setup() {
  60.     // Inisialisasi pin LED
  61.     pinMode(LED_PIN, OUTPUT);
  62.     digitalWrite(LED_PIN, LOW);
  63.  
  64.     Serial.begin(SERIAL_BAUD_RATE);
  65.     Serial.println("Starting setup...");
  66.  
  67.     // Initialize UART on specified RX and TX pins
  68.     SerialESP32_7.begin(SERIAL_BAUD_RATE, SERIAL_8N1, SERIAL_RX_PIN, SERIAL_TX_PIN);
  69.  
  70.     // Enable debug output for WiFiManager
  71.     wm.setDebugOutput(true);
  72.  
  73.     // Tambahkan parameter custom untuk WiFiManager
  74.     WiFiManagerParameter custom_id("id", "Device ID", "", 32);
  75.     WiFiManagerParameter custom_hum("hum", "Humidity", "", 5);
  76.     WiFiManagerParameter custom_temp("temp", "Temperature", "", 5);
  77.     WiFiManagerParameter custom_ppm("ppm", "PPM", "", 5);
  78.     WiFiManagerParameter custom_lux("lux", "Lux", "", 5);
  79.     WiFiManagerParameter custom_longitude("longitude", "Longitude", "", 12);
  80.     WiFiManagerParameter custom_latitude("latitude", "Latitude", "", 12);
  81.     WiFiManagerParameter custom_elevation("elevation", "Elevation", "", 5);
  82.  
  83.     // Tambahkan parameter ke WiFiManager
  84.     wm.addParameter(&custom_id);
  85.     wm.addParameter(&custom_hum);
  86.     wm.addParameter(&custom_temp);
  87.     wm.addParameter(&custom_ppm);
  88.     wm.addParameter(&custom_lux);
  89.     wm.addParameter(&custom_longitude);
  90.     wm.addParameter(&custom_latitude);
  91.     wm.addParameter(&custom_elevation);
  92.  
  93.     // Set WiFiManager callbacks
  94.     wm.setAPCallback(configModeCallback);
  95.     wm.setSaveConfigCallback(saveWifiCallback);
  96.  
  97.     // Mulai konfigurasi WiFiManager portal
  98.     if (!wm.autoConnect("ENVIRO OBSERVER DIAGNOSIS", "password")) {
  99.         Serial.println("Failed to connect to WiFi and timeout");
  100.         delay(3000);
  101.         ESP.restart();
  102.     }
  103.  
  104.     Serial.println("Connected to WiFi");
  105.  
  106.     // Kirim data melalui UART setelah terhubung
  107.     sendDataOverUART(custom_id.getValue(), custom_hum.getValue(), custom_temp.getValue(), custom_ppm.getValue(),
  108.                      custom_lux.getValue(), custom_longitude.getValue(), custom_latitude.getValue(),
  109.                      custom_elevation.getValue());
  110.  
  111.     // Periksa nilai parameter yang disimpan
  112.     Serial.println("\n-----------------KALIBRASI NODEMESH-----------------\n");
  113.     printAligned("Device ID:", custom_id.getValue());
  114.     printAligned("Humidity:", custom_hum.getValue());
  115.     printAligned("Temperature:", custom_temp.getValue());
  116.     printAligned("PPM:", custom_ppm.getValue());
  117.     printAligned("Lux:", custom_lux.getValue());
  118.  
  119.     Serial.println("\n------------------LOKASI NODEMESH------------------\n");
  120.     printAligned("Longitude:", custom_longitude.getValue());
  121.     printAligned("Latitude:", custom_latitude.getValue());
  122.     printAligned("Elevation:", custom_elevation.getValue());
  123.  
  124.     Serial.println("Setup complete.");
  125. }
  126.  
  127. void loop() {
  128.     if (SerialESP32_7.available()) {
  129.         blinkLED(3, 100); // LED berkedip 3 kali saat data diterima
  130.         String serialMsg = SerialESP32_7.readStringUntil('\n');
  131.         serialMsg.trim();
  132.  
  133.         Serial.println("Diterima dari Pusat Data: " + serialMsg);
  134.  
  135.         if (serialMsg.length() > 0) {
  136.             DynamicJsonDocument doc(256);
  137.             DeserializationError error = deserializeJson(doc, serialMsg);
  138.  
  139.             if (error) {
  140.                 Serial.print("deserializeJson() gagal: ");
  141.                 Serial.println(error.c_str());
  142.             } else {
  143.                 const char* id = doc["id"];
  144.                 if (!id) {
  145.                     Serial.println("JSON tidak valid: 'id' tidak ditemukan");
  146.                 } else {
  147.                     if (doc.containsKey("hum") && doc.containsKey("temp") && doc.containsKey("ppm") && doc.containsKey("lux") &&
  148.                         doc.containsKey("longitude") && doc.containsKey("latitude") && doc.containsKey("elevation")) {
  149.                         float hum = doc["hum"];
  150.                         float temp = doc["temp"];
  151.                         float ppm = doc["ppm"];
  152.                         float lux = doc["lux"];
  153.                         float longitude = doc["longitude"].as<float>();
  154.                         float latitude = doc["latitude"].as<float>();
  155.                         float elevation = doc["elevation"];
  156.  
  157.                         // Log data received from UART
  158.                         Serial.println("\nData diterima dari UART:");
  159.                         logData("ID:", id);
  160.                         logData("Kelembaban:", hum);
  161.                         logData("Suhu:", temp);
  162.                         logData("PPM:", ppm);
  163.                         logData("Lux:", lux);
  164.                         logData("Longitude:", longitude, 4);
  165.                         logData("Latitude:", latitude, 4);  
  166.                         logData("Elevasi:", elevation);
  167.  
  168.                         sensor.clearFields();
  169.                         sensor.clearTags();
  170.                         sensor.addTag("id", id);
  171.                         sensor.addField("hum", hum);
  172.                         sensor.addField("temp", temp);
  173.                         sensor.addField("ppm", ppm);
  174.                         sensor.addField("lux", lux);
  175.                         sensor.addField("longitude", longitude, 4);
  176.                         sensor.addField("latitude", latitude, 4);
  177.                         sensor.addField("elevation", elevation);
  178.  
  179.                         Serial.println("\nMengirim data berikut ke InfluxDB:");
  180.                         logData("ID:", id);
  181.                         logData("Kelembaban:", hum);
  182.                         logData("Suhu:", temp);
  183.                         logData("PPM:", ppm);
  184.                         logData("Lux:", lux);
  185.                         logData("Longitude:", longitude, 4);
  186.                         logData("Latitude:", latitude, 4);
  187.                         logData("Elevasi:", elevation);
  188.  
  189.                         if (!influxClient.writePoint(sensor)) {
  190.                             Serial.print("InfluxDB.write gagal: ");
  191.                             Serial.println(influxClient.getLastErrorMessage());
  192.                         }
  193.                     } else {
  194.                         Serial.println("JSON tidak valid: beberapa kunci data tidak ditemukan");
  195.                     }
  196.                 }
  197.             }
  198.         }
  199.     }
  200.     sync_task();
  201. }
  202.  
  203. void sync_task() {
  204.     unsigned long currentMillis = millis();
  205.     if (currentMillis - previousSyncMillis >= syncInterval) {
  206.         previousSyncMillis = currentMillis;
  207.  
  208.         if (WiFi.status() != WL_CONNECTED) {
  209.             Serial.println("WiFi tidak terhubung! Mencoba menghubungkan kembali...");
  210.             WiFi.reconnect();
  211.             return;
  212.         }
  213.  
  214.         Serial.println("Firmware version: " + FW_VERSION);
  215.         OTADRIVE.updateFirmware();
  216.     }
  217. }
  218.  
  219. void sendDataOverUART(const char* chipId, const char* tempOffset, const char* humOffset, const char* ppmOffset,
  220.                       const char* luxOffset, const char* longitude, const char* latitude, const char* elevation) {
  221.     StaticJsonDocument<200> jsonDocument;
  222.  
  223.     jsonDocument["chipId"] = chipId;
  224.     jsonDocument["tempOffset"] = tempOffset;
  225.     jsonDocument["humOffset"] = humOffset;
  226.     jsonDocument["ppmOffset"] = ppmOffset;
  227.     jsonDocument["luxOffset"] = luxOffset;
  228.     jsonDocument["longitude"] = longitude;
  229.     jsonDocument["latitude"] = latitude;
  230.     jsonDocument["elevation"] = elevation;
  231.  
  232.     String jsonString;
  233.     serializeJson(jsonDocument, jsonString);
  234.  
  235.     SerialESP32_7.println(jsonString);
  236. }
  237.  
  238. void printAligned(const char* label, const char* value) {
  239.     Serial.print(label);
  240.     int len = 30 - strlen(label);
  241.     for (int i = 0; i < len; i++) {
  242.         Serial.print(" ");
  243.     }
  244.     Serial.println(value);
  245. }
  246.  
  247. void logData(const char* label, float value, int decimalPlaces) {
  248.     Serial.print(label);
  249.     Serial.println(value, decimalPlaces);
  250. }
  251.  
  252. void logData(const char* label, const char* value) {
  253.     Serial.print(label);
  254.     Serial.println(value);
  255. }
  256.  
  257. void blinkLED(int times, int duration) {
  258.     for (int i = 0; i < times; i++) {
  259.         digitalWrite(LED_PIN, HIGH);
  260.         delay(duration);
  261.         digitalWrite(LED_PIN, LOW);
  262.         delay(duration);
  263.     }
  264. }
  265.  
  266. void saveWifiCallback() {
  267.     Serial.println("Settings have been saved");
  268. }
  269.  
  270. void configModeCallback(WiFiManager *myWiFiManager) {
  271.     Serial.println("Entered configuration mode");
  272.     Serial.println(WiFi.softAPIP());
  273.     Serial.println(myWiFiManager->getConfigPortalSSID());
  274. }
  275.  
  276. void onUpdateProgress(int progress, int total) {
  277.     Serial.printf("Update progress: %d of %d bytes...\n", progress, total);
  278. }
  279.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement