WeatherBot
WeatherBot is an Arduino Nano RP2040 Connect creation that can tell the current temperature and humidity as well as recommend clothing and give alerts about Rain or Snow.
Devices & Components
1
10 jumper wires 150mm male
1
Arduino Nano RP2040 Connect with headers
1
DHT 11 module
1
Waveshare 0.96 inch OLED Display
1
220 resistor
1
10kOhm potentiometer
1
Push Button
Software & Tools
Arduino IDE
Project description
Code
WeatherBot Code
cpp
The code is
1#include <SPI.h> 2#include <Adafruit_GFX.h> 3#include <Adafruit_SSD1306.h> 4#include <dht11.h> 5 6// OLED display width and height 7#define SCREEN_WIDTH 128 8#define SCREEN_HEIGHT 64 9 10// Define SPI pin connections 11#define OLED_CLK 13 // Clock 12#define OLED_MOSI 11 // Data input (DIN) 13#define OLED_CS 10 // Chip select 14#define OLED_DC 9 // Data/command 15#define OLED_RESET 8 // Reset 16 17#define DHT11PIN 4 18const int buttonPin = 2; 19int buttonState = 0; 20 21int potpin = 0; 22int val; 23 24 25// Create an SSD1306 SPI instance 26Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &SPI, OLED_DC, OLED_RESET, OLED_CS); 27 28dht11 DHT11; 29 30 31 32void setup() { 33 Serial.begin(9600); 34 35 pinMode(buttonPin, INPUT); 36 37 38 Serial.println("Initializing OLED..."); 39 40 // Initialize the display 41 if (!display.begin(SSD1306_SWITCHCAPVCC)) { 42 Serial.println(F("SSD1306 initialization failed!")); 43 for (;;); // Infinite loop on failure 44 } 45 46 Serial.println("OLED initialized successfully!"); 47 48 // Clear the display 49 display.clearDisplay(); 50} 51void loop(){ 52 int chk = DHT11.read(DHT11PIN); //Read the DHT 11 53 val = analogRead(potpin); 54 val = map(val, 0, 1032, 0, 100); 55 float tempC = DHT11.temperature; // Get the temperature in Celsius 56 buttonState = digitalRead(buttonPin); 57 58 if(buttonState == HIGH){ 59 alerts(); 60 }else if((val >= 0) && (val <= 30)){ 61 62 page1(); 63 }else if((val >= 31) && (val <= 60)){ 64 65 page2(); 66 }else if((val >= 61) && (val <= 100)){ 67 68 page3(); 69 } 70 71 delay(50); 72 73} 74 75void alerts(){ 76 float tempC = DHT11.temperature; // Get the temperature in Celsius 77 float hum = DHT11.humidity; 78 79 display.clearDisplay(); 80 display.setTextColor(SSD1306_WHITE); 81 display.setCursor(0, 0); 82 display.setTextSize(2); 83 display.print("Alerts"); 84 display.setCursor(0,40); 85 if((hum >= 75) && (tempC <= 2)){ 86 display.print("Possible Snow"); 87 }else if((hum >= 75) && (tempC >= 3) && (tempC <= 6)){ 88 display.print("Freezing Rain"); 89 }else if((hum >= 75) && (tempC >= 7)){ 90 display.print("Rain"); 91 }else{ 92 display.print("No Alerts"); 93 } 94 display.display(); 95 96} 97void page3(){ 98 animation2(); 99 100 101} 102void page3wear(){ 103 float tempC = DHT11.temperature; 104 float hum = DHT11.humidity; 105 106 display.setTextColor(SSD1306_WHITE); 107 display.setCursor(0, 0); 108 display.setTextSize(2); 109 display.print("WeatherBot"); 110 display.setCursor(0,20); 111 112 if(hum >= 80){ 113 display.setCursor(0,20); 114 display.print("Jacket"); 115 display.setCursor(0,40); 116 display.print("Rainpants"); 117 } else if((tempC >= 18) && (tempC <= 33)){ 118 display.setCursor(0,20); 119 display.print("T-Shirt"); 120 display.setCursor(0,40); 121 display.print("Shorts"); 122 } else if((tempC >= 8) && (tempC <= 17)){ 123 display.setCursor(0,20); 124 display.print("Hoodie"); 125 display.setCursor(0,40); 126 display.print("Pants"); 127 } else if((tempC >= 0) && (tempC <= 6)){ 128 display.setCursor(0,20); 129 display.print("Jacket"); 130 display.setCursor(0,40); 131 display.print("Pants"); 132 } 133} 134void animation2(){ 135 136 float tempC = DHT11.temperature; 137 float hum = DHT11.humidity; 138 139 140 141 142 if(hum >= 80){ 143 page3wear(); 144 display.display(); 145 delay(500); 146 display.clearDisplay(); 147 page3wear(); 148 display.display(); 149 delay(500); 150 display.clearDisplay(); 151 }else if(tempC >= 6){ 152 page3wear(); 153 bot3(); 154 display.display(); 155 delay(500); 156 display.clearDisplay(); 157 bot4(); 158 page3wear(); 159 display.display(); 160 delay(500); 161 display.clearDisplay(); 162 }else if(tempC <= 5){ 163 page3wear(); 164 botcold(); 165 display.display(); 166 delay(50); 167 display.clearDisplay(); 168 botcold1(); 169 page3wear(); 170 display.display(); 171 delay(50); 172 display.clearDisplay(); 173 } 174 175 176} 177void botcold(){ 178 display.setTextSize(2); 179 display.setCursor(98,20); 180 display.print("o"); 181 display.setCursor(80,35); 182 display.print("/||\\"); 183 display.setCursor(92, 50); 184 display.print("=="); 185} 186void botcold1(){ 187 display.setTextSize(2); 188 display.setCursor(97,20); 189 display.print("o"); 190 display.setCursor(79,35); 191 display.print("/||\\"); 192 display.setCursor(91, 50); 193 display.print("=="); 194} 195void bot3(){ 196 display.setTextSize(2); 197 display.setCursor(98,20); 198 display.print("o"); 199 display.setCursor(80,35); 200 display.print("/||\\"); 201 display.setCursor(92, 50); 202 display.print("=="); 203} 204void bot4(){ 205 display.setTextSize(2); 206 display.setCursor(98,18); 207 display.print("o"); 208 display.setCursor(80,33); 209 display.print("/||\\"); 210 display.setCursor(92, 48); 211 display.print("=="); 212} 213void page2(){ 214 215 display.setTextColor(SSD1306_WHITE); 216 display.clearDisplay(); 217 display.setCursor(0, 0); 218 display.setTextSize(2); 219 display.print("WeatherBot"); 220 display.setCursor(5,30); 221 display.setTextSize(3); 222 display.print((float)DHT11.humidity, 0); 223 display.print("%"); 224 display.setCursor(75, 30); 225 display.print((float)DHT11.temperature, 0); 226 display.setTextSize(2); 227 display.print("C"); 228 display.display(); 229 delay(400); 230 231} 232void page1(){ 233 234 animation(); 235 236 237 238 239 240} 241 242 243void animation() { 244 245 246 247 248 249 250 display.clearDisplay(); 251 bot(); 252 start(); 253 temp23(); 254 display.display(); 255 delay(500); 256 display.clearDisplay(); 257 bot1(); 258 start(); 259 temp23(); 260 display.display(); 261 delay(500); 262 263 264 265 266 267 268 269 270} 271 272void bot(){ 273 display.setTextSize(2); 274 display.setCursor(28,15); 275 display.print("o"); 276 display.setCursor(10,30); 277 display.print("/||\\"); 278 display.setCursor(22, 45); 279 display.print("=="); 280 281 282 283} 284void bot1(){ 285 286 display.setTextSize(2); 287 display.setCursor(28,13); 288 display.print("o"); 289 display.setCursor(10,28); 290 display.print("/||\\"); 291 display.setCursor(22, 43); 292 display.print("=="); 293 294 295} 296void start(){ 297 298 display.setTextSize(2); 299 display.setTextColor(SSD1306_WHITE); // Size 2 300 display.setCursor(0, 0); // Start at top-left corner 301 display.print("WeatherBot"); 302 303 304} 305void temp23(){ 306 307 308 display.setTextSize(3); 309 display.setCursor(70, 30); 310 display.print((float)DHT11.temperature, 0); 311 display.setTextSize(2); 312 display.print("C"); 313 314 315 316}
Comments
Only logged in users can leave comments