· 6 years ago · Jan 08, 2020, 08:38 PM
1//Variabelen:
2/*
3 bool = true of false, ja of nee, 1 of 0
4 byte = 0 tot 255
5 char = -128 tot 127
6 word = 0 tot 65535
7 int = -32768 tot 32767
8 long = -2miljard tot 2 miljard
9 float = heel kleine tot heel grote kommagetallen
10 double = heel kleine tot heel grote kommagetallen
11*/
12
13double tempDht; //huidige temperatuur van de DHT11 Sensor
14int humiDht; //huidige vochtigheid van de DHT11 Sensor
15double tempBmp; //huidige temperatuur van de BMP180 Sensor
16double presBmp; //huidige druk van de BMP180 Sensor
17double presBmpSea; //druk relatief met zee niveau via de BMP180 Sensor
18const int lightLdrPin = A0; //Lichtsterkte (LDR) Sensor Pin
19int lightLdr; //lichtsterkte waarde
20const int waterSenPin = A1; //Water Sensor Signal Pin
21int waterSen; //Water Sensor waarde
22const int joystickVrxPin = A2; //Joystick VrX Pin
23int joystickX; //Joystick X waarde
24const int joystickVryPin = A3; //Joystick VrY Pin
25int joystickY; //Joystick Y waarde
26const int joystickSigPin = 9; //Joystick Signaal Pin
27int joystickS; //Joystick Signaal waarde (ingedrukt of niet)
28int scherm = 0; //Scherm laten veranderen met joystick
29int groeneLedPin = 10; //Groene LED Digitale pin
30int geleLedPin = 11; //Gele LED Digitale pin
31int rodeLedPin = 12; //Rode LED Digitale pin
32
33//LCD - Digitale pinnen 2 tot 7:
34#include <LiquidCrystal.h>
35LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
36
37//DHT11 Sensor - Digitale pin 8:
38#include "DHT.h"
39#define DHTPIN 8
40#define DHTTYPE DHT11
41DHT dht(DHTPIN, DHTTYPE);
42
43//BMP180 Druk Sensor - SDA analoge pin A4, SCL analoge pin A5:
44#include <SFE_BMP180.h>
45#include <Wire.h>
46SFE_BMP180 bmp;
47char bmpStatus;
48#define ALTITUDE 6.0 //Hoogte van Sint-Katelijne-Waver in meter
49
50//WiFi Real Time Clock (RTC):
51#include <SPI.h>
52#include <WiFiNINA.h>
53#include <RTCZero.h>
54RTCZero rtc;
55char ssid[] = "WiFi-Debouver-2.4"; //WiFi naam (SSID): WiFi-Debouver-2.4 / LAPTOP-DRIES
56char pass[] = "UzpSk6g9D3E3"; //WiFi paswoord: UzpSk6g9D3E3 / Arduino2020
57//int keyIndex = 0; //Netwerk key index number
58int status = WL_IDLE_STATUS; //WiFi ontvanger status
59const int GMT = 1; //Tijdzone, Brussel = +1
60
61//WiFi Buiten Weer - Open Weather Map:
62#include <ArduinoJson.h>
63String apiKey = "61cb04e1c56086dd1670b0508cf2beb3"; //API Key OpenWeatherMap.org
64String location = "2786642"; //Sint-Katelijne-Waver, België
65char server[] = "api.openweathermap.org"; //Website of server die gebruikt wordt
66WiFiClient client;
67
68
69
70//De SETUP functie:
71void setup() {
72 Serial.begin(9600); //Serial Monitor
73 lcd.begin(16, 2); //LCD Scherm
74 dht.begin(); //DHT11 Sensor
75 bmp.begin(); //BMP180 Sensor
76
77 //Joystick knop:
78 pinMode(joystickSigPin, INPUT);
79 digitalWrite(joystickSigPin, HIGH);
80
81 //Status LED'S:
82 pinMode(groeneLedPin, OUTPUT);
83 pinMode(geleLedPin, OUTPUT);
84 pinMode(rodeLedPin, OUTPUT);
85
86 //WiFi Real Time Clock:
87 //check if the WiFi module works:
88 if (WiFi.status() == WL_NO_SHIELD) {
89 Serial.println("WiFi shield not present");
90 digitalWrite(rodeLedPin, HIGH);
91 // don't continue:
92 while (true);
93 }
94 String fv = WiFi.firmwareVersion();
95 if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
96 Serial.println("Please upgrade the firmware");
97 digitalWrite(rodeLedPin, HIGH);
98 }
99
100 //Groene LED laten flikkeren:
101 for (int i = 0; i < 20; i++) {
102 digitalWrite(groeneLedPin, HIGH);
103 delay(250);
104 digitalWrite(groeneLedPin, LOW);
105 delay(250);
106 }
107
108 //attempt to connect to WiFi network:
109 while (status != WL_CONNECTED) {
110 Serial.print("Attempting to connect to network: ");
111 Serial.println(ssid);
112 lcd.clear();
113 lcd.setCursor(0, 0);
114 lcd.print("Attempting to");
115 lcd.setCursor(0, 1);
116 lcd.print("connect to WiFi");
117 status = WiFi.begin(ssid, pass);
118 delay(10000);
119 }
120 if (status == WL_CONNECT_FAILED) {
121 digitalWrite(rodeLedPin, HIGH);
122 lcd.clear();
123 lcd.setCursor(0, 0);
124 lcd.print("Geen WiFi verb.");
125 }
126 //connected now:
127 printWiFiStatus();
128 digitalWrite(groeneLedPin, HIGH);
129 rtc.begin();
130 unsigned long epoch;
131 int numberOfTries = 0, maxTries = 6;
132 do {
133 epoch = WiFi.getTime();
134 numberOfTries++;
135 }
136 while ((epoch == 0) && (numberOfTries < maxTries));
137 if (numberOfTries == maxTries) {
138 Serial.print("NTP unreachable!!");
139 while (1);
140 } else {
141 Serial.print("Epoch received: ");
142 Serial.println(epoch);
143 rtc.setEpoch(epoch);
144 Serial.println();
145 }
146}
147
148
149
150//De LOOP functie:
151void loop() {
152 //delay(1000); //om de 1 seconde alles doen
153 Serial.println("\n***** ARDUINO WEERSTATION *****");
154
155 //Joystick waardes inlezen:
156 joystickX = analogRead(joystickVrxPin);
157 joystickY = analogRead(joystickVryPin);
158 joystickS = digitalRead(joystickSigPin);
159
160 //Joystick coördinaten op Serial Monitor om te testen (kan later weg):
161 Serial.println("\n- Joystick: -");
162 Serial.print("X: ");
163 Serial.println(joystickX);
164 Serial.print("Y: ");
165 Serial.println(joystickY);
166 Serial.print("Signal: ");
167 Serial.print(joystickS);
168 Serial.println(" (1 = Niet ingedrukt, 0 = Ingedrukt)");
169
170 //Verschillende schermen op LCD:
171 if (joystickX > 1000 || joystickX < 50 || joystickY > 1000 || joystickY < 50) { //Als joystick naar rechts, links, boven of onder gaat:
172 if (joystickX > 1000 || joystickY > 1000) { //Joystick naar rechts of naar beneden:
173 scherm++; //Volgend scherm.
174 digitalWrite(geleLedPin, HIGH);
175 delay(500);
176 digitalWrite(geleLedPin, LOW);
177 }
178 if (joystickX < 50 || joystickY < 50) { //Joystick naar links of naar boven:
179 scherm--; //Vorig scherm.
180 digitalWrite(geleLedPin, HIGH);
181 delay(500);
182 digitalWrite(geleLedPin, LOW);
183 }
184 }
185
186 if (scherm > 7 || scherm < 0) { //Als "scherm" aantal groter is dan hoeveelheid schermen er zijn of kleiner dan 0, zet terug op 0.
187 scherm = 0;
188 }
189
190 switch (scherm) {
191 case 0:
192 klok();
193 break;
194 case 1:
195 binnenTemp();
196 break;
197 case 2:
198 binnenHumi();
199 break;
200 case 3:
201 binnenDruk();
202 break;
203 case 4:
204 binnenLicht();
205 break;
206 case 5:
207 water();
208 break;
209 case 6:
210 buitenTemp();
211 break;
212 case 7:
213 buitenHumi();
214 break;
215 default:
216 lcd.clear();
217 lcd.setCursor(0, 0);
218 lcd.print("- WEERSTATION: -");
219 lcd.setCursor(0, 1);
220 lcd.print("Scherm: ");
221 lcd.print(scherm);
222 break;
223 }
224 Serial.print("\n***** Scherm: ");
225 Serial.print(scherm);
226 Serial.println(" *****");
227}
228
229
230
231//FUNCTIES:
232void klok() {
233 //Print op Serial Monitor:
234 Serial.println("\n- WiFi RTC: -");
235 printDate(); //Functie staat verder onderaan.
236 printTime(); //Functie staat verder onderaan.
237 //Print op LCD:
238 lcd.clear();
239 lcd.setCursor(0, 0);
240 lcd.print(rtc.getDay());
241 lcd.print("/");
242 lcd.print(rtc.getMonth());
243 lcd.print("/");
244 lcd.print(2000 + rtc.getYear());
245 lcd.setCursor(0, 1);
246 lcd.print(rtc.getHours() + GMT);
247 lcd.print(":");
248 lcd.print(rtc.getMinutes());
249 lcd.print(":");
250 lcd.print(rtc.getSeconds());
251 delay(1000);
252}
253
254void binnenTemp() {
255 //BMP180 Sensor:
256 bmpStatus = bmp.startTemperature();
257 if (bmpStatus != 0) {
258 delay(bmpStatus);
259 bmpStatus = bmp.getTemperature(tempBmp); //Pak de temperatuur en steek het in de variabele "tempBmp"
260 //Print op Serial Monitor:
261 Serial.println("\n- BMP180 Sensor: -");
262 Serial.print("Binnen Temperatuur: ");
263 Serial.print(tempBmp);
264 Serial.println(" °C");
265 //Print op LCD:
266 lcd.clear();
267 lcd.setCursor(0, 0);
268 lcd.print("Binnen temp:");
269 lcd.setCursor(0, 1);
270 lcd.print(tempBmp);
271 lcd.print(" "); //spatie
272 lcd.print((char)223); //"°" tekentje
273 lcd.print("C");
274 } else {
275 digitalWrite(rodeLedPin, HIGH);
276 }
277 delay(1000);
278}
279
280void binnenHumi() {
281 //DHT11 Sensor:
282 tempDht = dht.readTemperature();
283 humiDht = dht.readHumidity();
284 if (tempDht != NULL) {
285 //Print op Serial monitor:
286 Serial.println("\n- DHT11 Sensor: -");
287 Serial.print("Binnen Temperatuur: ");
288 Serial.print(tempDht);
289 Serial.println(" °C");
290 Serial.print("Binnen Vochtigheid: ");
291 Serial.print(humiDht);
292 Serial.println(" %");
293 //Print op LCD:
294 lcd.clear();
295 lcd.setCursor(0, 0);
296 lcd.print("Vochtigheid:");
297 lcd.setCursor(0, 1);
298 lcd.print(humiDht);
299 lcd.print(" %");
300 } else {
301 digitalWrite(rodeLedPin, HIGH);
302 }
303 delay(1000);
304}
305
306void binnenDruk() {
307 //BMP180 Sensor:
308 bmpStatus = bmp.startTemperature();
309 if (bmpStatus != 0) {
310 delay(bmpStatus);
311 bmpStatus = bmp.getTemperature(tempBmp); //Pak de temperatuur en steek het in de variabele "tempBmp"
312 if (bmpStatus != 0) {
313 bmpStatus = bmp.startPressure(3);
314 if (bmpStatus != 0) {
315 delay(bmpStatus);
316 bmpStatus = bmp.getPressure(presBmp, tempBmp); //Pak de druk (adhv "tempBmp") en steek het in de variabele "presBmp"
317 if (bmpStatus != 0) {
318 presBmpSea = bmp.sealevel(presBmp, ALTITUDE); //Pak de relatieve zee-niveau druk en steek het in de variabele "presBmpSea"
319 //Print op Serial Monitor:
320 Serial.print("Absolute druk: ");
321 Serial.print(presBmp);
322 Serial.println(" mb / hPa");
323 Serial.print("Hoogte: ");
324 Serial.print(ALTITUDE, 0);
325 Serial.println(" meter");
326 Serial.print("Relatieve (zee-niveau) druk: ");
327 Serial.print(presBmpSea, 2);
328 Serial.print(" mb, ");
329 Serial.print(presBmpSea * 0.0295333727, 2);
330 Serial.println(" inHg");
331 //Print op LCD:
332 lcd.clear();
333 lcd.setCursor(0, 0);
334 lcd.print("Absolute druk:");
335 lcd.setCursor(0, 1);
336 lcd.print(presBmp);
337 lcd.print(" mb / hPa");
338 } else {
339 digitalWrite(rodeLedPin, HIGH);
340 }
341 } else {
342 digitalWrite(rodeLedPin, HIGH);
343 }
344 } else {
345 digitalWrite(rodeLedPin, HIGH);
346 }
347 } else {
348 digitalWrite(rodeLedPin, HIGH);
349 }
350 delay(1000);
351}
352
353void binnenLicht() {
354 //Lichtsterkte LDR Sensor - analoge pin A0:
355 lightLdr = analogRead(lightLdrPin);
356 if (lightLdr != NULL) {
357 //Print op Serial Monitor:
358 Serial.println("\n- LDR Sensor: -");
359 Serial.print(lightLdr);
360 if (lightLdr < 800) {
361 Serial.println(" = Donker");
362 } else {
363 Serial.println(" = Licht");
364 }
365 //Print op LCD:
366 lcd.clear();
367 lcd.setCursor(0, 0);
368 lcd.print("Lichtsterkte:");
369 lcd.setCursor(0, 1);
370 lcd.print(lightLdr);
371 if (lightLdr < 800) {
372 lcd.print(" = Donker");
373 } else {
374 lcd.print(" = Licht");
375 }
376 } else {
377 digitalWrite(rodeLedPin, HIGH);
378 }
379 delay(1000);
380}
381
382void water() {
383 //Water Sensor - analoge pin A1:
384 waterSen = analogRead(waterSenPin);
385 if (waterSen != NULL) {
386 //Print op Serial Monitor:
387 Serial.println("\n- Water Sensor: -");
388 Serial.print("Signal: ");
389 Serial.print(waterSen);
390 if (waterSen < 100) {
391 Serial.println(" = Droog");
392 } else if (waterSen > 100 && waterSen < 300) {
393 Serial.println(" = Beetje nat");
394 } else {
395 Serial.println(" = Nat");
396 }
397 //Print op LCD:
398 lcd.clear();
399 lcd.setCursor(0, 0);
400 lcd.print("Water sensor:");
401 lcd.setCursor(0, 1);
402 lcd.print(waterSen);
403 if (waterSen < 100) {
404 lcd.print(" = Droog");
405 } else if (waterSen > 100 && waterSen < 300) {
406 lcd.print(" = Beetje nat");
407 } else {
408 lcd.print(" = Nat");
409 }
410 } else {
411 digitalWrite(rodeLedPin, HIGH);
412 }
413 delay(1000);
414}
415
416void buitenTemp() {
417 Serial.println("\n- Buiten Temperatuur via WiFi: -");
418 Serial.println("Starting connection to server...");
419 // if you get a connection, report back via serial:
420 if (client.connect(server, 80)) {
421 Serial.println("Connected to server");
422 // Make a HTTP request:
423 client.print("GET /data/2.5/forecast?");
424 client.print("id=" + location);
425 client.print("&appid=" + apiKey);
426 client.print("&cnt=1"); //bepaalde hoeveelheid lists ophalen, hier 1, 8 per dag maximum.
427 client.println("&units=metric");
428 client.println("Host: api.openweathermap.org");
429 client.println("Connection: close");
430 client.println();
431 } else {
432 Serial.println("Unable to connect");
433 digitalWrite(rodeLedPin, HIGH);
434 lcd.clear();
435 lcd.setCursor(0, 0);
436 lcd.print("No connection");
437 }
438 delay(1000);
439 String line = "";
440 while (client.connected()) {
441 line = client.readStringUntil('\n');
442 StaticJsonDocument<10000> doc;
443 DeserializationError error = deserializeJson(doc, line);
444 if (error) {
445 Serial.print("deserializeJson() failed with code ");
446 Serial.println(error.c_str());
447 digitalWrite(rodeLedPin, HIGH);
448 return;
449 }
450 //get the data from the JSON tree:
451 //HUIDIGE TEMPERATUUR BUITEN:
452 String tempWifi = doc["list"][0]["main"]["temp"];
453 if (tempWifi != "") {
454 //Print op Serial Monitor:
455 Serial.print("Temperatuur buiten: ");
456 Serial.print(tempWifi);
457 Serial.println(" °C");
458 //Print op LCD:
459 lcd.clear();
460 lcd.setCursor(0, 0);
461 lcd.print("Buiten temp:");
462 lcd.setCursor(0, 1);
463 lcd.print(tempWifi);
464 lcd.print(" "); //spatie
465 lcd.print((char)223); //"°" tekentje
466 lcd.print("C");
467 } else {
468 digitalWrite(rodeLedPin, HIGH);
469 }
470 }
471 //delay(10000);
472}
473
474void buitenHumi() {
475 Serial.println("\n- Buiten Vochtigheid via WiFi: -");
476 Serial.println("Starting connection to server...");
477 // if you get a connection, report back via serial:
478 if (client.connect(server, 80)) {
479 Serial.println("Connected to server");
480 // Make a HTTP request:
481 client.print("GET /data/2.5/forecast?");
482 client.print("id=" + location);
483 client.print("&appid=" + apiKey);
484 client.print("&cnt=1"); //bepaalde hoeveelheid lists ophalen, 8 per dag.
485 client.println("&units=metric");
486 client.println("Host: api.openweathermap.org");
487 client.println("Connection: close");
488 client.println();
489 } else {
490 Serial.println("Unable to connect");
491 digitalWrite(rodeLedPin, HIGH);
492 lcd.clear();
493 lcd.setCursor(0, 0);
494 lcd.print("No connection");
495 }
496 delay(1000);
497 String line = "";
498 while (client.connected()) {
499 line = client.readStringUntil('\n');
500 StaticJsonDocument<10000> doc;
501 DeserializationError error = deserializeJson(doc, line);
502 if (error) {
503 Serial.print("deserializeJson() failed with code ");
504 Serial.println(error.c_str());
505 digitalWrite(rodeLedPin, HIGH);
506 return;
507 }
508 //get the data from the json tree:
509 //HUIDIGE VOCHTIGHEID BUITEN:
510 String humiWifi = doc["list"][0]["main"]["humidity"];
511 if (humiWifi != "") {
512 //Print op Serial Monitor:
513 Serial.print("Vochtigheid buiten: ");
514 Serial.print(humiWifi);
515 Serial.println(" %");
516 //Print op LCD:
517 lcd.clear();
518 lcd.setCursor(0, 0);
519 lcd.print("Buiten vochtigh:");
520 lcd.setCursor(0, 1);
521 lcd.print(humiWifi);
522 lcd.print(" %");
523 } else {
524 digitalWrite(rodeLedPin, HIGH);
525 }
526 //delay(10000);
527 }
528}
529
530void printDate() {
531 Serial.print(rtc.getDay());
532 Serial.print("/");
533 Serial.print(rtc.getMonth());
534 Serial.print("/");
535 Serial.print(2000 + rtc.getYear());
536 Serial.println();
537}
538
539void printTime() {
540 print2digits(rtc.getHours() + GMT);
541 Serial.print(":");
542 print2digits(rtc.getMinutes());
543 Serial.print(":");
544 print2digits(rtc.getSeconds());
545 Serial.println();
546}
547
548void print2digits(int number) {
549 if (number < 10) {
550 Serial.print("0");
551 }
552 Serial.print(number);
553}
554
555void printWiFiStatus() {
556 // print the SSID of the network you're attached to:
557 Serial.print("SSID: ");
558 Serial.println(WiFi.SSID());
559 // print your WiFi shield's IP address:
560 IPAddress ip = WiFi.localIP();
561 Serial.print("IP Address: ");
562 Serial.println(ip);
563 // print the received signal strength:
564 long rssi = WiFi.RSSI();
565 Serial.print("signal strength (RSSI):");
566 Serial.print(rssi);
567 Serial.println(" dBm");
568}