Panel Recovery after a module Reset
This page shows how to easily manage a possible unexpected Wi-Fi module reset and prevent the loss of the panel previously send to the module. In fact, since the panel string is stored in the volatile memory of the WiFi module, after each reset, the module expects to serially receive the string of the panel from the µController.
During a normal power up of your remote system, both µController and wifi module reset: in this case your µController is already programmed to send the initial panel string (with the initial states for any panel object). It is also possible that, at a later time, the µController correctly updates the panel status as result of a user interaction.
But it can also happen that for an unexpected reason only the module reset (power line fluctuations, low voltage, instable wire connections, electrostatic discharge and so on), if the µController does not send again the panel (with the last updated status) the user will see a blank panel, as shown in figure 1.
To solve this problem just note that, after each reset, the wifi module transmits a reset serial message to your µController, as shown in figure 2.
This message can be used to monitor if an unexpected module reset occures and eventually retransmit the panel (updated with the current status). In this way, the user will ever see the correct screen, as shown in figure 3.
Example
Let’s consider a simple application in which an Arduino UNO controls two external relays (tha panel layout is shown in the previous figures).
Each time the user presses a switch, the Arduino board will both switch the relay channel and update the led status (used as a feedback).
If a $RES message is received from the wifi module, Arduino transmits again the panel (updated with the current status of the panel objects)
µPanel definition
The panel definition includes two switch (W1 and W2) and two leds (L1 and L2).
Dg15;/5T*25fb:Arduino Relay;=*16/30{mL1G:0;|*12W1:0;|T:Relay 1;}/{mL2G:0;|*12W2:0;|T:Relay 2;}
Arduino Code
Please note that while loading the sketch on the Arduino UNO, the RxD line (blue wire) has to be disconnected from the WiFi Module
#define RELAY1 8 // first relay on pin 8 #define RELAY2 9 // second relay on pin 8 unsigned char relay1_status = 0; // OFF unsigned char relay2_status = 0; // OFF String Msg; void setup() { // Initialize Serial Port Serial.begin(57600); // Let uPanel start delay(3000); // Initialize digital output pin digitalWrite(RELAY1, 1); // pin = high => relay off digitalWrite(RELAY2, 1); // pin = high => relay off pinMode(RELAY1, OUTPUT); pinMode(RELAY2, OUTPUT); SendPanel(); // Send The Panel calling a function } void loop() { int c; while ((c = Serial.read()) > '\n') Msg += (char) c; // Read incoming chars, if any, until new line if (c == '\n') // is the message complete? { // If switch1 is OFF: Turn OFF LED1 and Relay1 if (Msg.equals("#W10")) {digitalWrite(RELAY1,1); Serial.println("#L10"); relay1_status = 0;} // If switch1 is ON: Turn ON LED1 and Relay1 else if (Msg.equals("#W11")) {digitalWrite(RELAY1,0); Serial.println("#L11"); relay1_status = 1;} // If switch2 is OFF: Turn OFF LED2 and Relay2 else if (Msg.equals("#W20")) {digitalWrite(RELAY2,1); Serial.println("#L20"); relay2_status = 0;} // If switch2 is ON: Turn ON LED2 and Relay2 else if (Msg.equals("#W21")) {digitalWrite(RELAY2,0); Serial.println("#L21"); relay2_status = 1;} // WiFi Module unwanted RESET >>>>>>> send panel again else if (Msg.equals("$RES")) {SendPanel();} Msg = ""; } } //---------------------------------------------------------------- void SendPanel(void){ // Discharge old partial messages and send panel Serial.println(""); Serial.println("$P:Dg15;/5T*25fb:Arduino Relay;=*16/30{mL1G:0;|*12W1:0;|T:Relay 1;}/{mL2G:0;|*12W2:0;|T:Relay 2;}"); // Syncronize all panel's objects status with last valid status if (relay1_status == 1){ Serial.println("#W11"); Serial.println("#L11");} if (relay2_status == 1){ Serial.println("#W21"); Serial.println("#L21");} } //----------------------------------------------------------------