/**--------------------------------------------------------------------------------------------------------------------------------------*
* India COVID-19 live status using custom ThingSpeak HTTP web communication integration *
* ---------------------------------------------------------------------------------- *
* *
* Author: Sumit @ HackElectronics *
* Date: April 1, 2020 *
* Version: 1.0.0v *
* Language: C/C++ *
* Contact: sumit.0x0ptimus@yahoo.com *
* Difficulty: Begineer/Intermediate *
* *
* Feel like supporting my work? Let's join to hack the change with Sumit aka @vilaksh. *
* *
* This program shows how to use thingspeak integration and ThingsHttp requests to fetch data from the below website, *
* https://www.worldometers.info/coronavirus/country/india/. Also this shows how to display battery status as a bar on top *
* *
* Hardware used: *
* 1. Particle Argon x1 *
* 2. Sparkfun QUIIC MicroOLED *
* -------------------------------------------------------------------------------------------------------------------------------------**/
// This #include statement was automatically added by the Particle IDE.
#include <SFE_MicroOLED.h>
#include "Particle.h"
#include <Wire.h> // Include Wire if you're using I2C
//////////////////////////
// MicroOLED Definition //
//////////////////////////
//The library assumes a reset pin is necessary. The Qwiic OLED has RST hard-wired, so pick an arbitrarty IO pin that is not being used
#define PIN_RESET 9
//The DC_JUMPER is the I2C Address Select jumper. Set to 1 if the jumper is open (Default), or set to 0 if it's closed.
#define DC_JUMPER 1
//////////////////////////////////
// MicroOLED Object Declaration //
//////////////////////////////////
MicroOLED oled(PIN_RESET, DC_JUMPER); // I2C declaration
int displayTime();
int covidIndia();
int index1 = 0;
int index2 = 0;
int batHealth = 0;
String data = "";
String values = "";
String deaths = "";
String recovered = "";
String cases = "";
float voltage = analogRead(BATT) * 0.0011224;
void setup()
{
Particle.subscribe("hook-response/IndiaCase", myHandler, MY_DEVICES);
//Particle.subscribe("Calls",myCalls);
delay(100);
Wire.begin();
oled.begin(); // Initialize the OLED
oled.clear(ALL); // Clear the display's internal memory
oled.display(); // Display what's in the buffer (splashscreen)
delay(1000); // Delay 1000 ms
oled.clear(PAGE); // Clear the buffer.
}
void loop()
{
displayTime();
data = "";
// Trigger the integration
Particle.publish("IndiaCase", data, PRIVATE);
covidIndia();
//lines();
}
int displayTime()
{
// Reading the voltage and convering into pixels to be rendered on screen
voltage = analogRead(BATT) * 0.0011224;
voltage = voltage / 3.3;
batHealth = (int) (voltage * 63.0);
//set zone as per UTC in hours format, also set it in 12 hours format
Time.zone(+5.5);
oled.clear(PAGE);
oled.setFontType(1);
oled.setCursor(12,12);
oled.print(Time.hourFormat12());
oled.print(":");
oled.print(Time.minute());
// display date as per calendar
oled.setFontType(0);
oled.setCursor(6,30);
oled.print(Time.day());
oled.print("/");
oled.print(Time.month());
oled.print("/");
oled.print(Time.year());
oled.line(0,0,batHealth,0);
oled.display();
delay(4000);
}
/**void myCalls(const char *event, const char *data)
{
}**/
void myHandler(const char *event, const char *data)
{
/** the coming data is in this format
*<span style=\"color:#aaa\">1,590 </span>\n\n<span>45</span>\n\n<span>148</span>
**/
values = data;
cases = "";
deaths = "";
recovered = "";
//finding index of ">" and "<" and extracting inbetween numbers for active cases
index1 = values.indexOf(">");
index2 = values.indexOf("<", index1);
cases = values.substring(index1+1,index2).trim();
//shortening the string for next set of number extractions
values = values.remove(0,index2);
//replacing new line escape sequences and html tags all together using space character
values = values.replace("</span>"," ");
values = values.replace("<span>"," ");
values = values.replace("\n"," ");
values = values.trim(); // removing trailing whitespaces
/**By now we have made our data look like this 45____148 from
<span style=\"color:#aaa\">1,590 </span>\n\n<span>45</span>\n\n<span>148</span>**/
Serial.println(values);
// you may try another logic too but keep in mind we will get different numbers from integration response each time there
//is new COVID India case
index1 = values.indexOf(" "); // find first space character and extract all digits before it
index2 = values.lastIndexOf(" "); // find last space character and extract all digits after it
deaths = values.substring(0,index1).trim();
recovered = values.substring(index2+1).trim();
// just for debugging nothing else
Serial.print(cases);
Serial.print(deaths);
Serial.print(recovered);
delay(4000);
}
int covidIndia()
{
// display India total COVID cases
oled.clear(PAGE);
oled.setFontType(0);
oled.setCursor(18,12);
oled.print("INDIA");
oled.setFontType(1);
oled.setCursor(12,30);
oled.print(cases);
oled.line(0,0,batHealth,0);
oled.display();
delay(4000);
// display India COVID deaths
oled.clear(PAGE);
oled.setFontType(0);
oled.setCursor(15,12);
oled.print("DEATHS");
oled.setFontType(1);
oled.setCursor(22,30);
oled.print(deaths);
oled.line(0,0,batHealth,0);
oled.display();
delay(4000);
// display India COVID recovers
oled.clear(PAGE);
oled.setFontType(0);
oled.setCursor(5,12);
oled.print("Recovered");
oled.setFontType(1);
oled.setCursor(20,30);
oled.print(recovered);
oled.line(0,0,batHealth,0);
oled.display();
delay(4000);
}
// just for OLED trial and testing
void lines()
{
oled.clear(PAGE);
int middleX = oled.getLCDWidth() / 2;
int middleY = oled.getLCDHeight() / 2;
int xEnd, yEnd;
int lineWidth = min(middleX, middleY);
for (int i=0; i<1; i++)
{
for (int deg=0; deg<360; deg+=15)
{
xEnd = lineWidth * cos(deg * PI / 180.0);
yEnd = lineWidth * sin(deg * PI / 180.0);
oled.line(middleX, middleY, middleX + xEnd, middleY + yEnd);
oled.display();
delay(3);
}
for (int deg=0; deg<360; deg+=15)
{
xEnd = lineWidth * cos(deg * PI / 180.0);
yEnd = lineWidth * sin(deg * PI / 180.0);
oled.line(middleX, middleY, middleX + xEnd, middleY + yEnd, BLACK, NORM);
oled.display();
delay(3);
}
}
}
Comments