I have a project which measures temperature, humidity and voltage (of a battery) in a room, turns on two relays based on it and logs this data to excel. The problem is that the place where it has be doployed has no WiFi, so I am using a SIM800L Module. I looked for many videos but I really can't understand. I need some guidance.
My code is given below:
#include "DHT.h"
#include "Wire.h"
#include "Adafruit_SH110X.h"
#include "WiFiS3.h"
#include "ArduinoHttpClient.h"
Adafruit_SH1106G display(128,64,&Wire,-1);
#define DHTPIN 2
#define DHTTYPE DHT11
#define v_in A0
#define fan 7
#define battery 8
int fan_state;
int bat_state;
float R1= 30000.0;
float R2= 7500.0;
float ref_volt= 5.0;
int adc_val= 0;
unsigned long last_send_time = 0;
unsigned long runtime = 0;
int allowFirstTime = 2;
int statusCode;
DHT dht(DHTPIN,DHTTYPE);
char ssid[]="my_wifi_ssid";
char pass[]="my_wifi_pass";
char serverAddress[] = "script.google.com";
String scriptPath = "/macros/s/my_apps_script_code/exec";
WiFiSSLClient wifi;
HttpClient client = HttpClient(wifi, serverAddress, 443);
void setup() {
Serial.begin(9600);
pinMode(DHTPIN,INPUT);
pinMode(fan,OUTPUT);
pinMode(battery,OUTPUT);
display.begin(0x3C,true);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(0,0);
dht.begin();
WiFi.begin(ssid, pass);
while (WiFi.status()!=WL_CONNECTED) {
Serial.println("Connecting to WiFi....");
display.println("Connecting to WiFi....");
display.display();
delay(3000);
}
Serial.print("---Connected to Wifi----");
display.println("Connected to WiFi");
display.display();
}
void loop() {
display.clearDisplay();
display.setCursor(0,0);
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi lost, reconnecting...");
display.println("WiFi gone, reconnecting");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
Serial.println("Reconnected!");
display.println("Reconnected!");
display.display();
}
delay(1000);
display.clearDisplay();
runtime=millis();
if (runtime < last_send_time){
last_send_time= 0;
}
float h = dht.readHumidity();
float t = dht.readTemperature();
float hic = dht.computeHeatIndex(t, h, false);
adc_val=analogRead(v_in);
float adc_volt = (adc_val*ref_volt)/1024;
float in_volt = adc_volt * (R1+R2)/R2;
float real_volt;
if (in_volt > 0.37){
real_volt = in_volt - 0.37;
}else{
real_volt = in_volt;
}
if (t >= 40){
digitalWrite(fan,LOW);
fan_state=1;
}else{
digitalWrite(fan,HIGH);
fan_state=0;
}
if (real_volt > 11.6){
digitalWrite(battery,LOW);
bat_state=1;
}else{
digitalWrite(battery,HIGH);
bat_state= 0;
}
Serial.print("Temperature: ");
Serial.println(t);
Serial.print("Humidity: ");
Serial.println(h);
Serial.print("Voltage: ");
Serial.println(real_volt);
display.setCursor(0,0);
display.print("Temperature: ");
display.println(t);
display.print("Humidity: ");
display.println(h);
display.print("Voltage: ");
display.println(real_volt);
if (fan_state==1){
display.println("Fan: ON");
}else{
display.println("Fan: OFF");
}
if (bat_state==1){
display.println("Battery Relay: ON");
}else{
display.println("Battery Relay: OFF");
}
display.display();
if ((runtime-last_send_time)>= 300000 || allowFirstTime > 0){ //300000 milliseconds=5 minutes
String getPath = scriptPath;
getPath += "?temperature=" + String(t);
getPath += "&humidity=" + String(h);
getPath += "&voltage=" + String(real_volt);
getPath += "&fan=" + String(fan_state);
getPath += "&battery=" + String(bat_state);
client.stop();
client.get(getPath);
last_send_time = millis();
statusCode = client.responseStatusCode();
String response = client.responseBody();
Serial.println(getPath);
Serial.println(statusCode);
if (allowFirstTime > 0){
allowFirstTime -=1;
}else{
allowFirstTime =0;
}
}
display.print("Status Code:");
display.println(statusCode);
display.display();
delay(2000);
}