-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
10_CLIMA_CODE_ARDUINO_IDE_JSON_TO_AWS.ino
166 lines (134 loc) · 7.14 KB
/
10_CLIMA_CODE_ARDUINO_IDE_JSON_TO_AWS.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/*
`~= CLIMA: Client-Linked Integration of Meteorological Activity =~´
This Arduino IDE Sketch reads meteorological inputs from three sensors attached to a NodeMCU ESP8266 circuit board:
1. Rainfall Sensor with Potentiometer [Analog] >> Goes to ESP8266 Pin: A0
2. Photoresistor Sensor with Potentiometer (for daylight monitoring) [Digital] >> Goes to ESP8266 Pin: D3
3. Digital Humidity & Temperature Sensor (DHT11) [Digital] >> Goes to ESP8266 Pin: D4
An additional Real-Time Clock module (DS3231 RTC) is used to generate a Datestamp for each Sensor Readout instance [Digital] >> Goes to ESP8266 Pin: SDA / D1, Pin: SCL / D2
The Arduino IDE Sketch assumes that the Sensor Readout occurs within a fixed LATITUDE / LONGITUDE which corresponds to the store location of interest.
The Arduino IDE Sketch prints a sensor readout in JSON format every 400 miliseconds [0.4 second = 2.5 Mhz], in the following order:
- Timestamp Data Series [Generated by the DS3231 RTC module and printed in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ (e.g., 2023-11-14T08:55:00Z)].
- dayOfTheWeek [Generated by the DS3231 RTC module and printed as a string datapoint for data enrichment purposes.]
- storeLocationLatitude [Predefined LATITUDE fixed value for the Store Datapoint.]
- storeLocationLongitude [Predefined LONGITUDE fixed value for the Store Datapoint.]
- rain = Value generated by the Rainfall Sensor [A0, analog, the sensor generates a value from 1024 being DRY to 0 being a deluge rain fall.]
- light = Value generated by the photoresistor [D3, boolean, signal range being either: "0" light (ie daytime), or "1" no light (ie nightime). Calibration of threshold is done via the Potentiometer]
- temperature = Value generated by the DHT11 sensor [D4, int, celcius range from 0 to 50.]
- airhumidity = Value generated by the DHT11 sensor [D4, int, percentual relative humidity range from 5 to 90]
The Arduino IDE Sketch sends the resulting JSON-formated sensor readout directly to AWS via WiFi connection for further processing within the desfined CLIMA Data Pipeline.
This example code is in the public domain.
https://github.com/noospheracr/clima
*/
// ===== THE LIBRARY INCLUSION ROUTINE (make sure to install in your Arduino Library first) =====
#include <ESP8266WiFi.h> // WiFi Connection
#include "RTClib.h" // Real-Time Clock module (DS3231 RTC)
#include <Wire.h> // General Arduino wiring library
#include <ArduinoJson.h> // JSON libraries to create the JSON string to be sent to AWS
#include <DHT.h> // DHT Sensor Libraries
#include <DHT_U.h> // DHT Sensor Libraries
// ===== THE VARIABLE DECLARATION ROUTINE =====
// ~~~~~ WiFi Network: Credentials
const char* ssid = "Huesped1"; // Replace with your own
const char* password = "Pisha069"; // Replace with your own
// ~~~~~ Real-Time Clock module (DS3231 RTC)
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// ~~~~~ The Location Coordinates of the Store Datapoint
const char* storeLocationLatitude = "9.9546116588293"; // Update with Store Datapoint latitude, stored as a string to be printed fully on the output.
const char* storeLocationLongitude = "-84.04724487770096"; // Update with Store Datapoint longitude, stored as a string to be printed fully on the output.
// ~~~~~ The Digital Sensor Variables
const int photoSensorPin = D3; // Photosensor connected to D3
int SENSOR = D4; // DATA from the DHT11 on digital pin 8
DHT dht(SENSOR, DHT11); // The DHT11 Digital Sensor object is created.
// ===== THE SETUP ROUTINE =====
void setup() {
Serial.begin(115200);
delay(10);
// ~~~~~ WiFi Network: Connection
// Serial.println();
// Serial.println();
// Serial.print("Connecting to ");
// Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Serial.println("");
// Serial.println("WiFi connected");
// Serial.println("IP address: ");
// Serial.println(WiFi.localIP());
// ~~~~~ Real-Time Clock module (DS3231 RTC): Setup
#ifndef ESP8266
while (!Serial); // wait for serial port to connect. Needed for native USB
#endif
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
// When time needs to be set on a new device, or after a power loss, the
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
// When time needs to be re-set on a previously configured device, the
// following line sets the RTC to the date & time this sketch was compiled
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
// ~~~~~ Digital Pins: Setup
pinMode(photoSensorPin, INPUT); // Set D3 as an input for the Photosensor
// ~~~~~ DHT11 Module: Setup
dht.begin();
}
// THE ZERO PADDING ROUTINE FOR ISO 8601 DATESTAMP COMPLIANCE:
void printTwoDigits(int number) {
if (number < 10) {
Serial.print("0");
}
Serial.print(number, DEC);
}
// ===== THE SENSOR READOUT & PRINT ROUTINE =====
void loop() {
// ~~~~~ READ: Meteorological Sensor Data
int rain = analogRead(A0); // Reads the input on analog pin A0, and stores it in 'rain'.
int light = digitalRead(photoSensorPin); // Reads the input on digital pin D3, and stores it in 'light'.
int temperature = dht.readTemperature(); // Reads the Temperature sensor input on DHT11, and stores it in 'temperature'.
int airhumidity = dht.readHumidity(); // Reads the Humidity sensor input on DHT11, and stores it in 'airhumidity'.
// ~~~~~ READ: DS3231 RTC Timestamp with Day of Week
DateTime now = rtc.now();
char timestamp[25];
sprintf(timestamp, "%04d-%02d-%02dT%02d:%02d:%02dZ",
now.year(), now.month(), now.day(),
now.hour(), now.minute(), now.second());
// ~~~~~ CREATE: JSON object
StaticJsonDocument<200> doc;
doc["DateTime"] = timestamp; // Timestamp printed in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ
doc["daysOfTheWeek"] = daysOfTheWeek[now.dayOfTheWeek()]; // Day of the week
doc["storeLocationLatitude"] = storeLocationLatitude;
doc["storeLocationLongitude"] = storeLocationLongitude;
doc["rain"] = rain;
doc["light"] = light;
doc["temperature"] = temperature;
doc["airhumidity"] = airhumidity;
// ~~~~ SERIALIZE: JSON to string
String output;
serializeJson(doc, output);
// ~~~~ Print to Serial
Serial.println(output);
delay(400); // 400 miliseconds [0.4 second = 2.5 Mhz]
}
// ===== THE SEND TO AWS VIA WI-FI ROUTINE =====
// void sendDataToAWS(String data) {
// Serial.print(".");
// Use AT commands to send data to AWS
// Example: AT+CIPSTART="TCP","your.api.endpoint",port
// Example: AT+CIPSEND=...
// Send your HTTP request with data
// }