John Woolsey code works fine but seems to fall asleep or maybe just gets disconnected from Wifi (not certain which), and requires a hard reset. This is a problem for me as the setup is intended to be at a remote site
The WiFiNINA/issues/47 code also works but cycles through a Wifi reconnect every 30 seconds and so causes the web page to get hung up during.
What I am hoping to learn how to do is properly sleep the device for some short time intervals when no activity has happened for some time, but once awake, stay awake for at least 5 or 10 minutes so the web site pages react nice.
Any suggestions greatly appreciated.
PS: I read the Arduino online documentation about how the classes used in my code and think I get most of it. If there is some more specific parts I may be misunderstanding, please point out.
The WiFiNINA/issues/47 code does some stuff you should never do: handling standard code in interrupt context. Call ControlClientWebPage() from your loop and remove the RTC interrupt code. Call WiFiConnection() from setup() and remove everything else you currently have in loop().
Once that runs, you should check the WiFi connection in every loop() run and re-establish it if it fails.
Ok…cleaned up the code and broke down some things into a few more functions. I also commended out all the serial monitor elements. It runs well now and has stayed running for about 12 hours without issue. I am not certain if my code will deal with network disconnects so will continue to let it run to see how it survives long term.
So what I really was shooting for was how put the setup into sleep mode when nothing is changing and then how to get it to wake up when user interaction happens via the web interface.
Any help is much appreciated.
#include <SPI.h>
#include <WiFiNINA.h> // for use with Arduino Uno WiFi Rev2
const int redLED = 2;
const int yellowLED = 3;
const int greenLED = 5;
IPAddress ip(x, y, z, 150);
IPAddress dns1(x, y, z, 16);
IPAddress gateway(x, y, z, 1);
IPAddress subnet(255, 255, 255, 0);
char hostname[] = "optiUnoWiFi-01";
WiFiClient client;
char ssid[] = "myssid";
char pass[] = "mypass";
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
Serial.begin(9600); // initialize serial communication
pinMode(redLED, OUTPUT);
pinMode(yellowLED, OUTPUT);
pinMode(greenLED, OUTPUT);
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, LOW);
WiFiDeviceCheck();
WiFiConnection();
printWifiStatus();
}
void loop() {
ControlClientWebPage();
}
char WiFiDeviceCheck(){
if (WiFi.status() == WL_NO_SHIELD || WiFi.status() == WL_NO_MODULE) {
while (true);
}
else {
}
String fv = WiFi.firmwareVersion();
if (fv < "1.2.0") {
}
}
/*****************************************************************/
/* Make the WiFi Connection */
/*****************************************************************/
char WiFiConnection(){
status = WL_IDLE_STATUS;
while (status != WL_CONNECTED) {
WiFi.setHostname(hostname);
WiFi.config(ip,dns1,gateway,subnet);
status = WiFi.begin(ssid, pass);
delay(10000);
}
while (server.status() != 1) {
server.begin();
printWifiStatus();
}
}
void ControlClientWebPage() {
WiFiClient client = server.available();
if (client) {
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
// Serial.write(c);
if (c == '\n') {
if (currentLine.length() == 0) {
showWebPage(client);
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
performRequest(currentLine);
}
}
client.stop();
}
}
void showWebPage(WiFiClient client) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<h1>Arduino Remote Control</h1>");
client.println("<table border=1 style='text-align:center'>");
client.println("<tr><th>Component</th><th>Status</th><th>Control</th></tr>");
client.print("<tr><td>Red LED</td><td>");
if (digitalRead(redLED)) { // show colored status based on state of redLED
client.print("<font style='color:green;'>ON</font>");
} else {
client.print("<font style='color:red;'>OFF</font>");
}
client.println("</td><td><a href='/redLED/on'>ON</a> / <a href='/redLED/off'>OFF</a></td></tr>"); // display redLED control links
client.print("<tr><td>Yellow LED</td><td>");
if (digitalRead(yellowLED)) { // show colored status based on state of yellowLED
client.print("<font style='color:green;'>ON</font>");
} else {
client.print("<font style='color:red;'>OFF</font>");
}
client.println("</td><td><a href='/yellowLED/on'>ON</a> / <a href='/yellowLED/off'>OFF</a></td></tr>"); // display yellowLED control links
client.print("<tr><td>Green LED</td><td>");
if (digitalRead(greenLED)) { // show colored status based on state of greenLED
client.print("<font style='color:green;'>ON</font>");
} else {
client.print("<font style='color:red;'>OFF</font>");
}
client.println("</td><td><a href='/greenLED/on'>ON</a> / <a href='/greenLED/off'>OFF</a></td></tr>"); // display greenLED control links
client.println("</table>");
// The HTTP response ends with another blank line
client.println();
}
void performRequest(String line) {
if (line.endsWith("GET /redLED/on")) { // turn on red LED
digitalWrite(redLED, HIGH);
} else if (line.endsWith("GET /redLED/off")) { // turn off red LED
digitalWrite(redLED, LOW);
} else if (line.endsWith("GET /yellowLED/on")) { // turn on yellow LED
digitalWrite(yellowLED, HIGH);
} else if (line.endsWith("GET /yellowLED/off")) { // turn off yellow LED
digitalWrite(yellowLED, LOW);
} else if (line.endsWith("GET /greenLED/on")) { // turn on green LED
digitalWrite(greenLED, HIGH);
} else if (line.endsWith("GET /greenLED/off")) { // turn off green LED
digitalWrite(greenLED, LOW);
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to
// Serial.print("SSID: ");
// Serial.println(WiFi.SSID());
// print the MAC address of the router you're attached to
byte bssid[6];
WiFi.BSSID(bssid);
// Serial.print("BSSID: ");
printMacAddress(bssid);
// print the received signal strength
long rssi = WiFi.RSSI();
// Serial.print("signal strength (RSSI): ");
// Serial.print(rssi);
// Serial.println(" dBm");
// print the encryption type
byte encryption = WiFi.encryptionType();
// Serial.print("Encryption Type: ");
// Serial.println(encryption, HEX);
// Serial.println();
// print the hostname of the device
// char hostname = WiFi.getHostname();
// Serial.print("Hostname: ");
// Serial.println(hostname);
// print the firmware version
String fv = WiFi.firmwareVersion();
// Serial.print("Firmware version: ");
// Serial.println(fv);
// Serial.println();
// print the WiFi device's IP address
// Serial.print("IP Address: ");
// Serial.println(WiFi.localIP());
// print the WiFi device's subnet mask
// Serial.print("Subnet mask: ");
// Serial.println(WiFi.subnetMask());
// print the WiFi device's gateway IP address
// Serial.print("Gateway IP Address: ");
// Serial.println(WiFi.gatewayIP());
// print the WiFi device's dns IP address(s)
// Serial.print("DNS IP Address(s): ");
// Serial.println(dns1);
// Serial.println();
// Print where to go in a browser
// Serial.println("To see this page in action:");
// Serial.print("Open a browser to http://");
// Serial.println(ip);
// Serial.println("--OR--");
// Serial.print("Open a browser to http://");
// Serial.println(hostname);
}
void printMacAddress(byte mac[]) {
for (int i = 5; i >= 0; i--) {
if (mac[i] < 16) {
// Serial.print("0");
}
// Serial.print(mac[i], HEX);
if (i > 0) {
// Serial.print(":");
}
}
// Serial.println();
}
So what I really was shooting for was how put the setup into sleep mode when nothing is changing and then how to get it to wake up when user interaction happens via the web interface.
This is not possible because in sleep mode the network interface is not up.