#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// -------- WiFi --------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// -------- AWS --------
const char* awsEndpoint = "ascni792cm7b-ats.iot.ap-south-1.amazonaws.com";
const char* topic = "gg_fandv/data";
WiFiClientSecure net;
PubSubClient client(net);
const char* root_ca = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
rqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----)EOF";
const char* device_cert = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDWTCCAkGgAwIBAgIUWSe3FEdUPab498dmPAunk4/qfGAwDQYJKoZIhvcNAQEL
BQAwTTFLMEkGA1UECwxCQW1hem9uIFdlYiBTZXJ2aWNlcyBPPUFtYXpvbi5jb20g
SW5jLiBMPVNlYXR0bGUgU1Q9V2FzaGluZ3RvbiBDPVVTMB4XDTI2MDQxMTExMTEz
MVoXDTQ5MTIzMTIzNTk1OVowHjEcMBoGA1UEAwwTQVdTIElvVCBDZXJ0aWZpY2F0
ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOS6QTw2QWidiAKDU8SA
dAnE8HgziBlEw9ZC1QEW5gAdKyjvIqnm8vc60gMExXVJ0eQHF+ngByIQwhJDdzLP
XGetzHeGVgWk1tMMiEiYFNJk9A2alTKXGVV0MFSsE86NDYnU1xo2vpQtsxnfZ8Ey
8T4T9IpSAW1zSe2AhTsxETgPCyyGQjMkTjzxiH7MSIr9ISbTnLavaypqzY3yX+2s
rtXdbhAgUEspAPP5JGPjbWdcuszdoJ9J61BcmbBs+J+HRrNF+DoOtY2WCweRIWP7
RCCaR8x5dR5af95YJ1d3V02vsSZDVgFTxTrovLr/Z/rwhi/FAxMyTajJEcUSoIv4
b10CAwEAAaNgMF4wHwYDVR0jBBgwFoAUEG354tJYoRhJZq0953jFI+wCkYYwHQYD
VR0OBBYEFPa14S3rl7pXoTe3L+3XPipnPIK7MAwGA1UdEwEB/wQCMAAwDgYDVR0P
AQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4IBAQBSUCEhyXOPg7AN4FbfCdj5HUbN
6ez1wGlhZ6+G7fICv8Cn9GhVaaIouiZtsNAgPRVRoEr23KtlAzBJD6TD+/i32N1l
eBTIn0GCj1mtis+VJ6vxDhgnN6/5maZvp099u1mjOix4z7cW6cIV8Pktm4oEbd8M
Itn3feVVtlWKpq6hBAaYBCruw5LJxcXsONdb2BU9vQUkJRXKqelwVyYy9QiUqex1
3DZA7/pW4U5QUORFmJLeIPBtdM2R85kCdKhy+dKcy8woh26hMYkXEMP0FyoWOrdE
1upxd1xznylkqgKmK9sY+54mDbjCr+LBbRam0/p5S2KVIQgt9g/TdJdCkTTb
-----END CERTIFICATE-----
)EOF";
const char* private_key = R"EOF(
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA5LpBPDZBaJ2IAoNTxIB0CcTweDOIGUTD1kLVARbmAB0rKO8i
qeby9zrSAwTFdUnR5AcX6eAHIhDCEkN3Ms9cZ63Md4ZWBaTW0wyISJgU0mT0DZqV
MpcZVXQwVKwTzo0NidTXGja+lC2zGd9nwTLxPhP0ilIBbXNJ7YCFOzEROA8LLIZC
MyROPPGIfsxIiv0hJtOctq9rKmrNjfJf7ayu1d1uECBQSykA8/kkY+NtZ1y6zN2g
n0nrUFyZsGz4n4dGs0X4Og61jZYLB5EhY/tEIJpHzHl1Hlp/3lgnV3dXTa+xJkNW
AVPFOui8uv9n+vCGL8UDEzJNqMkRxRKgi/hvXQIDAQABAoIBADIpmwb+iyfLbLnI
XYW5+jjuRSLHgnCwQRbrf1WG1RhvTTjkAUEr0ltgPhDFahzH/M06tQboyAezjyx8
OVceXRCr8CzCfHkuZqLQm87385EU7OVS4qe+taKlIbhgKNPi4XY6BJbOLMvInf/t
nA6mAnxv2fC//Woon60Dw7RwlWsqjz8496TXdqYhC1vQPsi5yaHUu+jhCD89rsSV
vw6w6cAo6Law3SDMgOB2bIa373loioL75YevRF6iO0NOYrklr6lT4P10cdK+ajFf
8WsH5/6Vmvh+5YFq44KVtvC+VXjpGh8y0p5a5JpW2UKU/JvFYq2CADcU2+ml5Pqc
bOauqoECgYEA+qk+yKRJskHh8ndwUCEmiOWk4Pd85GJ8che6M/ocoPOG3hQW+szK
Y1+b+sDo/83x8nDGvQ278L5Ese1RSbAgkiJGvPMcbdtTxC13z/gT8CVtKYrleufg
L4bTAbkPOWl/mV7PwDIdVVp5F3K9n4TDM9gjjcVVbP8cgtwqf6JGqeECgYEA6Zlq
J9NxX0UJQSAbJRWZWoKUIxONV+o4Bi1YQYfge0wABSvd8vxtA0Oe2bch288HSnYD
5KB75kSIZwyMxBXZJUHn4B0VGJCJwQ7jiDD6fg9qt5c7/XwF/Yd/2QE33MmDqY7m
6nHomloq3bNMN43iQeL9tQyDJR6yaC3maNmsDP0CgYB2KT5NexS6kVAf6qnpPBdc
RVUaL9CSINMlPYYrZmYEgYg8PCAxDkUB31o6NKIhpEW/0eX9zPGhpS/g6Ex/fiV8
fef2vmvSZafxPLXUNc/ATwRMpwtSiuglv1rM3x4MJG1gMU+h/H3TdJjMsuwsvHsA
f40TEckZXpFkJsFp9Wd2QQKBgGj0+1Nll3zcwem3CTtCVyLppLGV6V3k6MMtwIfB
C0Wawi+QpCq27CwZR9g+hkIC5R25pMomqUSu6jKS2vSHdIde81Yo+v+Mgbhyfh0F
FKdrOeG/W77q6K4fIXxZJcZX7IZUpMAV6hLgDH6MPuR/JXfBC4k7U/lrr3FLnkjh
9IHpAoGAMYWpMsM2RTHjmUsh9dD+dEWJybupXiYr/jTtCbl3VSMAV91FC/C2vr0L
GuHvJv3WNooHgD0EFroPAP/ltbdM/dGlpf2k2R5Uj4gJZ7JC5wL3gOJf63xP+MVS
b5NijZL3rvEZuFu+A7oRW4NfDDLwUiHVxh7A8RiFnLJieMU4X6Y=
-----END RSA PRIVATE KEY-----
)EOF";
// -------- Sensors --------
#define DHTPIN 4
#define DHTTYPE DHT22
#define MQ2_PIN 34
#define CO2_PIN 32
#define ONE_WIRE_BUS 5
#define MUX_SIG 35
#define S0 12
#define S1 13
#define S2 14
#define S3 27
#define MUX_CH_MICS 5
DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature waterSensor(&oneWire);
// -------- MUX --------
void selectMuxChannel(int ch) {
digitalWrite(S0, ch & 1);
digitalWrite(S1, (ch >> 1) & 1);
digitalWrite(S2, (ch >> 2) & 1);
digitalWrite(S3, (ch >> 3) & 1);
}
// -------- Sensor Reads --------
float readAmmonia() {
int raw = analogRead(MQ2_PIN);
return constrain((raw / 4095.0) * 100.0, 0, 100);
}
float readCO2() {
int raw = analogRead(CO2_PIN);
float volts = (raw / 4095.0) * 3.3;
return constrain(volts * (3767.26112 / 2.3), 400, 5000);
}
float readEthylene() {
selectMuxChannel(MUX_CH_MICS);
delay(10);
int raw = analogRead(MUX_SIG);
return constrain((raw / 4095.0) * 100.0, 0, 100);
}
// -------- AWS Connect --------
void connectAWS() {
WiFi.begin(ssid, password);
Serial.print("Connecting WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected");
net.setCACert(root_ca);
net.setCertificate(device_cert);
net.setPrivateKey(private_key);
client.setServer(awsEndpoint, 8883);
while (!client.connected()) {
Serial.print("Connecting to AWS...");
if (client.connect("gg_fandv")) {
Serial.println("Connected!");
} else {
Serial.print("Failed rc=");
Serial.println(client.state());
delay(2000);
}
}
}
// -------- Publish --------
void sendToAWS(float hum, float temp, float waterTemp,
float ammonia, float co2, float ethylene) {
String payload = "{";
payload += "\"device_id\":\"gg_fandv\",";
payload += "\"timestamp\":" + String(millis()) + ",";
payload += "\"temperature\":" + String(temp) + ",";
payload += "\"humidity\":" + String(hum) + ",";
payload += "\"waterTemp\":" + String(waterTemp) + ",";
payload += "\"ammonia\":" + String(ammonia) + ",";
payload += "\"co2\":" + String(co2) + ",";
payload += "\"ethylene\":" + String(ethylene);
payload += "}";
client.publish(topic, payload.c_str());
Serial.println("Sent to AWS:");
Serial.println(payload);
}
// -------- Setup --------
void setup() {
Serial.begin(115200);
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
dht.begin();
waterSensor.begin();
connectAWS();
}
// -------- Loop --------
void loop() {
client.loop(); // keep MQTT alive
float humidity = dht.readHumidity();
float temp = dht.readTemperature();
waterSensor.requestTemperatures();
float waterTemp = waterSensor.getTempCByIndex(0);
float ammonia = readAmmonia();
float co2 = readCO2();
float ethylene = readEthylene();
Serial.println("----- SENSOR DATA -----");
Serial.println(temp);
Serial.println(humidity);
Serial.println(waterTemp);
Serial.println(ammonia);
Serial.println(co2);
Serial.println(ethylene);
sendToAWS(humidity, temp, waterTemp, ammonia, co2, ethylene);
Serial.println(client.connected());
delay(10000); // ๐ฅ IMPORTANT (prevents server overload)
}
Loading
cd74hc4067
cd74hc4067