Multibox je zařízení, které jak již název napovídá, provádí více úkonů. Na 4 místném 7-segmentovém displeji zobrazuje aktuální čas, naměřenou teplotu a relativní vlhkost. Jas displeje je řízen fotorezistorem. Multibox je opatřen i senzorem pohybu, takže může sloužit i jako alarm.
// R1 = 43K1 ???
// GPIO2 = pin D4 = built-in LED
#define pinDHT 0 //pin D3
#define pinPIR 5 //pin D1 (GPIO5), piny D4 a D3 nefunguji s PIR
#define CLK 4 //pin D2
#define DIO 16 // pin D0
#include "DHTesp.h"
#include "TM1637Display.h"
#include "time.h"
#include "ESP8266WiFi.h"
DHTesp dht;
TM1637Display display(CLK,DIO);
const char* ssid = "***";
const char* password = "********";
volatile int adc=1111;
volatile unsigned long last = 0;
volatile byte brightness=0;
uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
int humidity, temperature;
void handleInterrupt() {
setShining();
digitalWrite(LED_BUILTIN, LOW); // Turn the LED on by making the voltage LOW
last=millis();
//Serial.println(last);
/*
* Send temperature, humidity, ADC to server
* The server stores it to DB with server timestamp
*/
}
void setShining(){
adc=analogRead(A0); // the bigger, the darker
/*if (adc<128) brightness=7;
else if (adc<256) brightness=6;
else if (adc<384) brightness=5;
else if (adc<512) brightness=4;
else if (adc<640) brightness=3;
else if (adc<768) brightness=2;
else if (adc<896) brightness=1;
else brightness=0;*/
//Serial.println(adc);
if (adc<256) brightness=3;
else if (adc<512) brightness=2;
else if (adc<768) brightness=1;
else brightness=0;
}
void setup(){
//Serial.begin(9600);
pinMode(pinPIR,INPUT);
pinMode(LED_BUILTIN, OUTPUT);
attachInterrupt(digitalPinToInterrupt(pinPIR), handleInterrupt, RISING);
dht.setup(pinDHT,DHTesp::DHT11);
WiFi.begin(ssid,password);
while( WiFi.status() != WL_CONNECTED ){
delay(500);
}
// 2*3600 is timezone, 0 is dst
configTime(2*3600, 0, "pool.ntp.org","time.nist.gov");
while(!time(nullptr)){
delay(1000);
}
}
void loop(){
setShining();
if((millis()-last)>120000){ // 2 min
display.clear();
//ToDo: LowPower
delay(100);}
else{
display.setBrightness(brightness, true); // Turn display on
digitalWrite(LED_BUILTIN, HIGH); // Turn the LED off by making the voltage HIGH
// NTP time
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
for (byte b=0;b<9;b++){
if(b%2==0)
display.showNumberDecEx((p_tm->tm_hour)*100+(p_tm->tm_min),0x20,true);
else
display.showNumberDecEx((p_tm->tm_hour)*100+(p_tm->tm_min),0,true);
delay(500);
}
// DHT11
humidity = dht.getHumidity();
temperature = dht.getTemperature();
if(dht.getStatusString()=="OK"){
// Temperature
if (temperature>9){
data[0]=display.encodeDigit(temperature/10);
data[1]=display.encodeDigit(temperature-(10*(temperature/10)));
}
else{
data[0]=0;
data[1]=display.encodeDigit(temperature);
}
data[2]=SEG_A | SEG_B | SEG_F | SEG_G; // °
data[3]=SEG_A | SEG_D | SEG_E | SEG_F; // C
display.setSegments(data);
delay(3000);
// Humidity
data[0] = SEG_B | SEG_C | SEG_E | SEG_F | SEG_G; // H
data[1] = SEG_C | SEG_D | SEG_E; // u
if (humidity>9){
data[2]=display.encodeDigit(humidity/10);
data[3]=display.encodeDigit(humidity-(10*(humidity/10)));
}
else{
data[2]=0;
data[3]=display.encodeDigit(humidity);
}
display.setSegments(data);
delay(2000);
}
}
}
// https://github.com/jumejume1/NodeMCU_ESP8266/blob/master/READ_TIME_FROM_INTERNET/READ_TIME_FROM_INTERNET.ino
// https://github.com/avishorp/TM1637/blob/master/examples/TM1637Test/TM1637Test.ino