Project tutorial
Arduino Light Controller Using MKR IoT Carrier

Arduino Light Controller Using MKR IoT Carrier © GPL3+

Tired of just flipping a switch? Try this!

  • 25 views
  • 0 comments
  • 0 respects

Components and supplies

Mkr wifi 1010 usibb9nl4v
Arduino MKR WiFi 1010
Any MKR board (I think...?) This is the one I have, so I am using it
×1
Abx00021 featured mh3emrn0ms
Arduino UNO Wifi Rev.2
You can use any WiFi board, but you will need to change the libraries to meet that
×1
Adafruit industries ada64 image 75px
Solderless Breadboard Half Size
Any size will do
×1
11026 02
Jumper wires (generic)
Generic M-M wires
×5
Arduino MKR IoT Carrier
×1
09590 01
LED (generic)
Any color (symbolizes lights)
×1
Relay (generic)
I am using a Songle SRD-05VDC-SL-C module
×1
4415447 jg5sklyzsj
Resistor 220 ohm
Use a 10 ohm resistor instead if using 3.3V power
×1
Mfr 25frf52 10k sml
Resistor 10k ohm
×1
24ac5200 40
Graphic OLED, 128 x 64 Pixels
128x64 monochrome display that is compatible with U8G2 library
×1
18650 battery
I could not find these anywhere
×1
Generic button
×1
Arduino MKR IoT Carrier
×1

Apps and online services

About this project

About

This is a project I decided to attempt to automate the lights in my room from anywhere in the house. It uses the new Arduino MKR IoT Carrier, Arduino MKR WiFi 1010, Arduino WiFi Rev2, some jumper wires, an LED (as an example, working on getting it actually into the lights, ) a 220 ohm resistor, and finally, a relay.

How it works

This project uses Blynk to communicate between three devices -- the WiFi Rev2, the MKR WiFi 1010, and your phone. It uses a Bridge widget to communicate between the two Arduinos, and the Blynk.virtualWrite() function to communicate with the phone/mobile device through Blynk.

Displays

- On the WiFi Rev2:

Light on/off data, if it is disconnected/reconnecting, and if auto reconnect is on/off.

-On the mobile device:

The Blynk app section of this project has an LCD widget controlled by the MKR board, three gauges, and a button. The LCD widget simply says "Light on"/"Light off." The gauges show the WiFi strength of each device, and the battery percent of the MKR board. The button will toggle the lights.

-On the MKR IoT Carrier:

The IoT Carrier's built-in display will show a WiFi icon if connected to WiFi, a battery graphic, if the lights can be toggled or not, a line of text that says "Light controlling, " a sun graphic if the light is on, and auto reconnect status.

Human interfaces (buttons, proximity, etc)

MKR IoT Carrier

The IoT Carrier uses 4 of the 5 buttons in this project.

Button 1 - Toggle auto reconnect. This will show at the bottom of the display

Button 2 - Nothing

Button 3 - Toggle lights

Button 4 - Toggle if the lights can be changed on the carrier

Button 5 - Toggle the flashlight (RGB LEDs on white, brightness is changeable in the code. Brightness is currently set to about 1/2)

Proximity - If anything gets close, (proximity value 150) it will toggle the lights

WiFi Rev2

Button 1 - Toggle light (sends data to MKR board)

Button 2 - Toggle auto-reconnect. (Will show on the display)

Mobile device

The button on the mobile device should be connected to V1, and it will toggle the lights.

Images of the project:

Some images to show what it looks like.

Code

MKR IoT Carrier codeC/C++
Upload this code to the MKR board attached to the carrier.
#include <Arduino_MKRIoTCarrier.h>  // include the IoT carrier library
#include "Images.h"                 // Bitmap images file
#include <SPI.h>                    // include needed libraries
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
#include <utility/wifi_drv.h>       // needed for RGB LED

WidgetBridge bridge1(V0);         // data transfer widget (bridge)
BlynkTimer timer;                 // timer for sending data
WidgetLCD lcd(V2);

#define GREEN_LED_pin   25        // RGB LED pins (wifi_drv)
#define BLUE_LED_pin    27
#define RED_LED_pin     26

char ssid[] = "Your SSID";     // SSID, password, and auth token
char pass[] = "Your password";
char auth[] = "Your auth token (Blynk)";

const int brightness = 120;       // brightness of the lights
int batteryPercent;               // battery percent
int color;                        // color of battery, set to nothing to start
int lastBatteryPercent = -1;      // set it to -1 so that it thinks the battery has changed percent, and do the battery

bool relayCanChange = true;       // can the relay change?
bool relayOn;                     // is the relay on?
bool lastRead = relayOn;          // last state of the relay
bool ownLights = false;           // are the lights on the carrier on?
bool autoReconnect = true;        // auto reconnections?

MKRIoTCarrier carrier;             // init the IoT carrier as "carrier"
uint32_t white = carrier.leds.Color(brightness, brightness, brightness); // color white (R, G, B) not actually used currently (full brightness)
#define BLYNK_PRINT Serial         // Blynk debug output
void setup() {
// insert this line of code in here (setup()) to change the color
// carrier.display.setTextColor(ST77XX_(your color));
// currently it is set to CYAN (ST77XX_CYAN)
  carrier.display.setTextColor(ST77XX_CYAN);    // Set text color
  // set up RGB LED
  WiFiDrv::pinMode(RED_LED_pin, OUTPUT);        //RED
  WiFiDrv::pinMode(GREEN_LED_pin, OUTPUT);      //GREEN
  WiFiDrv::pinMode(BLUE_LED_pin, OUTPUT);       //BLUE

  //turn off RGB led
  WiFiDrv::digitalWrite(RED_LED_pin, LOW);
  WiFiDrv::digitalWrite(GREEN_LED_pin, LOW);
  WiFiDrv::digitalWrite(BLUE_LED_pin, LOW);
  // start the carrier and check for errors
  if (!carrier.begin()){
    while(1){
      // if there is an error, flash the RGB LED red
      setLEDColor(255, 0, 0);
      delay(1000);
      setLEDColor(0, 0, 0);
      delay(1000);
    }
  }
  // set LED color to RED (connecting...) (setLEDColor(r, g, b) is a custom function at the bottom)
  setLEDColor(255, 0, 0);
  Serial.begin(9600);                       // Start Serial
  Blynk.begin(auth, ssid, pass);            // Start Blynk
  carrier.display.fillScreen(ST77XX_BLACK); // clear display
  carrier.display.setRotation(0);           // set display settings
  carrier.display.setTextSize(2);
  // for some reason it cannot draw things until Blynk is connected
//  carrier.display.drawBitmap(20, 60, loading, 200, 100, ST77XX_WHITE);
  while (!Blynk.connected()){               // wait for Blynk connections
//    carrier.display.drawBitmap(20, 60, loading, 200, 100, ST77XX_WHITE);
  }
  lcd.clear();
  carrier.display.fillScreen(ST77XX_BLACK); // clear display (fill with black. If you know another way, please tell)
  carrier.display.setCursor(50, 50);
  carrier.display.print("Connected!");      // print success message to display
  setLEDColor(0, 255, 0);                   // set LED to green (connected)
  delay(5000);                              // wait 5 seconds
  carrier.display.fillScreen(ST77XX_BLACK); // clear display
  timer.setInterval(250L, sendData);        // set up timer (every 250 ms do sendData())
  doGUI();                                  // do the GUI for the project (displays "Light controlling")
}

void loop() {
  Blynk.run();              // handle Blynk and timer
  timer.run();
  doBetterBattery();        // output battery data at the top (optional)
  if (Blynk.connected()){   // set the LED color based on Blynk connection
    setLEDColor(0, 255, 0); // green
    drawWiFi();             // draw the wifi
  }
  else{                     // If not connected:
    setLEDColor(255, 0, 0); // red
    clearWiFi();            // clear the wifi
    clearDisplay();         // clear display
    carrier.display.setTextColor(ST77XX_RED);   // set text color to red
    textAt(5, 120, "WiFi Disconnected!");       // display "WiFi Disconnected!"
    carrier.display.setTextColor(ST77XX_CYAN);  // set text color back to cyan
    if (autoReconnect){     // if auto reconnect is true
      textAt(20, 150, "Reconnecting...");
      reconnect();          // reconnect
      clearDisplay();       // clear display
      textAt(20, 150, "Reconnected!");
    }
    else{
      textAt(20, 150, "Waiting for manual   reconnections...");
      // wait for a button press
      while (isAnyButtonPressed()){
        
      }
      textAt(40, 180, "Reconnecting...");
      reconnect();          // reconnect
      clearDisplay();       // clear display
      textAt(20, 150, "Reconnected!");
    }
    delay(5000);              // wait 5 seconds
    clearDisplay();           // clear display
    doGUI();                  // do the GUI
    lastBatteryPercent = -1;  // do this so it thinks the battery percent has changed, and show the battery
    doBetterBattery();        // do the better battery display
  }
  Blynk.virtualWrite(V3, rssiPercent());      // write the WiFi strength and battery percent to Blynk
  Blynk.virtualWrite(V4, getBatteryPercent());
  carrier.Buttons.update();         // update buttons
  if (carrier.Button4.getTouch()){  // if button 4 is pressed, toggle the lights on the carrier (built in flashlight)
    ownLights = !ownLights;         // toggle the flashlight
    delay(100);
  }
  if (carrier.Button3.getTouch()){ // if button 3 is pressed, change if the lights can change
    relayCanChange = !relayCanChange;
    delay(90);
  }
  if (carrier.Button0.getTouch()){    // if the first button is pressed:
    autoReconnect = !autoReconnect;   // toggle auto reconnect
    String tempText;
    if (autoReconnect){
      tempText = "   On";
    }
    else{
      tempText = "   Off";
    }
    // display if auto reconnect is on or off
    textAt(20, 175, "Auto reconnections: " + tempText);
    delay(3000);
    carrier.display.fillRect(0, 170, 240, 40, ST77XX_BLACK);
  }
  carrier.leds.clear();             // clear LEDS
  if (ownLights){                   // if the flashlight is on, set the LEDs on to the brightness  R (0-255)    G (0-255)   B (0-255)
    carrier.leds.fill(white, 0, 5); // fill the LEDs
  }
  carrier.leds.show();              // show the LEDs
  carrier.display.fillRect(15, 60, 240, 20, ST77XX_BLACK); // clear this output:
  if (relayCanChange){
    textAt(15, 60, "Lights can change");
  }
  else{
    textAt(15, 60, "Lights cannot change");
  }
  if (lastRead != relayOn){   // if the relay has changed
    lcd.clear();              // clear the virtual lcd
    if (relayOn){             // display light on/off
      lcd.print(0, 0, "Light on");
    }
    else{
      lcd.print(0, 0, "Light off");
    }
  }
  lastRead = relayOn;         // set the last state of the relay to the current state
  delay(50);                  // delay a bit so as not to overwhelm the MKR board and display
}

void sendData(){    // do this when the timer "ticks" (every 200 ms)
  int proximity;    // proximity variable
  if (carrier.Light.proximityAvailable()){        // update proximity and buttons
    proximity = carrier.Light.readProximity();    // get proximity
    carrier.Buttons.update();                     // update buttons
    // if something is close or button 2 is pressed and the relay can change
    if (((proximity < 150) or (carrier.Button2.getTouch())) and (relayCanChange == true)){
      relayOn = !relayOn;         // toggle the relay
      delay(90);                  // wait a small amount
    }
  }
  if (relayOn){ // send data ON and draw sun
    bridge1.virtualWrite(V5, 1);  // write the data to other device through the bridge
    drawSun();                    // draw the sun
  }
  else{ // send data OFF (and maybe draw clouds, its a work in progress)
    bridge1.virtualWrite(V5, 0);  // write the data to other device through the bridge
    clearSun();                   // clear the sun
  }
}

BLYNK_WRITE(V6){                // when receiving data on V6
  int value = param.asInt();    // get the value
  if (value == 1){              // if the value is 1
    relayOn = !relayOn;         // toggle the relay
  }
}

BLYNK_CONNECTED() {  // connected now, set the bridge auth token
  bridge1.setAuthToken("Other auth token");
}
void setLEDColor(uint8_t R, uint8_t G, uint8_t B){ // custom function to help manage RGB LED
  //R, G, and B values should not exceed 255 or be lower than 0.
  
  //set ESP32 wifi module RGB led color
  WiFiDrv::analogWrite(RED_LED_pin, R);   // Red
  WiFiDrv::analogWrite(GREEN_LED_pin, G); // Green
  WiFiDrv::analogWrite(BLUE_LED_pin, B);  // Blue
}
int getBatteryPercent(){    // return the battery percent as int
  int sensorValue = analogRead(ADC_BATTERY);        // read battery pin
                                                    // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 3.7V):
                                                    //  float voltage = sensorValue * (3.7 / 1023.0);
  int percent = map(sensorValue, 0, 1023, 0, 100);  // convert battery reading to percent reading
  return percent;                                   // return reading
}
void drawBatteryShell(){ // draw battery shell
  carrier.display.drawRect(108, 5, 27, 13, ST77XX_WHITE);
  carrier.display.fillRect(135, 9, 3, 5, ST77XX_WHITE);
}/*
void drawFirstBar(){ // draw first bar
  carrier.display.fillRect(110, 7, 7, 9, ST77XX_WHITE);
}
void drawSecondBar(){ // draw second bar
  carrier.display.fillRect(118, 7, 7, 9, ST77XX_WHITE);
}
void drawThirdBar(){ // draw third bar
  carrier.display.fillRect(126, 7, 7, 9, ST77XX_WHITE);
}*/
void drawBatteryShellRed(){ // draw the shell as red color (used when battery is low)
  carrier.display.drawRect(108, 5, 27, 13, ST77XX_RED);
  carrier.display.fillRect(135, 9, 3, 5, ST77XX_RED);
}
/*
void doBattery(){ // do the battery and draw it
  // this took a lot of fine-tuning
  batteryPercent = getBatteryPercent(); // get battery percent with the function
  drawBatteryShell(); // draw the shell
  if (batteryPercent > 10){ // draw the bars (change these percent as you like)
    drawFirstBar();
  }
  if (batteryPercent > 40){
    drawSecondBar();
  }
  if (batteryPercent > 80){
    drawThirdBar();
  }
  textAt(110, 40, String(batteryPercent) + "%"); // display battery percent
}*/
void textAt(int x, int y, String text){ // much easier function to use
  carrier.display.setCursor(x, y);      // set the cursor to (x, y)
  carrier.display.print(text);          // print the text
}
void clearDisplay(){ // fill screen with BLACK color
  carrier.display.fillScreen(ST77XX_BLACK);
}
void drawSun(){       // draw the sun bitmap (to show light is on)
  carrier.display.drawBitmap(100, 120, sun, 50, 50, ST77XX_YELLOW);
}
void doGUI(){         // output GUI
  textAt(10, 100, "Light controlling");
}
void clearGUI(){  // clear the GUI by drawing a filled black rectangle around it
  carrier.display.fillRect(10, 100, 100, 20, ST77XX_BLACK);
}
void clearSun(){  // clear the sun the same way
  carrier.display.fillRect(95, 115, 60, 60, ST77XX_BLACK);
}
void drawWiFi(){  // draw the WiFi bitmap and clear a dot that goes with it
  carrier.display.drawBitmap(60, 5, wifi, 50, 30, ST77XX_WHITE);
  carrier.display.fillRect(55, 25, 10, 10, ST77XX_BLACK);
}
void clearWiFi(){ // clear the WiFi bitmap
  carrier.display.fillRect(58, 3, 55, 35, ST77XX_BLACK);
}
BLYNK_WRITE(V1){  // when receiving data on V1
  int val = param.asInt();    // get the value
  if (val == 1){              // if the value is 1, change the relay
    relayOn = !relayOn;
    delay(150);
  }
}
void doBetterBattery(){       // draw a more modern battery
  batteryPercent = getBatteryPercent();                       // get the battery percent
  if (batteryPercent != lastBatteryPercent){                  // if the battery percent has changed
    int length = map(batteryPercent, 0, 100, 1, 25);          // map the battery percent to 25 pixels
    carrier.display.fillRect(107, 4, 140, 60, ST77XX_BLACK);  // clear the battery display
    if (batteryPercent < 5){                                  // if the percent is < 5
      color = ST77XX_RED;                                     // color is red
      drawBatteryShellRed();                                  // draw the shell red
    }
    else{                                                     // else
      color = ST77XX_WHITE;                                   // color is white
      drawBatteryShell();                                     // draw the shell as white
    }
    carrier.display.fillRect(110, 7, length, 9, color);       // draw the bar as the color selected
    textAt(110, 25, String(batteryPercent) + "%");            // display the battery percent
  }
  lastBatteryPercent = batteryPercent;                        // last battery percent is the current battery percent
}
int rssiPercent(){                              // function to get RSSI as percent
  return (map(WiFi.RSSI(), -100, 0, 0, 100));   // return the percent
}
/*
 * Old, unused code: 
 * 
  if (carrier.Button0.getTouch()){ // if button 0 is pressed:
    brightness -= 20; // lower brightness
    if (brightness < 0){
      brightness = 0;
    }
    delay(90);
  }
  if (carrier.Button1.getTouch()){ // if button 1 is pressed, increase brightness
    brightness += 20;
    if (brightness > 255){
      brightness = 240;
    }
    delay(90);
  }
 */
void reconnect(){                     // reconnect to Blynk
  while (!Blynk.connected()){         // while not connected
    Blynk.begin(auth, ssid, pass);    // begin Blynk again
  }
}
bool isAnyButtonPressed(){      // is any button pressed
  carrier.Buttons.update();     // update buttons
  // return if any button is pressed
  return ((carrier.Button0.getTouch()) or (carrier.Button1.getTouch()) or (carrier.Button2.getTouch()) or (carrier.Button3.getTouch()) or (carrier.Button4.getTouch()));
}
Arduino WiFi Rev2 codeC/C++
Upload this code to the Arduino WiFi Rev2 with the relay pins to +5V, GND, and D2
//#define BLYNK_PRINT Serial // debug output for Blynk

#include <U8g2lib.h>
#include <Wire.h>
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);

#define GREEN_LED_pin   26 // pins for the RGB LED (built in to the Arduno)
#define BLUE_LED_pin    27
#define RED_LED_pin     25

#include <Blynk.h>                  // necessary libraries
#include <SPI.h>
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
WidgetBridge bridge1(V0);           // bridge widge for receiving data

char auth[] = "Auth token"; // auth, ssid, and pass
char ssid[] = "SSID";
char pass[] = "Password";

int receivedVal;              // received data
bool relayOn = false;         // is the relay on?
bool lastRelayState = false;  // last relay state
const int relayPin = 2;       // relay pin
const int buttonPin = 3;      // button pin for manual control
const int reconnectPin = 4;   // button to reconnect
bool canReconnect = true;    // default to false, changeable by button press
/*   CONNECTIONS
  RELAY ----- Arduino
  +     ----- 5V
  -     ----- GND
  S     ----- D2
  
  RELAY                 -----    Light (can be LED, etc)
  
  NC (normally closed)  -----    Nothing
  Middle pin            -----    One pin of light
  NO (normally open)    -----    Power (wall, +5V, etc)
  Normally open means that when the relay does not have power, the circuit is open, meaning the light is off. I decided to use this side because I wanted a saftey, like if my Arduino loses power, short circuits, or anything else bad, it would stop powering the relay, meaning the lights would go off.
  
  LED connections (using LED as an example)
  shorter end (GND)  ----- 220 ohm resistor ----- GND
  longer end (power) ----- +5V
  Use 10 ohm resistor for 3.3V power
*/

void setup() {
  u8g2.begin();
  u8g2.setFont(u8g2_font_7x14B_tf);
  u8g2.clearBuffer();
  u8g2.sendBuffer();
  // set up RGB LED (buitlin LED)
  WiFiDrv::pinMode(RED_LED_pin, OUTPUT);   //RED
  WiFiDrv::pinMode(GREEN_LED_pin, OUTPUT); //GREEN
  WiFiDrv::pinMode(BLUE_LED_pin, OUTPUT);  //BLUE

  //turn off RGB led
  WiFiDrv::digitalWrite(RED_LED_pin, LOW);
  WiFiDrv::digitalWrite(GREEN_LED_pin, LOW);
  WiFiDrv::digitalWrite(BLUE_LED_pin, LOW);
  
  pinMode(relayPin, OUTPUT);      // set up relay
  pinMode(buttonPin, INPUT);      // set up both buttons
  pinMode(reconnectPin, INPUT);
  Serial.begin(9600);             // begin Serial
  setLEDColor(255, 0, 0);         // set LED color to red
  clear();
  textAt(25, 25, "Connecting");
  send();
  Blynk.begin(auth, ssid, pass);  // begin Blynk
  while (!Blynk.connected());     // wait for Blynk connections
  setLEDColor(0, 255, 0);         // set the LEDcolor to green (connected now!)
  clear();
  textAt(25, 25, "Connected");
  send();
  delay(5000);
  clear();
  send();
}
bool lastState, currentState;
void loop() {
  Blynk.run(); // handle Blynk
  currentState = Blynk.connected();
  if (currentState){ // set LED color based on WiFi connections
    setLEDColor(0, 255, 0);  // green (connected)
    if (digitalRead(buttonPin) == HIGH){
      bridge1.virtualWrite(V6, 1);
      delay(150);
    }
  }
//  Serial.println(
  if (digitalRead(reconnectPin) == HIGH){
    canReconnect = !canReconnect;
    clear();
    textAt(5, 30, "Auto reconnect:");
    if (canReconnect){
      textAt(5, 60, "Yes");
    }
    else{
      textAt(5, 60, "No");
    }
    send();
    delay(2000);
    clear();
    send();
  }
  if (!currentState){
    setLEDColor(255, 0, 0);
    if (canReconnect){
      clear();
      textAt(5, 30, "Reconnecting...");
      send();
      while (!Blynk.connected()){
        Blynk.begin(auth, ssid, pass);
        manualControl();
      }
      clear();
      textAt(5, 30, "Reconnected!");
      send();
      setLEDColor(255, 0, 0);
      currentState = true;
      delay(5000);
      clear();
      send();
    }
    else{
      manualControl();
      delay(100);
    }
  }
  Blynk.virtualWrite(V2, rssiPercent());
//  Serial.println(rssiStrength);
  if (relayOn != lastRelayState){ // if the last state is not the current state
    clear();
    if (relayOn){
      textAt(5, 30, "Light: On");
    }
    else{
      textAt(5, 30, "Light: Off");
    }
    send();
  }
  if ((!currentState) and (currentState != lastState)){
    setLEDColor(255, 0, 0);
    clear();
    textAt(5, 30, "Disconnected");
    send();
  }
/*  if (!currentState){   // removed because of optional auto-reconnect
    manualControl();
    delay(100);
  }*/
  lastState = currentState;
  lastRelayState = relayOn;
}

BLYNK_WRITE(V5){ // when receiving data on V5 (make sure this is the same on the sending side)
  receivedVal = param.asInt();  // get the value
  if (receivedVal == 1){        // if it is 1
    relayOn = true;    // turn it on
  }
  else{ // else
    relayOn = false;   // turn it off
  }
  if (relayOn){ // if it is true, turn the relay on
    digitalWrite(relayPin, HIGH);
  }
  else{ // if it is false, turn the relay off
    digitalWrite(relayPin, LOW);
  }
}

void setLEDColor(uint8_t R, uint8_t G, uint8_t B){
  //R, G, and B values should not exceed 255 or be lower than 0.
  
  //set ESP32 wifi module RGB led color
  WiFiDrv::analogWrite(RED_LED_pin, R); //Red
  WiFiDrv::analogWrite(GREEN_LED_pin, G); //Green
  WiFiDrv::analogWrite(BLUE_LED_pin, B);  //Blue
}
BLYNK_CONNECTED(){ // connected, now set the auth token of the other device
  bridge1.setAuthToken("Other auth token");
}
void manualControl(){
  if (digitalRead(buttonPin) == HIGH){
    relayOn = !relayOn;
    delay(100);
  }
  digitalWrite(relayPin, relayOn);
}
void clear(){
  u8g2.clearBuffer();
}
void send(){
  u8g2.sendBuffer();
}
void textAt(int x, int y, String text){
  u8g2.setCursor(x, y);
  u8g2.print(text);
}
int rssiPercent(){
  return map(WiFi.RSSI(), -100, 0, 0, 100);
}
/*
 * This does not work:
 * Modify if you want
 * put after if (Blynk.connected()){
 * }
  else{
    setLEDColor(255, 0, 0);
    clear();
    textAt(5, 30, "Disconnected...");
    textAt(5, 60, "Reconnecting");
    send();
    bool result = Blynk.connect();
    delay(10000);
    if (result){
      textAt( ... );
    }
  }
 */
  /*
  else{
    setLEDColor(255, 0, 0);  // red (disconnected)
    clear();
    textAt(5, 30, "Disconnected");
    send();
    manualControl();
    delay(100);
  }*/
Images.hC/C++
Add a new tab in the MKR carrier code and add this
const unsigned char sun [] PROGMEM = {
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 
  0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 
  0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
  0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 
  0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 
  0xbf, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xbf, 0xff, 
  0xff, 0xc0, 0xff, 0xff, 0xff, 0xbf, 0xef, 0xff, 0xc0, 0xff, 0xfe, 0x7f, 0xbf, 0xcf, 0xff, 0xc0, 
  0xff, 0xfe, 0x3f, 0xbf, 0x9f, 0xff, 0xc0, 0xff, 0xff, 0x1f, 0xbf, 0x3f, 0xff, 0xc0, 0xff, 0xff, 
  0x8f, 0xfe, 0x7f, 0xff, 0xc0, 0xff, 0xff, 0xce, 0x0e, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xf8, 0x07, 
  0xff, 0xff, 0xc0, 0xff, 0xff, 0xf1, 0xe3, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xf3, 0xf1, 0xff, 0xff, 
  0xc0, 0xff, 0xff, 0xe3, 0xf9, 0xff, 0xff, 0xc0, 0xff, 0xf0, 0xe7, 0xf9, 0xc3, 0xff, 0xc0, 0xff, 
  0xe0, 0x67, 0xf8, 0x81, 0xff, 0xc0, 0xff, 0xff, 0xe7, 0xf9, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xf3, 
  0xf9, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xf1, 0xe3, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xf8, 0x07, 0xff, 
  0xff, 0xc0, 0xff, 0xff, 0xde, 0x0e, 0xff, 0xff, 0xc0, 0xff, 0xff, 0x8f, 0xfe, 0x7f, 0xff, 0xc0, 
  0xff, 0xff, 0x9f, 0xff, 0x3f, 0xff, 0xc0, 0xff, 0xfe, 0x3f, 0xbf, 0x9f, 0xff, 0xc0, 0xff, 0xfe, 
  0x7f, 0xbf, 0xcf, 0xff, 0xc0, 0xff, 0xfe, 0xff, 0xbf, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xbf, 
  0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 
  0xc0, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 
  0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 
  0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 
  0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0
};
const unsigned char wifi [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x00, 
  0x00, 0x00, 0x03, 0xfe, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x01, 0xf8, 0x00, 0x00, 0x00, 
  0x0f, 0xc3, 0xf8, 0x7c, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xfe, 0x1e, 0x00, 0x00, 0x00, 0x0e, 0x3f, 
  0xff, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0xe0, 
  0x00, 0x00, 0x00, 0x01, 0xf0, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xf8, 0xe0, 0x00, 0x00, 
  0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x1e, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf0, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00
};
// 'loading', 200x100px
/*
const unsigned char loading [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x28, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x61, 0xa0, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x53, 
  0x6d, 0xb6, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x1a, 0x2d, 0x14, 0x40, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0xa2, 0xfa, 0x2d, 0x14, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x9a, 0x6d, 0x14, 0x40, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x9e, 0xfb, 0xed, 0x13, 0xda, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x7f, 0xdf, 0xf3, 
  0xfc, 0xff, 0x3f, 0xcf, 0xf3, 0xfe, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x7f, 0x9f, 0xf7, 0xfd, 0xff, 0x7f, 0xdf, 0xf7, 0xfc, 0xff, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0xff, 
  0xbf, 0xe7, 0xf9, 0xfe, 0x7f, 0x9f, 0xe7, 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xff, 0xbf, 0xef, 0xfb, 0xfe, 0xff, 0xbf, 0xe7, 
  0xf9, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x1c, 0xff, 0x3f, 0xcf, 0xf3, 0xfc, 0xff, 0xbf, 0xef, 0xfb, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xff, 0x7f, 0xdf, 0xf7, 0xfd, 0xff, 
  0x3f, 0xcf, 0xf3, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x11, 0xfe, 0x7f, 0x9f, 0xe7, 0xf9, 0xfe, 0x7f, 0xdf, 0xf3, 0xfc, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00
};*/

Custom parts and enclosures

MKR IoT Carrier case
Ready-to-print files for the case of the IoT carrier.
Arduino WiFi Rev2 + 9V battery case
Ready-to-print file for a bottom for the WiFi Rev2 with a built-in 9V battery holder

Schematics

Connections for the WiFi Rev2 board
Wifi rev2 light contoller fzz   fritzing   breadboard view 5 2 2021 11 12 41 am (2) lc9emh0vn5

Comments

Similar projects you might like

Android App-Based Home Automation System Using IOT

Project tutorial by Team Autoshack

  • 72,583 views
  • 23 comments
  • 172 respects

Octopod: Smart IoT Home/Industry Automation Project

Project tutorial by Saksham Bhutani

  • 19,336 views
  • 12 comments
  • 53 respects

Arduino IoT Cloud Amazon Alexa Integration

Project tutorial by 4 developers

  • 34,469 views
  • 29 comments
  • 86 respects

Automatic Room Light Controller with Bidirectional Visitor

Project showcase by Team Amrendra Sahni

  • 16,148 views
  • 5 comments
  • 17 respects

IoT Shield for Arduino

Project tutorial by Team Mektrasys

  • 4,390 views
  • 0 comments
  • 14 respects

Bright Ball IoT

Project tutorial by Tittiamo

  • 2,952 views
  • 2 comments
  • 6 respects
Add projectSign up / Login