Pete, I changed to NodeMcu for this project , it seems very stable for this morning trial.
I may use 2 Nodemcu with bridge function to solve the demand of I/O pins.
However, a strange thing I found.
Everything is fine before running void mix().
When case(type_no) is 1,4,5,6,9, 10,11 or 15 the program runs correctly.
when case(type_no) is 2, 3 after pressed V1 button
(run BLYNK_WRITE(V1) then run mix()),
**the board will restart and reconnect **
(exactly same effect as press RST button on the board).
But I don’t think it is related to the digital Pin D1 & D2, it is normal that I check with pressing D1 & D2 button widget, also I changed D1 & D2 to D7 & D8, same issue occur.
I also change the virtual pin button from V1 to V3, same issue occur when case is 2 or 3.
I am also confused why I press the V1 button will run the previous mixing procedure even I have not send the case(type_no) or case = 0, and I have reset V16 V17 & V1 value to 0 after mixing finish or pressed reset button (V2).
e.g. Run case(1) -> finished -> reset to zero -> press V1 (now case is 0) -> case(1) run again
Below is my code and serial monitor.
The serial monitor is the condition of doing case 1 then do case 2
// LIBRARY
//====================================================
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
//====================================================
// DEKLARASI AWAL
//====================================================
char auth[] =
char ssid[] =
char pass[] =
//====================================================
// global variables
//====================================================
int drink_pump1 = 16; //D0
int drink_pump2 = 5; //D1
int drink_pump3 = 4; //D2
int drink_pump4 = 0; //D3
int drink_pump5 = 2; //D4
int drink_pump6 = 14; //D5
int water_pump = 12; //D6
int timer_no1;
int timer_no2;
int timer_no3;
int timer_no4;
int timer_no5;
int timer_no6;
long drink_time1;
long drink_time2;
long drink_time3;
long drink_time4;
long drink_time5;
long drink_time6;
long water_time;
float drink_type1;
float drink_type2;
float drink_type3;
float drink_type4;
float drink_type5;
float drink_type6;
int cup_size;
int confirmPressed;
float pump1Flow = 4; //drink pump flow speed ml/s
float pump2Flow = 6; //water pump flow speed ml/s
float pump3Flow = 8; //drink pump flow speed ml/s
float pump4Flow = 10; //water pump flow speed ml/s
float pump5Flow = 12; //drink pump flow speed ml/s
float pump6Flow = 14; //water pump flow speed ml/s
float hotwaterFlow = 15;
float coldwaterFlow = 20;
BlynkTimer timer;
float water_ratio;
int type_no;
int cup_no;
int drink_level;
int temp;
//====================================================
BLYNK_WRITE(V0)
{
type_no = param[0].asInt();
cup_no = param[1].asInt();
temp = param[2].asInt();
Blynk.virtualWrite(V17, type_no);
Blynk.virtualWrite(V16, cup_no);
Blynk.virtualWrite(V18, temp);
}
BLYNK_WRITE(V16)
{
int small = 237; //8oz
int medium = 355; //12oz
int large = 473; //16oz
cup_no = param.asInt();
switch(cup_no)
{
case 1:
{
cup_size = small;
break;
}
case 2:
{
cup_size = medium;
break;
}
case 3:
{
cup_size = large;
break;
}
default:
{
cup_size = 0;
break;
}
}
Serial.println(cup_size);
}
BLYNK_WRITE(V17)
{
float drink1_ratio = 1.0 / (1.0 + 9.0);
float drink2_ratio = 1.0 / (1.0 + 9.0);
float drink3_ratio = 1.0 / (1.0 + 9.0);
float drink4_ratio = 1.0 / (1.0 + 9.0);
float drink5_ratio = 1.0 / (1.0 + 9.0);
float drink6_ratio = 1.0 / (1.0 + 9.0);
type_no = param.asInt();
switch(type_no)
{
case 1:
{
drink_type1 = drink1_ratio; //apple
drink_type2 = 0;
drink_type3 = 0;
drink_type4 = 0;
drink_type5 = 0;
drink_type6 = 0;
break;
}
case 2:
{
drink_type1 = 0; //orange
drink_type2 = drink2_ratio;
drink_type3 = 0;
drink_type4 = 0;
drink_type5 = 0;
drink_type6 = 0;
break;
}
case 3:
{
drink_type1 = 0; //orange
drink_type2 = 0;
drink_type3 = drink3_ratio;
drink_type4 = 0;
drink_type5 = 0;
drink_type6 = 0;
break;
}
case 4:
{
drink_type1 = 0;//apple
drink_type2 = 0;
drink_type3 = 0;
drink_type4 = drink4_ratio;
drink_type5 = 0;
drink_type6 = 0;
break;
}
case 5:
{
drink_type1 = 0;; //orange
drink_type2 = 0;
drink_type3 = 0;
drink_type4 = 0;
drink_type5 = drink5_ratio;
drink_type6 = 0;
break;
}
case 6:
{
drink_type1 = 0; //orange
drink_type2 = 0;
drink_type3 = 0;
drink_type4 = 0;
drink_type5 = 0;
drink_type6 = drink6_ratio;
break;
}
case 9: //mix drink 4 + drink 5
{
drink_type1 = 0;//apple
drink_type2 = 0;
drink_type3 = 0;
drink_type4 = drink4_ratio / 2.0;
drink_type5 = drink5_ratio / 2.0;
drink_type6 = 0;
break;
}
case 10: //mix drink 4 + drink 6
{
drink_type1 = 0;//apple
drink_type2 = 0;
drink_type3 = 0;
drink_type4 = drink4_ratio / 2.0;
drink_type5 = 0;
drink_type6 = drink6_ratio / 2.0;
break;
}
case 11: //mix drink 6 + drink 5
{
drink_type1 = 0;//apple
drink_type2 = 0;
drink_type3 = 0;
drink_type4 = 0;
drink_type5 = drink5_ratio / 2.0;
drink_type6 = drink6_ratio / 2.0;
break;
}
case 15: //mix drink 4 + drink 5 + drink 6
{
drink_type1 = 0;//apple
drink_type2 = 0;
drink_type3 = 0;
drink_type4 = drink4_ratio / 3.0;
drink_type5 = drink5_ratio / 3.0;
drink_type6 = drink6_ratio / 3.0;
break;
}
default:
{ drink_type1 = 0;
drink_type2 = 0;
drink_type3 = 0;
drink_type4 = 0;
drink_type5 = 0;
drink_type6 = 0;
break;
}
}
water_ratio = 1.0 - drink_type1 - drink_type2 - drink_type3 - drink_type4 - drink_type5 - drink_type6;
Serial.print("drink_type1 =");
Serial.println(drink_type1);
Serial.print("drink_type2 =");
Serial.println(drink_type2);
Serial.print("drink_type3 =");
Serial.println(drink_type3);
Serial.print("drink_type4 =");
Serial.println(drink_type4);
Serial.print("drink_type5 =");
Serial.println(drink_type5);
Serial.print("drink_type6 =");
Serial.println(drink_type6);
}
BLYNK_WRITE(V1)
{
unsigned long PreviousMillis = 0;
unsigned long CurrentMillis = millis();
long interval = 2000;
confirmPressed = param.asInt();
if (confirmPressed == 1)
{
drink_time1 = cup_size * drink_type1 / pump1Flow * 1000.0;
drink_time2 = cup_size * drink_type2 / pump2Flow * 1000.0;
drink_time2 = cup_size * drink_type3 / pump3Flow * 1000.0;
drink_time4 = cup_size * drink_type4 / pump4Flow * 1000.0;
drink_time5 = cup_size * drink_type5 / pump5Flow * 1000.0;
drink_time6 = cup_size * drink_type6 / pump6Flow * 1000.0;
water_time = cup_size * water_ratio / coldwaterFlow * 1000.0;
}
if (CurrentMillis - PreviousMillis > interval)
{
mix();
}
Serial.print("drink_time1 =");
Serial.println(drink_time1);
Serial.print("drink_time2 =");
Serial.println(drink_time2);
Serial.print("drink_time3 =");
Serial.println(drink_time3);
Serial.print("drink_time4 =");
Serial.println(drink_time4);
Serial.print("drink_time5 =");
Serial.println(drink_time5);
Serial.print("drink_time6 =");
Serial.println(drink_time6);
Serial.print("water_time=");
Serial.println(water_time);
}
void mix()
{
Serial.println("Start mixing");
switch(type_no)
{
case 1:
{
digitalWrite(drink_pump1, HIGH);
timer_no1 = timer.setTimeout(drink_time1, []()
{
digitalWrite(drink_pump1, LOW);
timer.deleteTimer(timer_no1);
});
break;
}
case 2:
{
digitalWrite(drink_pump2, HIGH);
timer_no1 = timer.setTimeout(drink_time2, []()
{
digitalWrite(drink_pump2, LOW);
timer.deleteTimer(timer_no1);
});
break;
}
case 3:
{
digitalWrite(drink_pump3, HIGH);
timer_no1 = timer.setTimeout(drink_time3, []()
{
digitalWrite(drink_pump3, LOW);
timer.deleteTimer(timer_no1);
});
break;
}
case 4:
{
digitalWrite(drink_pump4, HIGH);
timer_no1 = timer.setTimeout(drink_time4, []()
{
digitalWrite(drink_pump4, LOW);
timer.deleteTimer(timer_no1);
});
break;
}
case 5:
{
digitalWrite(drink_pump5, HIGH);
timer_no1 = timer.setTimeout(drink_time5, []()
{
digitalWrite(drink_pump5, LOW);
timer.deleteTimer(timer_no1);
});
break;
}
case 6:
{
digitalWrite(drink_pump6, HIGH);
timer_no1 = timer.setTimeout(drink_time6, []()
{
digitalWrite(drink_pump6, LOW);
timer.deleteTimer(timer_no1);
});
break;
}
case 9:
{
digitalWrite(drink_pump4, HIGH);
timer_no2 = timer.setTimeout(drink_time4, []()
{
digitalWrite(drink_pump4, LOW);
timer.deleteTimer(timer_no2);
});
digitalWrite(drink_pump5, HIGH);
timer_no3 = timer.setTimeout(drink_time5, []()
{
digitalWrite(drink_pump5, LOW);
timer.deleteTimer(timer_no3);
});
break;
}
case 10:
{
digitalWrite(drink_pump4, HIGH);
timer_no2 = timer.setTimeout(drink_time4, []()
{
digitalWrite(drink_pump4, LOW);
timer.deleteTimer(timer_no2);
});
digitalWrite(drink_pump6, HIGH);
timer_no3 = timer.setTimeout(drink_time6, []()
{
digitalWrite(drink_pump6, LOW);
timer.deleteTimer(timer_no3);
});
break;
}
case 11:
{
digitalWrite(drink_pump5, HIGH);
timer_no2 = timer.setTimeout(drink_time5, []()
{
digitalWrite(drink_pump5, LOW);
timer.deleteTimer(timer_no2);
});
digitalWrite(drink_pump6, HIGH);
timer_no3 = timer.setTimeout(drink_time6, []()
{
digitalWrite(drink_pump6, LOW);
timer.deleteTimer(timer_no3);
});
break;
}
case 15:
{
digitalWrite(drink_pump4, HIGH);
timer_no2 = timer.setTimeout(drink_time4, []()
{
digitalWrite(drink_pump4, LOW);
timer.deleteTimer(timer_no2);
});
digitalWrite(drink_pump5, HIGH);
timer_no3 = timer.setTimeout(drink_time5, []()
{
digitalWrite(drink_pump5, LOW);
timer.deleteTimer(timer_no3);
});
digitalWrite(drink_pump6, HIGH);
timer_no4 = timer.setTimeout(drink_time6, []()
{
digitalWrite(drink_pump6, LOW);
timer.deleteTimer(timer_no4);
});
break;
}
default:
{
digitalWrite(drink_pump1, LOW);
digitalWrite(drink_pump2, LOW);
digitalWrite(drink_pump3, LOW);
digitalWrite(drink_pump4, LOW);
digitalWrite(drink_pump5, LOW);
digitalWrite(drink_pump6, LOW);
}
}
{
digitalWrite(water_pump, HIGH);
timer_no5 = timer.setTimeout(water_time, []()
{
digitalWrite(water_pump, LOW);
timer.deleteTimer(timer_no5);
});
}
float finishTime = water_time + 2000.0;
timer_no6 = timer.setTimeout(finishTime, []()
{
Blynk.virtualWrite(V16,0);
Blynk.virtualWrite(V17,0);
Blynk.virtualWrite(V18,0);
Blynk.virtualWrite(V1,0);
Serial.println("Mixing is finish");
timer.deleteTimer(timer_no6);
});
}
BLYNK_WRITE(V2)
{
int reset_button = param.asInt();
if (reset_button == 1)
{
Blynk.virtualWrite(V16,0);
Blynk.virtualWrite(V17,0);
Blynk.virtualWrite(V1, 0);
drink_level = drink_level + 5000.0;
}
}
//====================================================
void setup()
{
Serial.begin(115200);
//Blynk.begin(auth, ssid, pass); //Reguler server
Blynk.config(auth);
Blynk.connectWiFi(ssid, pass);
Blynk.connect();
pinMode(drink_pump1, OUTPUT);
pinMode(drink_pump2, OUTPUT);
pinMode(drink_pump3, OUTPUT);
pinMode(drink_pump4, OUTPUT);
pinMode(drink_pump5, OUTPUT);
pinMode(drink_pump6, OUTPUT);
pinMode(water_pump, OUTPUT);
digitalWrite(drink_pump1, LOW);
digitalWrite(drink_pump2, LOW);
digitalWrite(drink_pump3, LOW);
digitalWrite(drink_pump4, LOW);
digitalWrite(drink_pump5, LOW);
digitalWrite(drink_pump6, LOW);
digitalWrite(water_pump, LOW);
Blynk.virtualWrite(V0, 0);
Blynk.virtualWrite(V1, 0);
}
void loop()
{
Blynk.run();
timer.run();
}
//
11:32:14.054 -> drink_type1 =0.10
11:32:14.054 -> drink_type2 =0.00
11:32:14.054 -> drink_type3 =0.00
11:32:14.054 -> drink_type4 =0.00
11:32:14.054 -> drink_type5 =0.00
11:32:14.054 -> drink_type6 =0.00
11:32:14.834 -> 237
11:32:18.434 -> Start mixing
11:32:18.434 -> drink_time1 =5925
11:32:18.434 -> drink_time2 =0
11:32:18.434 -> drink_time3 =0
11:32:18.434 -> drink_time4 =0
11:32:18.434 -> drink_time5 =0
11:32:18.434 -> drink_time6 =0
11:32:18.434 -> water_time=10664
11:32:31.205 -> Mixing is finish
11:32:35.321 -> drink_type1 =0.00
11:32:35.355 -> drink_type2 =0.10
11:32:35.355 -> drink_type3 =0.00
11:32:35.355 -> drink_type4 =0.00
11:32:35.355 -> drink_type5 =0.00
11:32:35.355 -> drink_type6 =0.00
11:32:36.803 -> 237
11:32:38.111 -> Start mixing
11:32:38.111 -> drink_time1 =0
11:32:38.111 -> drink_time2 =0
11:32:38.111 -> drink_time3 =0
11:32:38.111 -> drink_time4 =0
11:32:38.111 -> drink_time5 =0
11:32:38.111 -> drink_time6 =0
11:32:38.111 -> water_time=10664
11:32:38.111 ->
11:32:38.111 -> Exception (0):
11:32:38.111 -> epc1=0x4000e25d epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
11:32:38.147 ->
11:32:38.147 -> >>>stack>>>
11:32:38.147 ->
11:32:38.147 -> ctx: cont
11:32:38.147 -> sp: 3ffffdc0 end: 3fffffc0 offset: 0190
11:32:38.147 -> 3fffff50: 0004c5b5 3ffeeccc 00000000 402045dd
11:32:38.147 -> 3fffff60: 0004c5b5 00000000 0004c5b5 00000000
11:32:38.147 -> 3fffff70: 00000001 00000002 0000000c 3ffe84f8
11:32:38.147 -> 3fffff80: 00000000 00000000 00000001 3ffeee5c
11:32:38.147 -> 3fffff90: 3fffdad0 00000000 3ffeee1c 40202da5
11:32:38.147 -> 3fffffa0: 3fffdad0 00000000 3ffeee1c 40205430
11:32:38.185 -> 3fffffb0: feefeffe feefeffe 3ffe854c 40100cb9
11:32:38.185 -> <<<stack<<<
11:32:38.185 ->
11:32:38.185 -> ets Jan 8 2013,rst cause:2, boot mode:(3,6)
11:32:38.185 ->
11:32:38.185 -> load 0x4010f000, len 3456, room 16
11:32:38.185 -> tail 0
11:32:38.185 -> chksum 0x84
11:32:38.185 -> csum 0x84
11:32:38.185 -> va5432625
11:32:38.185 -> ~ld
11:32:38.257 -> [67]
11:32:38.257 -> ___ __ __
11:32:38.257 -> / _ )/ /_ _____ / /__
11:32:38.257 -> / _ / / // / _ \/ '_/
11:32:38.257 -> /____/_/\_, /_//_/_/\_\
11:32:38.257 -> /___/ v0.6.1 on NodeMCU
11:32:38.257 ->
11:32:38.257 -> [69] Connecting to GWIFI99
11:32:38.754 -> [574] Connected to WiFi
11:32:38.754 -> [575] IP: 172.31.2.229
11:32:38.792 -> [575] Connecting to blynk-cloud.com:80
11:32:38.975 -> [769] Ready (ping: 50ms).