Arduino - ScheduledWiFiSSLWebClient

Scheduled WiFi SSL Web Client

With this tutorial you will use the Real Time Clock (RTC) alarm function and interrupt to make an https GET request to the Arduino.cc website every minute. The request downloads the Arduino ASCII logo and the data is streamed to the Serial console.

Hardware Required

  • Arduino MKR1000 Board or Arduino MKR WiFi 1010, MKR Vidor 4000

  • WiFi access to the Internet

The Circuit

No circuit is required for this tutorial.

Software Essentials

Includes:

<SPI.h> This library allows you to communicate with SPI devices, with the Arduino as the master device. In this tutorial the WiFi101 library uses it to control the WiFi radio. It is included for compatibillity with IDE versions before 1.6.5.

<WiFi101.h> This is the library shared across the old WiFi enabled boards to manage the connections to the Internet through WiFi.

or

<WiFiNINA.h> This is the library shared across the new WiFi enabled boards to manage the connections to the Internet through WiFi. Please change <WiFi101.h> into <WiFiNINA.h> if you are using an Arduino MKR WiFi 1010 or MKR VIDOR 4000

<RTCZero.h> This library allows an Arduino Zero, MKR1000 or MKR WiFi 1010 board to control and use the internal Real Time Clock. When an alarm is set, the board can be put in sleep mode, with very low power consumption, waiting to be woken up by the alarm. The RTC supports just one active alarm at a time.

Functions defined in the sketch:

printWifiStatus() Prints to Serial console a full set of information including the SSID of the network you're connected to, the local IP address and the signal strength.

alarmMatch() This is the function that is triggered by the interrupt set in the setup part. It is activated at every 00 seconds occurrence.

connectToAP() It uses the WiFi library functions to connect to the Access Point (AP) with Access point ID (SSID) and password embedded in the code. It also works with a WiFi shield.

httpRequest() This function prints the time on Serial console, then it sends out an HTTP GET request to Arduino.cc website. Note: Arduino.cc uses SHA 256 certificate. Be sure to connect to sites that use SHA 256, because SHA 348 is still not yet supported. Comodo for example has certificate SHA-348 with RSA encryption.

listenToClient() Using millis() this function waits for 5 seconds the response from the Arduino.cc website and it prints out on Serial console any character received, then the client is closed.

print2digits(int number) An handy function that puts a leading zero to any single digit number to be printed on Serial console, offering a better formatting on screen.

Code

We want to get an alarm every minute with the RTC functions. We use rtc.setAlarmSeconds( 0); and then rtc.enableAlarm(rtc.MATCH_SS);. The first functions sets at "00" the value of seconds to compare; the second function enables the alarm and sets its trigger on the match of the actual time and the set value for seconds. The condition is met every time the seconds digits go to "00", that is every minute. When the condition is met, the RTC generates an interrupt request. The request is serviced by the function alarmMatch that sets to true the flag sendRequest used by the main loop. There, If this flag is true, the request to the Arduino.cc site is made, otherwise nothing is done. This solution allows you to do something else between the interrupts because the code execution flows without being blocked by any big delay() function. You can also combine this tutorial with the WiFi RTC to automatically set the time of the RTC. Please remember that RTC gets resetted every time the board is powered up.


/*

  Scheduled WiFi SSL Web Client for MKR1000

  This sketch connects to the Arduino website every minute and downloads the ASCII logo to display it on the serial monitor

  created 19 Jan 2016

  by Arturo Guadalupi <a.guadalupi@arduino.cc>

  http://arduino.cc/en/Tutorial/

  This code is in the public domain.

*/

#include <SPI.h>
#include <WiFi101.h>
#include <RTCZero.h>

char ssid[] = "yourPassword";      //  your network SSID (name)
char pass[] = "yourNetwork";       // your network password
int keyIndex = 0;                  // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

// Initialize the Wifi client library

WiFiSSLClient client;

// server address:
char server[] = "www.arduino.cc";

bool sendRequest = true; // used to understand if the http request must be sent

/* Create an rtc object */

RTCZero rtc;

/* Change these values to set the current initial time */

const byte seconds = 50;

const byte minutes = 00;

const byte hours = 17;

/* Change these values to set the current initial date */

const byte day = 17;

const byte month = 11;

const byte year = 15;

void setup() {

  //Initialize Serial and wait for port to open:

  Serial.begin(115200);

  connectToAP();    // connect the board to the access point

  printWifiStatus();

  httpRequest();

  listenToClient();

  rtc.begin();

  rtc.setTime(hours, minutes, seconds);

  rtc.setDate(day, month, year);

  rtc.setAlarmTime(0, 0, 0);    //in this way the request is sent every minute at 0 seconds

  rtc.enableAlarm(rtc.MATCH_SS);

  rtc.attachInterrupt(alarmMatch);
}

void loop() {

  if (sendRequest) {

    sendRequest = false;

    httpRequest();

    listenToClient();

  }
}

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");
}

void alarmMatch() {

  sendRequest = true;
}

void connectToAP() {

  // check for the presence of the shield:

  if (WiFi.status() == WL_NO_SHIELD) {

    Serial.println("WiFi shield not present");

    // don't continue:

    while (true);

  }

  // attempt to connect to Wifi network:

  while ( status != WL_CONNECTED) {

    Serial.print("Attempting to connect to SSID: ");

    Serial.println(ssid);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:

    status = WiFi.begin(ssid, pass);

    // wait 1 second for connection:

    delay(1000);

  }
}

// this method makes a HTTP connection to the server:
void httpRequest() {

  sendRequest = false;

  // Print request time

  Serial.println();

  Serial.print("Request sent @ ");

  print2digits(rtc.getHours());

  Serial.print(":");

  print2digits(rtc.getMinutes());

  Serial.print(":");

  print2digits(rtc.getSeconds());

  Serial.println();

  Serial.println();

  if (client.connect(server, 443)) {

    // Make a HTTP request:

    client.println("GET /asciilogo.txt HTTP/1.1");

    client.println("Host: www.arduino.cc");

    client.println("Connection: close");

    client.println();

  }

  else {

    Serial.println("connection failed");

  }
}

void listenToClient()
{

  unsigned long startTime = millis();

  bool received = false;

  while ((millis() - startTime < 5000) && !received) { //try to listen for 5 seconds

    while (client.available()) {

      received = true;

      char c = client.read();

      Serial.write(c);

    }

  }

  client.stop();

  Serial.println();
}

void print2digits(int number) {

  if (number < 10) {

    Serial.print("0");

  }

  Serial.print(number);
}

See also

Analog to Midi WiFi RTC Battery Life tutorial