meteoFront/frontend.ino
2020-02-23 21:50:43 +03:00

223 lines
4.9 KiB
C++
Executable File

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include "SSD1306Brzo.h"
#include "wifi.h"
#include <ESP8266HTTPClient.h>
String inTemp,outTemp,pressure,humid;
const unsigned short int onTime=6, offTime=23, beepDelay=60, timeOffset=3;
short int lastBeep;
const String httpAddr="http://meteo-front:1880";
int alarms[10]={660,1260};
int alarmDuration(6);
int alarmStop(0);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
SSD1306Brzo display(0x3C, 5, 4);
void demo();
void setup(){
//==DISPLAY INIT==
display.init();
display.flipScreenVertically();
display.setContrast(255);
// display.invertDisplay();
display.clear();
display.fillRect(0,0,128,64);
display.display();
delay(3000);
if (!digitalRead(0)) //button
demo(120000);
Serial.begin(115200);
//==WIFI CONNECT==
WiFi.mode(WIFI_STA);
//==NTP INIT==
timeClient.begin();
timeClient.setTimeOffset(timeOffset*3600);
netTasks();
}
void loop(){
mainScreen();
if (((timeClient.getHours()*60 + timeClient.getMinutes()) % beepDelay == 0)&&(timeClient.getSeconds() < 1)&&(!nightMode())){
tone(15,1000);
delay(100);
noTone(15);
tone(15,1000);
delay(100);
noTone(15);
lastBeep = timeClient.getHours()*60;
netTasks();
// demo(12000);
}
else {
delay(500);
}
checkAlarm();
}
void checkAlarm()
{
for (int i(0);i<10;i++)
{
if ((timeClient.getHours()*60+timeClient.getMinutes() >= alarms[i])&&(timeClient.getHours()*60+timeClient.getMinutes() - alarms[i] < alarmDuration)&&(alarms[i] != 0))
{
if (alarmStop != alarms[i])
{
tone(15,1000);
delay(100);
noTone(15);
delay(100);
tone(15,1000);
delay(100);
noTone(15);
delay(1000);
}
if (!digitalRead(0)) //button
alarmStop = alarms[i];
if (timeClient.getHours()*60+timeClient.getMinutes() - alarms[i] > alarmDuration)//stop current alarm
alarmStop = -1;
}
}
}
void netTasks() {
HTTPClient http;
WiFi.forceSleepWake();
if (WiFi.status() != WL_CONNECTED) {
wifiConnect(false);
}
http.begin(httpAddr+"/inTemp");
if (http.GET() < 0)
return;
inTemp="i:"+http.getString()+"C";
http.end();
http.begin(httpAddr+"/outTemp");
if (http.GET() < 0)
return;
outTemp="o:"+http.getString()+"C";
http.end();
http.begin(httpAddr+"/humid");
if (http.GET() < 0)
return;
humid="h:"+http.getString()+"%";
http.end();
http.begin(httpAddr+"/pressure");
if (http.GET() < 0)
return;
pressure="p:"+http.getString()+"mBar";
http.end();
updateNtp();
WiFi.disconnect();
}
void mainScreen() {
display.clear();
if (!nightMode()) {
int x = (timeClient.getHours()*60+timeClient.getMinutes())/11;
//Time
display.setFont(ArialMT_Plain_24);
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.drawString(64, 22, timeClient.getFormattedTime());
//progress bar
display.drawLine(0,22,x,22);
// external temp //top left
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 0, outTemp);
//pressure //top right
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_RIGHT);
display.drawString(128, 0, pressure);
//inside temp //bottom left
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0, 53, inTemp);
//humid //bottom right
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_RIGHT);
display.drawString(128, 53, humid);
}
display.display();
}
void displayStatus(){
bool run(true);
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
int x(0),y(0);
bool xd(false);//false - right, true - left
while (run)
{
display.clear();
if (WiFi.status() != WL_CONNECTED) {
display.fillRect(x,y,30,50);
if (x > 128-30)
xd = true;
if (x < 0)
xd = false;
if (xd) {
x--;
} else {
x++;
}
display.drawString(1, 52, ssid);
}
if (WiFi.status() == WL_CONNECTED) {
run = false;
}
display.display();
}
}
void updateNtp() {
while (!timeClient.update())
Serial.println(timeClient.getHours());
}
bool nightMode() {
if ((timeClient.getHours() > offTime)||(timeClient.getHours() < onTime)) {
return true;
}
else
return false;
}
void wifiConnect(bool boot) {
int beginMillis = millis();
WiFi.begin(ssid, password);
displayStatus();
}
void demo(int duration)
{
short xp(0),yp(0),xd(1),yd(1);
unsigned int startTime = millis();
bool run(true);
while (run) {
if ((xp > 128) || (xp < 0))
{
xd = xd * -1;
}
if ((yp > 64) || (yp < 0))
{
yd = yd * -1;
}
xp+=xd;
yp+=yd;
delay(10);
display.clear();
display.fillCircle(xp,yp,10);
display.display();
if (millis() - startTime > duration)
run = false;
}
}