Very strange issue with arduino mkr1000

Hi Guys, some time ago I realized a thermostat for my gas boiler, to interface the boiler I used an original Arduino MKR1000 with a webserver inside, in order to manage http requests to switch on and switch off the boiler.
The project is working fine except that each three or four days I need to go downstairs,
turn arduino off and turn it on again because it goes to a standstill.
During this standstill:

  • the green led, the one that indicates that arduino is connected to a power supply, is on, and another orange blinking led, next to the green one, turns on.
  • If I try to ping the arduino IP address, it works fine
  • If I try to submit an http request via browser to arduino webserver then no response comes back

I have no idea if it could be an hardware or software issue, anyway this is sketch:

#include <WiFi101.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiSSLClient.h>
#include <WiFiUdp.h>
#include <SPI.h>
 
const char* ssid = "*****";
const char* pass = "*****";
const char* host = "192.168.1.10"; 
                                        
int keyIndex = 0;                 
int relaypin = 2;
int currentState = 0;
bool val = true;
 
int status = WL_IDLE_STATUS;
WiFiServer server(301);
 
void setup() {
  Serial.begin(9600);      // initialize serial communication
  Serial.print("Start Serial ");
  pinMode(relaypin, OUTPUT);      
  digitalWrite(relaypin, LOW);
  // Check for the presence of the shield
  Serial.print("WiFi101 shield: ");
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("NOT PRESENT");
    return; // don't continue
  }
  Serial.println("DETECTED");
  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);
    // wait 10 seconds for connection:
    delay(10000);
  }
  server.begin();                           // start the web server on port 301
  printWifiStatus();                        // you're connected now, so print out the status
}

void loop() {
  WiFiClient client = server.available();   // listen for incoming clients
 
  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character
 
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
          
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();
 
            // the content of the HTTP response follows the header:

            client.print("PIN " + (String)relaypin + " IS " + (String)digitalRead(relaypin));
            
            // The HTTP response ends with another blank line:
          
            client.println();
          
            // break out of the while loop:
            break;
          }
          else {      // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        }
        else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
 
        // Check to see if the client request was "GET /ON" or "GET /OFF":
        if (currentLine.endsWith("GET /ON")) {
          digitalWrite(relaypin, HIGH);              
          
        }
        if (currentLine.endsWith("GET /OFF")) {
          digitalWrite(relaypin, LOW);
          
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
 
  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
 
  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
 
}

Somebody could help?

Ehm, I know this might be a first frustrating answer...

But may I ask you what are you using to power your MKR1000?

Normal USB chargers (the phone one) could every now and then fail to provide enough intensity to power the wifi module on the board. I solved in the past similar issues using a stronger power supply (i.e. the iPad charger instead of the iPhone one).

From my limited knowledge level I can't see anything wrong in your code susceptible of hanging at some point.

Another point is that there was a quite important FIRMWARE update for the MKR series.

Certainly worth checking to see if you are up to date.
Earlier MKR's were prone to this issue and I can attest to the fact that this fixed it for a lot of people.

There are two sketches in the WiFi101 examples.
One is used to check the firmware version and the other is used during the actual process.

Leone_Euglena:
Ehm, I know this might be a first frustrating answer...

But may I ask you what are you using to power your MKR1000?

Hi Leone_Euglena, thanks for your answer. Actually the power supply I was using was just 1.5A, maybe it could be the reason of my troubles. I replaced it with a better one, I'll let you know if I resolved in about three or four days :smiley:

ballscrewbob:
Another point is that there was a quite important FIRMWARE update for the MKR series.

Hi ballscrewbob, thanks for your answer. It's a good point even if I just bought this board 1 mounth ago. If I won't resolve my problem by changing the power supply, the firmware will be the first thing I'll check! :slight_smile:

Hi guys, no changes for me. I tried both to update the firmware and to upgrade power supply but nothing changed. Now I replaced arduino with an esp8266 (3$) and it's getting better. I'd say that mkr1000 is rubbish :zipper_mouth_face:

Thanks