BimoSora

Weather

Jul 15th, 2024 (edited)
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.42 KB | None | 0 0
  1. // Kami menggunakan  -1 untuk tampilan merubah menjadi tulisan ERROR
  2.  
  3. // Library include
  4. #include <Wire.h>
  5. #include <LiquidCrystal_I2C.h>
  6. #include <ArduinoJson.h>
  7. #include <Adafruit_BMP280.h>
  8. #include <BH1750.h>
  9.  
  10. // Instalasi Address
  11. LiquidCrystal_I2C lcd(0x27, 16, 2);
  12. Adafruit_BMP280 bmp;
  13. BH1750 lightMeter(0x23);
  14.  
  15. const int ledPin = PC15;
  16. const int ledSTM32 = LED_BUILTIN;
  17.  
  18. // Analog range
  19. const int sensorMin = 0;
  20. const int sensorMax = 4096;
  21.  
  22. int ledState = HIGH;
  23. int i = 0;
  24.  
  25. int state = 0;
  26.  
  27. // Untuk membaca value
  28. float lux = -1;
  29. int temp = -1, pressure = -1, height = -1, sensorReading = -1, range = -1;
  30.  
  31. // Implementasi supaya awalnya status false untuk mendeteksi apakah sensor putus atau tidak
  32. bool bmpStatus = false, bh1750Status = false, rainSensorStatus = false;
  33.  
  34.  
  35. // Kedip pada tampilan LCD 16X2
  36. unsigned long previousMillis = 0;
  37. const long interval = 500;
  38.  
  39. unsigned long previousMillis2 = 0;
  40. const long interval2 = 500;
  41.  
  42. unsigned long previousMillis3 = 0;
  43. const long interval3 = 1000;
  44.  
  45. unsigned long previousMillisState = 0;
  46. const long intervalState = 8000;
  47.  
  48. // Setup dimulai
  49. void setup() {
  50.   // Resolusi STM32 32Bit
  51.   analogReadResolution(12);
  52.  
  53.   Serial.begin(9600);
  54.   Wire.begin();
  55.  
  56.   // Membaca address pada sensor
  57.   bh1750Status = lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);
  58.   bmpStatus = bmp.begin(0x76);
  59.  
  60.   // LCD Instalasi
  61.   lcd.init();
  62.   lcd.backlight();
  63.  
  64.   // Instalasi pin LED
  65.   pinMode(ledPin, OUTPUT);
  66.   pinMode(ledSTM32, OUTPUT);
  67.   digitalWrite(ledSTM32, LOW);
  68.   digitalWrite(ledPin, HIGH);
  69.  
  70.   // Membaca apakah BMP280 gangguan atau tidak
  71.   if (!bmpStatus) {
  72.     Serial.println("Error initializing BMP280");
  73.   } else {
  74.     bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, Adafruit_BMP280::SAMPLING_X2, Adafruit_BMP280::SAMPLING_X16, Adafruit_BMP280::FILTER_X16, Adafruit_BMP280::STANDBY_MS_500);
  75.   }
  76.  
  77.   // Membaca apakah BH1750 gangguan atau tidak
  78.   if (!bh1750Status) {
  79.     Serial.println("Error initializing BH1750");
  80.   }
  81.  
  82.   // Tulisan mengetik satu persatu
  83.   lcd.clear();
  84.   for (i = 16; i >= 0; i--) { // Program increamental nilai i dari 16 sampai 0
  85.     lcd.setCursor(i, 0);      // Setting posisi kursor kolom sesuai nilai i
  86.     lcd.print("Weather Station"); // Menampilkan karakter
  87.     delay(500);               // Menunda tampilan selama 500 ms
  88.     lcd.clear();              // Menghapus semua karakter
  89.   }
  90. }
  91.  
  92. // Looping dimulai
  93. void loop() {
  94.   unsigned long currentMillis = millis();
  95.  
  96.   if (currentMillis - previousMillis >= interval) {
  97.     previousMillis = currentMillis;
  98.  
  99.     // Membaca apakah BMP280 gangguan atau tidak
  100.     if (bmpStatus) {
  101.       temp = bmp.readTemperature();
  102.       pressure = bmp.readPressure() / 100.0;
  103.       height = bmp.readAltitude(1013.25);
  104.     } else {
  105.       temp = -1;
  106.       pressure = -1;
  107.       height = -1;
  108.     }
  109.  
  110.     // Membaca pin Analogread
  111.     sensorReading = analogRead(PA1);
  112.     range = map(sensorReading, sensorMin, sensorMax, 0, 3);
  113.     rainSensorStatus = (sensorReading != 0 && sensorReading != 4096);
  114.  
  115.     // Membaca apakah BH1750 gangguan atau tidak
  116.     if (bh1750Status && lightMeter.measurementReady()) {
  117.       lux = lightMeter.readLightLevel();
  118.     } else {
  119.       lux = -1;
  120.     }
  121.  
  122.     // Menampilkan sensor di Serial Monitor dalam bentuk array, master json
  123.     // Create the JSON document
  124.     JsonDocument doc;
  125.    
  126.     doc["temperature"] = bmpStatus ? temp : -1;
  127.     doc["pressure"] = bmpStatus ? pressure : -1;
  128.     doc["height"] = bmpStatus ? height : -1;
  129.     doc["lux"] = bh1750Status ? lux : -1;
  130.     doc["range"] = rainSensorStatus ? range : -1;
  131.  
  132.     //Send data to NodeMCU
  133.     doc.shrinkToFit();
  134.     serializeJson(doc, Serial);
  135.   }
  136.  
  137.   if (currentMillis - previousMillisState >= intervalState) {
  138.     previousMillisState = currentMillis;
  139.     // Berapa banyak LCD bisa ganti tampilan secara otomatis
  140.     state = (state % 5) + 1;
  141.     updateLCD();
  142.   }
  143.  
  144.   // Membaca kembali gangguan pada BH1750 untuk LED notifikasi dan menjalankan perubahan pada cahaya
  145.   if (bh1750Status && lightMeter.measurementReady()) {
  146.     if (lux >= 0 && lux <= 100) {
  147.       if (millis() - previousMillis2 >= interval2) {
  148.         previousMillis2 = millis();
  149.         ledState = (ledState == HIGH) ? LOW : HIGH;
  150.         digitalWrite(ledSTM32, ledState);
  151.       }
  152.       digitalWrite(ledPin, HIGH);
  153.     } else if (lux >= 101 && lux <= 1000) {
  154.       if (millis() - previousMillis3 >= interval3) {
  155.         previousMillis3 = millis();
  156.         ledState = (ledState == HIGH) ? LOW : HIGH;
  157.         digitalWrite(ledSTM32, ledState);
  158.       }
  159.       digitalWrite(ledPin, HIGH);
  160.     } else if (lux >= 1001 && lux <= 65535) {
  161.       digitalWrite(ledSTM32, HIGH);
  162.       digitalWrite(ledPin, LOW);
  163.     }
  164.   } else {
  165.     digitalWrite(ledSTM32, LOW);
  166.     digitalWrite(ledPin, HIGH);
  167.   }
  168. }
  169.  
  170. // Panggil isi sensor di LCD
  171. void updateLCD() {
  172.   lcd.clear();
  173.   switch (state) {
  174.     case 1:
  175.       lcd.setCursor(0, 0);
  176.       lcd.print("TEMPERATURE");
  177.       lcd.setCursor(0, 1);
  178.       lcd.print(temp != -1 ? String(temp) + " *C" : "ERROR");
  179.       break;
  180.     case 2:
  181.       lcd.setCursor(0, 0);
  182.       lcd.print("AIR PRESSURE");
  183.       lcd.setCursor(0, 1);
  184.       lcd.print(pressure != -1 ? String(pressure) + " hPa" : "ERROR");
  185.       break;
  186.     case 3:
  187.       lcd.setCursor(0, 0);
  188.       lcd.print("HEIGHT");
  189.       lcd.setCursor(0, 1);
  190.       lcd.print(height != -1 ? String(height) + " m" : "ERROR");
  191.       break;
  192.     case 4:
  193.       lcd.setCursor(0, 0);
  194.       lcd.print("RAINFALL");
  195.       lcd.setCursor(0, 1);
  196.       if (rainSensorStatus) {
  197.         switch (range) {
  198.           case 0:
  199.             lcd.print("RAIN");
  200.             break;
  201.           case 1:
  202.             lcd.print("RAIN WARNING");
  203.             break;
  204.           case 2:
  205.             lcd.print("NOT RAINING");
  206.             break;
  207.           default:
  208.             lcd.print("ERROR");
  209.         }
  210.       } else {
  211.         lcd.print("ERROR");
  212.       }
  213.       break;
  214.     case 5:
  215.       lcd.setCursor(0, 0);
  216.       lcd.print("LIGHT");
  217.       lcd.setCursor(0, 1);
  218.       if (lux != -1) {
  219.         if (lux >= 0 && lux <= 100) {
  220.           lcd.print("DARK");
  221.         } else if (lux >= 101 && lux <= 1000) {
  222.           lcd.print("OVERCAST");
  223.         } else if (lux >= 1001 && lux <= 10000) {
  224.           lcd.print("BRIGHT");
  225.         } else if (lux >= 10001 && lux <= 65535) {
  226.           lcd.print("VERY BRIGHT");
  227.         }
  228.       } else {
  229.         lcd.print("ERROR");
  230.       }
  231.       break;
  232.   }
  233. }
Add Comment
Please, Sign In to add comment