Hardware components | ||||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 5 | |||
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
Software apps and online services | ||||||
![]() |
| |||||
![]() |
| |||||
![]() |
|
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 worksThis 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.
#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 code
C/C++//#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);
}*/
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
};*/
Comments