Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Kami menggunakan -1 untuk tampilan merubah menjadi tulisan ERROR
- // Library include
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- #include <ArduinoJson.h>
- #include <Adafruit_BMP280.h>
- #include <BH1750.h>
- // Instalasi Address
- LiquidCrystal_I2C lcd(0x27, 16, 2);
- Adafruit_BMP280 bmp;
- BH1750 lightMeter(0x23);
- const int ledPin = PC15;
- const int ledSTM32 = LED_BUILTIN;
- // Analog range
- const int sensorMin = 0;
- const int sensorMax = 4096;
- int ledState = HIGH;
- int i = 0;
- int state = 0;
- // Untuk membaca value
- float lux = -1;
- int temp = -1, pressure = -1, height = -1, sensorReading = -1, range = -1;
- // Implementasi supaya awalnya status false untuk mendeteksi apakah sensor putus atau tidak
- bool bmpStatus = false, bh1750Status = false, rainSensorStatus = false;
- // Kedip pada tampilan LCD 16X2
- unsigned long previousMillis = 0;
- const long interval = 500;
- unsigned long previousMillis2 = 0;
- const long interval2 = 500;
- unsigned long previousMillis3 = 0;
- const long interval3 = 1000;
- unsigned long previousMillisState = 0;
- const long intervalState = 8000;
- // Setup dimulai
- void setup() {
- // Resolusi STM32 32Bit
- analogReadResolution(12);
- Serial.begin(9600);
- Wire.begin();
- // Membaca address pada sensor
- bh1750Status = lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);
- bmpStatus = bmp.begin(0x76);
- // LCD Instalasi
- lcd.init();
- lcd.backlight();
- // Instalasi pin LED
- pinMode(ledPin, OUTPUT);
- pinMode(ledSTM32, OUTPUT);
- digitalWrite(ledSTM32, LOW);
- digitalWrite(ledPin, HIGH);
- // Membaca apakah BMP280 gangguan atau tidak
- if (!bmpStatus) {
- Serial.println("Error initializing BMP280");
- } else {
- bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, Adafruit_BMP280::SAMPLING_X2, Adafruit_BMP280::SAMPLING_X16, Adafruit_BMP280::FILTER_X16, Adafruit_BMP280::STANDBY_MS_500);
- }
- // Membaca apakah BH1750 gangguan atau tidak
- if (!bh1750Status) {
- Serial.println("Error initializing BH1750");
- }
- // Tulisan mengetik satu persatu
- lcd.clear();
- for (i = 16; i >= 0; i--) { // Program increamental nilai i dari 16 sampai 0
- lcd.setCursor(i, 0); // Setting posisi kursor kolom sesuai nilai i
- lcd.print("Weather Station"); // Menampilkan karakter
- delay(500); // Menunda tampilan selama 500 ms
- lcd.clear(); // Menghapus semua karakter
- }
- }
- // Looping dimulai
- void loop() {
- unsigned long currentMillis = millis();
- if (currentMillis - previousMillis >= interval) {
- previousMillis = currentMillis;
- // Membaca apakah BMP280 gangguan atau tidak
- if (bmpStatus) {
- temp = bmp.readTemperature();
- pressure = bmp.readPressure() / 100.0;
- height = bmp.readAltitude(1013.25);
- } else {
- temp = -1;
- pressure = -1;
- height = -1;
- }
- // Membaca pin Analogread
- sensorReading = analogRead(PA1);
- range = map(sensorReading, sensorMin, sensorMax, 0, 3);
- rainSensorStatus = (sensorReading != 0 && sensorReading != 4096);
- // Membaca apakah BH1750 gangguan atau tidak
- if (bh1750Status && lightMeter.measurementReady()) {
- lux = lightMeter.readLightLevel();
- } else {
- lux = -1;
- }
- // Menampilkan sensor di Serial Monitor dalam bentuk array, master json
- // Create the JSON document
- JsonDocument doc;
- doc["temperature"] = bmpStatus ? temp : -1;
- doc["pressure"] = bmpStatus ? pressure : -1;
- doc["height"] = bmpStatus ? height : -1;
- doc["lux"] = bh1750Status ? lux : -1;
- doc["range"] = rainSensorStatus ? range : -1;
- //Send data to NodeMCU
- doc.shrinkToFit();
- serializeJson(doc, Serial);
- }
- if (currentMillis - previousMillisState >= intervalState) {
- previousMillisState = currentMillis;
- // Berapa banyak LCD bisa ganti tampilan secara otomatis
- state = (state % 5) + 1;
- updateLCD();
- }
- // Membaca kembali gangguan pada BH1750 untuk LED notifikasi dan menjalankan perubahan pada cahaya
- if (bh1750Status && lightMeter.measurementReady()) {
- if (lux >= 0 && lux <= 100) {
- if (millis() - previousMillis2 >= interval2) {
- previousMillis2 = millis();
- ledState = (ledState == HIGH) ? LOW : HIGH;
- digitalWrite(ledSTM32, ledState);
- }
- digitalWrite(ledPin, HIGH);
- } else if (lux >= 101 && lux <= 1000) {
- if (millis() - previousMillis3 >= interval3) {
- previousMillis3 = millis();
- ledState = (ledState == HIGH) ? LOW : HIGH;
- digitalWrite(ledSTM32, ledState);
- }
- digitalWrite(ledPin, HIGH);
- } else if (lux >= 1001 && lux <= 65535) {
- digitalWrite(ledSTM32, HIGH);
- digitalWrite(ledPin, LOW);
- }
- } else {
- digitalWrite(ledSTM32, LOW);
- digitalWrite(ledPin, HIGH);
- }
- }
- // Panggil isi sensor di LCD
- void updateLCD() {
- lcd.clear();
- switch (state) {
- case 1:
- lcd.setCursor(0, 0);
- lcd.print("TEMPERATURE");
- lcd.setCursor(0, 1);
- lcd.print(temp != -1 ? String(temp) + " *C" : "ERROR");
- break;
- case 2:
- lcd.setCursor(0, 0);
- lcd.print("AIR PRESSURE");
- lcd.setCursor(0, 1);
- lcd.print(pressure != -1 ? String(pressure) + " hPa" : "ERROR");
- break;
- case 3:
- lcd.setCursor(0, 0);
- lcd.print("HEIGHT");
- lcd.setCursor(0, 1);
- lcd.print(height != -1 ? String(height) + " m" : "ERROR");
- break;
- case 4:
- lcd.setCursor(0, 0);
- lcd.print("RAINFALL");
- lcd.setCursor(0, 1);
- if (rainSensorStatus) {
- switch (range) {
- case 0:
- lcd.print("RAIN");
- break;
- case 1:
- lcd.print("RAIN WARNING");
- break;
- case 2:
- lcd.print("NOT RAINING");
- break;
- default:
- lcd.print("ERROR");
- }
- } else {
- lcd.print("ERROR");
- }
- break;
- case 5:
- lcd.setCursor(0, 0);
- lcd.print("LIGHT");
- lcd.setCursor(0, 1);
- if (lux != -1) {
- if (lux >= 0 && lux <= 100) {
- lcd.print("DARK");
- } else if (lux >= 101 && lux <= 1000) {
- lcd.print("OVERCAST");
- } else if (lux >= 1001 && lux <= 10000) {
- lcd.print("BRIGHT");
- } else if (lux >= 10001 && lux <= 65535) {
- lcd.print("VERY BRIGHT");
- }
- } else {
- lcd.print("ERROR");
- }
- break;
- }
- }
Add Comment
Please, Sign In to add comment