Weather station with BME280
Measure temperature, humidity and barometric pressure!
Components and supplies
1
1K resistor
1
Arduino Nano
2
push buttons
1
2N3904 NPN transistor
1
LCD 16x2
20
Jumper wires (generic)
1
Box for Arduino
Apps and platforms
1
KiCad
1
Arduino IDE
Project description
Code
Arduino Nano weather station with BME280 & LCD 16x2
cpp
1//WEATHER STATION WITH ARDUINO NANO AND BME280 V2.0 2//IN THIS VERSION DELAY IS ACOMPLISHED WITH MILLIS FUNCTION AND THERE IS PUSHBUTTON THAT CONTROLS THE DISPLAY MODE 3 4//THERE IS A SECOND PUSHBUTTON THAT CONTROLS LCD BACKLIGHT. EVERYTIME IS PRESSED BACKLIGHT IS ON FOR 10'' 5//BUTTONS ARE CONTROLLED WITH THE EZBUTTON LIBRARY 6 7#include <ezButton.h> 8#include <LiquidCrystal.h> 9#include <Wire.h> 10#include <Adafruit_Sensor.h> 11#include <Adafruit_BME280.h> 12 13 14float temp; //VARIABLE FOR MEASURING TEMPERATURE 15float humid; //VARIABLE FOR MEASURING HUMIDITY 16float pressure; //VARIABLE FOR MEASURING PRESSURE 17int mode = 0; //VARIABLE FOR DISPLAY MODE. VALUE DEPENDS FROM PUSHBUTTON PRESSINGS. MODE=0 SEQUENSE -- MODE=1 TEMPERATURE -- MODE=2 HUMIDITY -- MODE=3 PRESSURE 18int whatToPrint = 0; //VARIABLE FOR CHECKING WHAT TO PRINT IN SEQUENCE MODE 19 20 21ezButton button1(5); // create ezButton object that attach to pin 5; CONNECT PUSHBUTTON FOR CONTROL LCD BACKLIGHT 22ezButton button2(7); // create ezButton object that attach to pin 7; CONNECT PUSHBUTTON FOR DISPLAY MODE 23 24int BKL_out = 4; //OUTPUT FOR CONTROLLING LCD BACKLIGHT THROUGH NPN TRANSISTOR 25int state = 0; //VARIABLE FOR BACKLIGHT 26 27unsigned long prevTime_T1 = 0; 28unsigned long prevTime_T2 = 0; 29unsigned long prevTime_T3 = 0; 30 31 32long interval_T1 = 3000; //DISPLAY TIME 3'' 33long interval_T2 = 5000; //SEND DATA VIA SERIAL EVERY 5'' 34long interval_T3 = 10000; //LCD BACKLIGHT ON TIME 10'' 35 36const int RS=2, E=3, D4=8, D5=9, D6=10, D7=11; // CONNECTION OF LCD TO ARDUINO /ΣΥΝΔΕΩ ΤΑ PIN ΤΗΣ LCD ΟΘΟΝΗΣ ΣΤΑ PIN TOY ARDUINO 37 38LiquidCrystal lcd(RS,E,D4,D5,D6,D7); //LCD INITIALIZATION / ΑΡΧΙΚΟΠΟΙΗΣΗ ΟΘΟΝΗΣ 39 40Adafruit_BME280 bme; // I2C 41 //Adafruit_BMP280 bme(BMP_CS); // hardware SPI 42 //Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK); 43 44void setup() { 45 46 pinMode (BKL_out,OUTPUT); 47 lcd.begin(16,2); //LCD 16 COLUMΝS 2 ROWS / ΑΡΧΙΚΟΠΟΙΣΗ ΟΘΟΝΗΣ ΣΤΗΛΕΣ=16 ΓΡΑΜΜΕΣ=2 48 Serial.begin(9600); //BEGIN SERIAL COMMUNICATION / ΕΝΑΡΞΗ ΣΕΙΡΙΑΚΗΣ ΕΠΙΚΟΙΝΩΝΙΑΣ 49 Serial.println(F("BMP280 test")); 50 51 if (!bme.begin()) { 52 Serial.println("Could not find a valid BMP280 sensor, check wiring!"); 53 while (1); 54 } 55 button1.setDebounceTime(50); // set debounce time to 50 milliseconds 56 button2.setDebounceTime(50); // set debounce time to 50 milliseconds 57 58 59 lcd.clear(); 60 lcd.setCursor(0,0); //DEFINE LCD CURSOR POSITION 61 lcd.print("WEATHER STATION"); //PRINT WELCOME MESSAGE 62 lcd.setCursor(1,3); 63 lcd.print(" Version:2.0"); 64 delay(5000); 65 66 67} 68 69void loop() { 70 71 button1.loop(); // MUST call the loop() function first 72 button2.loop(); // MUST call the loop() function first 73 74 unsigned long currentTime = millis(); 75 76 77 temp = bme.readTemperature(); //READ AND STORE TEMPERATURE 78 delay(10); 79 humid = bme.readHumidity(); //READ AND STORE HUMIDITY 80 delay(10); 81 pressure = bme.readPressure()/100; //DIVIDE WITH 100 TO GET hPa 82 delay(10); 83 84 if(currentTime - prevTime_T2 > interval_T2){ 85 String message = (String) "Humidity: "+humid+"% Temperature: " +temp+"°C Pressure: " +pressure+"hPa"; 86 Serial.println(message); 87 prevTime_T2 = currentTime; 88 } 89 90 91 if(button1.isPressed()){ //CHECK IF PUSHBUTTON FOR BACKLIGHT IS PRESSED 92 digitalWrite (BKL_out, HIGH); //BACKLIGHT ON 93 state=1; //VARIABLE FOR BACKLIGHT SET TO 1 94 prevTime_T3=currentTime; //WRITE TO VARIABLE WHAT TIME THE BACKLIGHT PUSHBUTTON WAS PRESSED 95 Serial.println("state=1"); 96 Serial.println(prevTime_T3); 97 } 98 99 if(state==1){ //IF BACKLIGHT IS ON 100 if(currentTime - prevTime_T3 > interval_T3){ //AND IF 10'' HAS PASSED 101 digitalWrite (BKL_out, LOW); //TURN OFF BACKLIGHT 102 state=0; //VARIABLE FOR BACKLIGHT SET TO 0 103 Serial.println("turn off BACKLIGHT"); 104 prevTime_T3 = currentTime; 105 } 106 } 107 108 if(button2.isPressed()) //IF BUTTON FOR DISPLAY MODE IS PRESSED 109 mode++; //INCREASE VARIABLE FOR DISPLAY MODE 110 if (mode==4){ //CHECK IF VARIABLE IS 4 111 mode = 0; //SET IT TO 0 112 } 113 114 115 if(mode == 0){ //IF VARIABLE IS 0 116 if(currentTime - prevTime_T1 > interval_T1){ //AND IF 3'' HAS PASSED 117 whatToPrint++; //INCREASE THE VARIABLE WHATTOPRINT 118 if(whatToPrint == 3){ 119 whatToPrint = 0; 120 } 121 prevTime_T1 = currentTime; 122 } 123 124//PRINT TEMPERATURE 125 if(whatToPrint == 0){ 126 127 lcd.clear(); 128 lcd.setCursor(0,0); //DEFINE LCD CURSOR POSITION 129 lcd.print("Temperature"); //PRINT TEXT 130 //delay(20); 131 lcd.setCursor(0,1); 132 lcd.print("T="); 133 lcd.setCursor(2,1); 134 lcd.print(temp); 135 lcd.setCursor(8,1); 136 lcd.print("C"); 137 } 138 139//PRINT HUMIDITY 140 if(whatToPrint == 1){ 141 142 lcd.clear(); 143 lcd.setCursor(0,0); //DEFINE LCD CURSOR POSITION 144 lcd.print("Humidity"); //PRINT TEXT 145 //delay(20); 146 lcd.setCursor(0,1); 147 lcd.print("H="); 148 lcd.setCursor(2,1); 149 lcd.print(humid); 150 lcd.setCursor(8,1); 151 lcd.print("%"); 152 } 153 154//PRINT PRESSURE 155 if(whatToPrint ==2){ 156 157 lcd.clear(); 158 lcd.setCursor(0,0); //DEFINE LCD CURSOR POSITION 159 lcd.print("Barometric pres"); //PRINT TEXT 160 //delay(20); 161 lcd.setCursor(0,1); 162 lcd.print("P="); 163 lcd.setCursor(2,1); 164 lcd.print(pressure); 165 lcd.setCursor(10,1); 166 lcd.print("hPa"); 167 } 168 169} 170 171 if(mode == 1){ 172 lcd.clear(); 173 lcd.setCursor(0,0); //DEFINE LCD CURSOR POSITION 174 lcd.print("Temperature"); //PRINT TEXT 175 //delay(20); 176 lcd.setCursor(0,1); 177 lcd.print("T="); 178 lcd.setCursor(2,1); 179 lcd.print(temp); 180 lcd.setCursor(8,1); 181 lcd.print("C"); 182 } 183 184 if(mode == 2){ 185 lcd.clear(); 186 lcd.setCursor(0,0); //DEFINE LCD CURSOR POSITION 187 lcd.print("Humidity"); //PRINT TEXT 188 //delay(20); 189 lcd.setCursor(0,1); 190 lcd.print("H="); 191 lcd.setCursor(2,1); 192 lcd.print(humid); 193 lcd.setCursor(8,1); 194 lcd.print("%"); 195 } 196 197 if(mode == 3){ 198 lcd.clear(); 199 lcd.setCursor(0,0); //DEFINE LCD CURSOR POSITION 200 lcd.print("Barometric pres"); //PRINT TEXT 201 //delay(20); 202 lcd.setCursor(0,1); 203 lcd.print("P="); 204 lcd.setCursor(2,1); 205 lcd.print(pressure); 206 lcd.setCursor(10,1); 207 lcd.print("hPa"); 208 } 209}
Comments
Only logged in users can leave comments