223 lines
4.9 KiB
C++
Executable File
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;
|
|
}
|
|
|
|
} |