Before creating the topic
- Search forum for similar topics
- Check http://docs.blynk.cc and http://help.blynk.cc/
- Add details :
• Hardware model + communication type. For example: Arduino UNO with Ethernet Shield
• Smartphone OS (iOS or Android) + version
• Blynk server or local server
• Blynk Library version
• Add your sketch code. Code should be formatted as example below.
Simply paste your code between ``` If you don’t format your code, your topic can be deleted by moderators.
#define BLYNK_TEMPLATE_ID "TMPID"
#define BLYNK_TEMPLATE_NAME "ESP32 TRUCK"
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <WiFi.h>
#include <WiFiMulti.h>
#include <BlynkSimpleEsp32.h>
#include <Update.h>
#include <HTTPClient.h>
#define BLYNK_AUTH_TOKEN "TOKEN"
#define BLYNK_PRINT Serial
#define BLYNK_FIRMWARE_VERSION "0.1.0"
#define USE_ESP32_DEV_MODULE
#define rainLED 21 // Yellow
#define battV 39 //Orange
int updn=16; //Green/Wht
#define ign 17 // Gray
#define rollupPin 18 //Green
#define rolldnPin 23 //Blu/Wht
#define rainSensor 36 //Purple
#define DHTTYPE DHT11
#define DHTPIN 19 //Sensor Green
DHT dht(DHTPIN, DHTTYPE);
WiFiMulti wifiMulti;
char auth[] = BLYNK_AUTH_TOKEN;
String ssid = "yourNetwork";
int previousMillis;
int runOnce = 1; // starts void loop() once, upon loading program changes.
volatile int stopRoll = 0;
int roll_pin = 0;
int RollIt = 0;
int RollTime = 3000; //window motor activation period
int waitFlag = 0;
int ventTime = 500; // set roll dn interval for vent
int venteD = 0;
int FullVent = 0;
volatile int up_dn = 1;
volatile int doneFlag = 1;
int raineD = 0;
int RS = 955;
int RAW = 0;
int RSlow = 1024; //lowest rain sensor value recorded
int RSthresh = 700; //rain sensor threshold
int RSoffset = 0;
int RSNow = 1023;
int RSdiv = 1023;
int Maxhumidity = 0;
float Mintemp = 110;
float Maxtemp = 0;
int Hyst = 200; //rain sensor hysteresis setting
int humidHyst = 5; // Humidity sensor Hysteresis
int ct; // counter variable
float humeCal = 1.0; // Humidity sensor calibration offset multiplier
float pressNow = 0;
float tempF = 0;
float tempCal = -3;
float humid =65;
float tempSet = 50; //set temprature threshold in F
float battSet = 11.0; //battery alarm threshhold
int Debug = 1; // set to 0 to skip delay
int interval = 10000;
int connectTimeoutMs = 10000;
int EnableIntr = 1; // enable interrupts = 1
unsigned long cntNow = 0; // VARIABLES FOR Millis()
unsigned long cntInit = millis();
unsigned long cntInterv = 5000; // 5 sec
unsigned long cntNow1 = 0; // VARIABLES FOR Millis(1)
unsigned long cntInit1 = millis();
unsigned long cntInterv1 = 86400000; // 24 hrs
volatile int rain = 0;
float vout = 0.0;
float correctionfactor = -1.75;
float vin = 0;
float Vtot = 0;
int Vcc = 0;
int R1 = 68000; //volt div resistor
int R2 = 22000; //volt div resistor
int h = 0;
float t = 0;
volatile int test = 0; //flag to restart after Ign Off
// Declare global variables for sensor data
int RAINSENSOR = 1023;
int MsenseEnable = 1;
float TEMP = 32;
float HUMIDITY = 0;
volatile int ROLLUP;
volatile int ROLLDN;
volatile int STALLVAL;
float BATTV = 13.5;
int RAINING;
int VENTED;
int tempValue;
volatile int UpDn;
int UPDN = 0;
int BATTALARM = 0;
BLYNK_WRITE(V8)
{
tempSet = param.asInt(); // Get value as integer
}
BLYNK_WRITE(V10)
{
humid = param.asInt(); // Get value as integer
}
BLYNK_WRITE(V12)
{
RollIt = param.asInt(); // Get value as integer
if (RollIt==1) {
stopRoll = 1;
RollPin();
}
}
BLYNK_WRITE(V14)
{
waitFlag = param.asInt(); // Get value as integer
}
BLYNK_WRITE(V15)
{
MsenseEnable = param.asInt(); // Get value as integer
}
BLYNK_CONNECTED() { // when device is conneceted to Blynk Cloud...
Blynk.syncAll(); // request the values for all datastreams that has "sync" setting enabled
}
// This function creates the timer object. It's part of Blynk library
BlynkTimer timer;
void myTimer()
{
// This function describes what will happen with each timer tick
// e.g. writing sensor value to datastream V5
Blynk.virtualWrite(V0, RAINSENSOR);
Blynk.virtualWrite(V1, TEMP);
Blynk.virtualWrite(V2, HUMIDITY);
Blynk.virtualWrite(V6, BATTV);
Blynk.virtualWrite(V4, ROLLUP);
Blynk.virtualWrite(V5, ROLLDN);
Blynk.virtualWrite(V3, RSNow);
Blynk.virtualWrite(V7, RAINING);
Blynk.virtualWrite(V11, BATTALARM);
Blynk.virtualWrite(V9, VENTED);
Blynk.virtualWrite(V13, WiFi.SSID()+" "+WiFi.RSSI());
Blynk.virtualWrite(V14, waitFlag);
if (ct < 11) {
Vtot = Vtot+vin;
ct=ct+1;
}
if (ct==11) {
ct=0;
BATTV = Vtot/10;
Vtot=0;
}
}
void RollPin() // roll window up or down alternatley
{
if (digitalRead(ign)==1 || stopRoll==0) goto endIt; //if ign is ON or Motors active, exit RollPin, goto label
switch(up_dn) // check up_dn flag
{
case 0:
Serial.println("Rolling UP");
digitalWrite(rollupPin,HIGH);
ROLLUP = 1;
ROLLDN = 0;
up_dn = 1;
doneFlag = 0;
stopRoll = 0;
break;
case 1:
if(rain==0) {
Serial.println("Rolling DN");
digitalWrite(rolldnPin,HIGH);
ROLLUP = 0;
ROLLDN = 1;
up_dn = 0;
doneFlag = 0;
stopRoll = 0;
break;
} // close if raining
} // close switch up_dn
endIt: // Label for Goto
Serial.println("switch up/dn check finished -press any key");
}
String overTheAirURL = "";
BLYNK_WRITE(InternalPinOTA) {
overTheAirURL = param.asString();
HTTPClient http;
http.begin(overTheAirURL);
int httpCode = http.GET();
if (httpCode != HTTP_CODE_OK) {return;}
int contentLength = http.getSize();
if (contentLength <= 0) {return; }
bool canBegin = Update.begin(contentLength);
if (!canBegin) { return;}
Client& client = http.getStream();
int written = Update.writeStream(client);
if (written != contentLength) {return;}
if (!Update.end()) {return;}
if (!Update.isFinished()) {return;}
reboot();
}
void reboot()
{
#if defined(ARDUINO_ARCH_MEGAAVR)
wdt_enable(WDT_PERIOD_8CLK_gc);
#elif defined(__AVR__)
wdt_enable(WDTO_15MS);
#elif defined(__arm__)
NVIC_SystemReset();
#elif defined(ESP8266) || defined(ESP32)
ESP.restart();
#else
#error "MCU reset procedure not implemented"
#endif
for (;;) {}
}
void setup() { // open setup
//dubug_init();
pinMode(rolldnPin, OUTPUT); //rolldn pin
pinMode(updn, INPUT_PULLUP); //connected to "Trunk Unlock" output from remote start -updn
pinMode(rollupPin,OUTPUT); //rollup pin
pinMode(ign,INPUT); //ign sense pin
pinMode(rainLED,OUTPUT); //rain led ;
pinMode(battV,INPUT); // Battery Voltage
pinMode(rainSensor,INPUT); //rain sensor input
pinMode(DHTPIN,INPUT); // DHT11 Data In
pinMode(RAINING,OUTPUT);
Serial.begin(115200);
delay(10);
wifiMulti.addAP("NETGEAR44-pro", "PWD");
wifiMulti.addAP("NETGEAR44", "PWD");
wifiMulti.addAP("DottieL", "PWD");
wifiMulti.addAP("DottieL_EXT", "PWD");
wifiMulti.addAP("ICM Guest", "PWD");
wifiMulti.addAP("Bay Ridge Resort", "PWD");
wifiMulti.addAP("Bay Ridge Resort Guest", "PWD");
wifiMulti.addAP("Bay Ridge Resort Guest", "PWD");
wifiMulti.addAP("oyowifi", "PWD");
wifiMulti.addAP("oyo wifi", "PWD");
wifiMulti.addAP("John's Galaxy A02s", "PWD");
Serial.println("Connecting Wifi...");
if(wifiMulti.run() == WL_CONNECTED) {
Serial.println("");
Serial.print("Connected to : ");
Serial.println(WiFi.SSID());
ssid = WiFi.SSID();
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
else
{ Serial.println("");
Serial.print("Connected to : ");
Serial.println(ssid);}
timer.setInterval(700L, myTimer);
Blynk.config(auth);
Blynk.connect(0);
runOnce = 1;
dht.begin();
raineD = 0;
if (EnableIntr==1) attachInterrupt(digitalPinToInterrupt(updn),RollPin, FALLING);
} //close setup
void disable() {
while (digitalRead(ign)== 1){ //if ign is ON, chase your tail
digitalWrite(rollupPin,LOW);
digitalWrite(rolldnPin,LOW);
test = 1;
waitFlag = 1;
raineD = 0;
rain = 0;
Vcc = analogRead(battV);
vout = (Vcc * 3.3) / 1023;
vin = vout / (R2/float(R1+R2));
vin = vin - correctionfactor;
RAW = analogRead(rainSensor);
RS = (RAW) + RSoffset;
RSNow = 100-(RS/10.23);
Blynk.run();
Blynk.virtualWrite(V6, vin);
Blynk.virtualWrite(V3, RSNow);
Blynk.virtualWrite(V14, waitFlag);
delay(700);
doneFlag = 1;
if (EnableIntr==1) noInterrupts();
venteD = 0;
}
if (EnableIntr==1) attachInterrupt(digitalPinToInterrupt(updn),RollPin, FALLING);
if (test==1) ESP.restart();
}
void initialize() {
if (runOnce == 1) {
runOnce = 0;
Serial.print("runOnce = ");
Serial.println(runOnce);
stopRoll = 1; //ch to 1
venteD = 0;
doneFlag = 1;
}
if (waitFlag == 1) {
delay(30000) ;
waitFlag = 0;
stopRoll = 1; //ch to 1
venteD = 0;
doneFlag = 1;
}
}
void stall() {
cntInit = millis();
if (doneFlag == 0) {
delay(RollTime);
digitalWrite(rollupPin,LOW); // turn off window motors
digitalWrite(rolldnPin,LOW); // turn off window motors
stopRoll = 1;
test = 0;
doneFlag = 1;
}
}
void rainchk() {
if (MsenseEnable == 1) {
if (stopRoll == 1){
if (RS<RSlow) RSlow = RS;
if (RS<RSthresh) {
rain = 1;
if (raineD == 0) {
digitalWrite(rollupPin,HIGH);
ROLLUP = 1;
ROLLDN = 0;
venteD = 0;
doneFlag = 0;
raineD = 1;
FullVent = 0; // set flag
if (RS<=RSthresh-Hyst) {
venteD=0; //reset venteD
rain = 1;
}
//rollcheck()
}
}
if (dht.readHumidity()*humeCal>=humid) { // open humidity test
Serial.print("rain is ");
Serial.println(rain);
rain = 1;
if (raineD == 0) {
digitalWrite(rollupPin,HIGH);
ROLLUP = 1;
ROLLDN = 0;
venteD = 0;
doneFlag = 0;
raineD = 1;
FullVent = 0; // set flag
}
if (dht.readHumidity()*humeCal>=humid) {
venteD=0; //reset venteD
rain = 1;
}
} // close humid test
else
{
if(RS>RSthresh+Hyst && dht.readHumidity()*humeCal<=humid-humidHyst)
{
rain = 0;
raineD = 0;
}
} // close else
}// close stopRoll
}
else if (MsenseEnable == 0) {
RSlow = 1024; //reset moisture memory value
rain = 0;
raineD = 0;
}
} //close Raincheck
void Vent() {
if (dht.readTemperature(true)+tempCal>=tempSet && raineD ==0) { //check for Vent temp
if (venteD == 0) {
Serial.println("Over Temp!!!!!!!!!");
digitalWrite(rolldnPin,HIGH); // roll down for ventTime seconds
delay(ventTime);
digitalWrite(rolldnPin,LOW); // stop roll down
venteD = 1; // set flag
FullVent = 0; // set flag
RSlow = 1024;
ROLLUP = 0;
ROLLDN = 0;
stopRoll = 1;
} // close vented test
} // close overtemp test
}
void Fullvent() {
if (dht.readTemperature(true)+tempCal>=(tempSet+10) && raineD ==0) { //check for Vent temp
if (FullVent == 0 && WiFi.SSID()=="NETGEAR44") {
Serial.println("Over Temp!!!!!!!!!");
digitalWrite(rolldnPin,HIGH); // roll down for ventTime seconds
delay(RollTime);
digitalWrite(rolldnPin,LOW); // stop roll down
venteD = 1;
RSlow = 1024;
FullVent = 1; // set flag
ROLLUP = 0;
ROLLDN = 1;
stopRoll = 1;
} //close FullVent test
} // close overtemp test
}
void rollcheck() {
roll_pin = digitalRead(updn);
Serial.println("IN ROLL CHECK ROUTINE"); // !!!!!!!!!!!
if (doneFlag == 1) {
roll_pin = !digitalRead(updn);
switch(roll_pin)
{
case (0): {
Serial.println("switch rollpin = 0 - Idling");
Serial.print(F("Humidity: "));
Serial.println(dht.readHumidity()*humeCal);
if (dht.readHumidity()*humeCal>Maxhumidity) Maxhumidity = dht.readHumidity()*humeCal;
if (dht.readTemperature(true)<Mintemp) Mintemp = dht.readTemperature(true);
Serial.print("Maxhumidity = ");
Serial.print(Maxhumidity);
Serial.println("%");
Serial.print("Temp = ");
Serial.println(dht.readTemperature(true)+tempCal);
Serial.print("Max Temp = ");
Serial.println(Maxtemp);
Serial.print("Mintemp = ");
Serial.println(Mintemp);
Serial.print(" ");
Serial.print(tempSet);
Serial.print(" ");
Serial.println(humid);
Serial.print("rain sensor = ");
Serial.print(100-(RS/10.23));
Serial.println("%");
Serial.print("Max Rain Sensor Value = ");
Serial.print(100-((RSlow/10.23)));
Serial.println("%");
Serial.print("Raw Rain Sensor = ");
Serial.println(RAW, 0);
Serial.print("RS = ");
Serial.println(RS);
Serial.print("rain = ");
Serial.println(rain);
Serial.print("raineD = ");
Serial.println(raineD);
Serial.print("venteD = ");
Serial.println(venteD);
Serial.print("up_dn = ");
Serial.println(up_dn);
Serial.print("Sensors ");
if (MsenseEnable == 1) Serial.println("Enabled");
if (MsenseEnable == 0) Serial.println("Disabled");
Serial.print("Battery Voltage = ");
Serial.print(BATTV);
Serial.println("v");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.println("switch rollpin finished");
Serial.println("");
//Vent(); // call Vent Function !!
break;
}
case (1): {// else check up_dn flag
Serial.println("IN UP/DN TEST");
Serial.print("A1 triggered ******* = ");
Serial.println(digitalRead(updn));
RollPin();
break;
}
//while (Serial.available()<=0); {Serial.read();}
} // CLOSE ROLL_PIN TEST
test = 0;
} // close doneflag
} //close rollcheck
void update() {
if (test == 1){ // open test humidity/temp
int h = dht.readHumidity();
// Read temperature as Celsius (the default)
float f = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float t = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) { // open check
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
} // close check
}
void loop() { //open MAIN loop !!!!!!!!!!!!!!!!!!!!
Blynk.run();
timer.run();
analogReadResolution(10);
//if the connection to the stongest hotspot is lost, it will connect to the next network on the list
if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) {
Serial.print("WiFi connected: ");
Serial.print(WiFi.SSID());
Serial.print(" ");
Serial.println(WiFi.RSSI());
Serial.println("");
}
else {
Serial.println("WiFi not connected!");
}
delay(1000);
RAW = analogRead(rainSensor);
RS = (RAW) + RSoffset;
RSNow = 100-(RS/10.23);
if (RS<RSlow) RSlow = RS;
RAINSENSOR = (100-(RSlow/10.23));
TEMP = dht.readTemperature(true)+tempCal;
HUMIDITY = dht.readHumidity()*humeCal;
RAINING = raineD;
VENTED = venteD;
digitalWrite(rainLED,rain);
Vcc = analogRead(battV);
vout = (Vcc * 3.3) / 1023;
vin = vout / (R2/float(R1+R2));
vin = vin - correctionfactor;
if (BATTV<battSet) {
BATTALARM = 1;
}
else
{
BATTALARM = 0;
}
if (cntNow < cntInit) cntInit = cntNow; //allow for millis() rollover every 39 days
if (dht.readHumidity()*humeCal>Maxhumidity) Maxhumidity = dht.readHumidity()*humeCal;
if (dht.readTemperature(true)<Mintemp) Mintemp = dht.readTemperature(true);
if (dht.readTemperature(true)>Maxtemp) Maxtemp = dht.readTemperature(true);
delay(100);
disable();
initialize();
update();
stall();
rainchk();
Vent();
Fullvent();
rollcheck();
unsigned long currentMillis = millis();
}// close loop
I am wondering if I could modify this project to work in AP mode, as a lot of the places I go with this, use 5Ghz WiFi and so I can not connect?