Multibox

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