Add "grande chambre" (using esp8266 nodemcu)
[manu/arduino-maison.git] / station-meteo / station-meteo.ino
1 // D4: temperature sensor
2 // D2: rain sensor
3
4 // Include the libraries we need
5
6 #include <SPI.h>
7 #include <WiFiNINA.h>
8 #include <WiFiUdp.h>
9 #include <OneWire.h>
10 #include <DallasTemperature.h>
11 #include "station-meteo-config.h"
12
13 // Wifi configuration
14 char wifi_ssid[] = WIFI_SSID; //  your network SSID (name)
15 char wifi_pass[] = WIFI_PASS;    // your network password (use for WPA, or use as key for WEP)
16 int wifi_status = WL_IDLE_STATUS;     // the Wifi radio's status
17
18 // Influxdb configuration
19 byte influxdb_host[] = INFLUXDB_IP;
20 int influxdb_port = INFLUXDB_PORT;
21 unsigned int udp_localport = 2390;
22 String city = CITY;
23 String location = LOCATION;
24
25 // Temperature sensor
26 #define ONE_WIRE_BUS 4
27
28 // Rain fall sensor
29 int rainfall_sensor_pin = 2;
30 float rain_incr = 0.2794; // this is mm/m2 for each sensor tick 
31 int rainfall_ticks = 0;
32
33 // Timing
34 unsigned long previousMillis=   0;
35 unsigned long previousMillis2=  0;
36
37 // Initiate udp client
38 WiFiUDP udp;
39
40 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
41 OneWire oneWire(ONE_WIRE_BUS);
42
43 // Pass our oneWire reference to Dallas Temperature. 
44 DallasTemperature sensors(&oneWire);
45
46 /*
47  * The setup function. We only start the sensors here
48  */
49 void setup(void)
50 {
51   // start serial port
52   Serial.begin(9600);
53
54   // Start up the onewire library for temp sensor
55   sensors.begin();
56   
57   pinMode(rainfall_sensor_pin, INPUT);
58   attachInterrupt(digitalPinToInterrupt(rainfall_sensor_pin), getRain, RISING);
59
60   // check for the WiFi module:
61   if (WiFi.status() == WL_NO_MODULE) {
62     Serial.println("Communication with WiFi module failed!");
63     // don't continue
64     while (true);
65   }
66
67   String fv = WiFi.firmwareVersion();
68   if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
69     Serial.println("Please upgrade the firmware");
70   }
71
72   Serial.print("Attempting to connect to SSID: ");
73   Serial.println(wifi_ssid);
74   // Connect to WPA/WPA2 network
75   WiFi.begin(wifi_ssid, wifi_pass);
76   delay(500);
77
78   // attempt to connect to Wifi network:
79   while (WiFi.status() != WL_CONNECTED) {
80     WiFi.begin(wifi_ssid, wifi_pass);
81     delay(500);
82     if (WiFi.status() != WL_CONNECTED) {
83         delay(2000);
84     }
85   }
86
87   Serial.println("Connected to wifi");
88   printWifiStatus();
89
90   udp.begin(udp_localport);
91 }
92
93 /*
94  * Main function, get and show the temperature
95  */
96 void loop(void)
97
98   delay(POLL_INT);
99   
100   // Reconnect if needed
101   while (WiFi.status() != WL_CONNECTED) {
102       WiFi.begin(wifi_ssid, wifi_pass);
103       delay(500);
104       if (WiFi.status() != WL_CONNECTED) {
105           delay(2000);
106       }
107   }
108
109   if ( WiFi.status() == WL_CONNECTED ) {
110       String temp_influx_line;
111       String rain_influx_line;
112       float rainfall_1min(0);
113       float tempC(0);
114       
115       // Get rainfall height
116       rainfall_1min = rainfall_ticks * rain_incr;
117       rainfall_ticks = 0;
118       Serial.print("Rain mm/m2: ");
119       Serial.println(rainfall_1min);
120       Serial.println("Sending rain height to influxdb...");
121       rain_influx_line = String("rain,city="+city+",location="+location+" value=" + String(rainfall_1min, 2));
122       udp.beginPacket(influxdb_host, influxdb_port);
123       udp.print(rain_influx_line);
124       udp.endPacket();
125
126       // Temperature
127       tempC = get_temperature();
128       // Check if reading was successful
129       if(tempC != DEVICE_DISCONNECTED_C) 
130       {
131         Serial.print("Temperature for the device 1 (index 0) is: ");
132         Serial.println(tempC);
133         temp_influx_line = String("temperature,city="+city+",location="+location+" value=" + String(tempC, 2));
134         // send the packet
135         Serial.println("Sending UDP packet...");
136         udp.beginPacket(influxdb_host, influxdb_port);
137         udp.print(temp_influx_line);
138         udp.endPacket();
139       } 
140       else
141       {
142         Serial.println("Error: Could not read temperature data");
143       }
144   }
145 }
146
147
148 float get_temperature() {
149   float tempC(0);
150   // call sensors.requestTemperatures() to issue a global temperature 
151   // request to all devices on the bus
152   Serial.print("Requesting temperatures...");
153   sensors.requestTemperatures(); // Send the command to get temperatures
154   Serial.println("DONE");
155   // After we got the temperatures, we can print them here.
156   // We use the function ByIndex, we have only one sensor.
157   tempC = sensors.getTempCByIndex(0);
158   return tempC;
159 }
160
161
162 void printWifiStatus() {
163   // print the SSID of the network you're attached to:
164   Serial.print("SSID: ");
165   Serial.println(WiFi.SSID());
166
167   // print your board's IP address:
168   IPAddress ip = WiFi.localIP();
169   Serial.print("IP Address: ");
170   Serial.println(ip);
171
172   // print the received signal strength:
173   long rssi = WiFi.RSSI();
174   Serial.print("signal strength (RSSI):");
175   Serial.print(rssi);
176   Serial.println(" dBm");
177 }
178
179 void getRain ()
180 {
181   rainfall_ticks ++ ; 
182 }