#1 11-03-2021 23:23:41

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Простой таймер автоматического включения/выключения подсветки рассады.

Прибор состоит из ESP8266(WITTEY CLOUD или другой ESP-12E) + светодиодный дисплей TM1637 + 1 транзистор + реле на 5 В.
Схема электрическая принципиальная.
TIMER.gif

Не в сети

#2 11-03-2021 23:24:14

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Простой таймер автоматического включения/выключения подсветки рассады.

Код.
//Таймер 11.03.2020
#include <math.h>
#include "TM1637.h"
#define CLK 16//GPIO 16 к дисплею
#define DIO 14//GPIO 14 к дисплею
TM1637 disp(CLK, DIO);
#define MY_BUTTON 4
float TEMP=0;
const int G = 12;//ЗЕЛЁНЫЙ светодиод GPIO 12
const int B = 13;//СИНИЙ светодиод GPIO 13
const int R = 15;//красный светодиод GPIO 15
int I=0;
int CHAS=8;//СТАРТОВОЕ ВРЕМЯ ЧАСЫ
int MIN=0;//СТАРТОВОЕ ВРЕМЯ МИНУТЫ
int onCHAS=9;//ВРЕМЯ ВКЛЮЧЕНИЯ ЧАСЫ
int onMIN=0;//ВРЕМЯ ВКЛЮЧЕНИЯ МИНУТЫ
int offCHAS=20;//ВРЕМЯ ВЫКЛЮЧЕНИЯ ЧАСЫ
int offMIN=0;//ВРЕМЯ ВЫКЛЮЧЕНИЯ МИНУТЫ
int SEC=0;
char* buttonTime="";
byte DVOETOCHIE=1;
byte OnOffFlag=0;
unsigned long lastTime1 = 0; 
unsigned long lastTime = 0; 
void setup(void)
{
  pinMode( MY_BUTTON, INPUT_PULLUP);
  pinMode(G, OUTPUT);
  digitalWrite(G, LOW);
  pinMode(B, OUTPUT);
  digitalWrite(B, LOW);
  pinMode(R, OUTPUT);
  digitalWrite(R, LOW);
  //TM1637//
  disp.init();  // инициализация дисплея
  disp.set(3);  // яркость дисплея, 0 - 7 (минимум - максимум)
   disp.point(DVOETOCHIE);//ВКЛЮЧИТЬ ДВОЕТОЧИЕ. 
}
void displayONOFF()
{
disp.point(0);
  disp.displayByte(_0, _n, _dash, _dash);
  delay(1000);
disp.point(1);
if (onMIN<10){
disp.display(2, 0);
disp.display(3, onMIN);} else {
disp.display(2,floor(onMIN/10.0));
disp.display(3,(onMIN-floor(onMIN/10.0)*10.0));
}

if (onCHAS<10){
disp.display(0, 0);
disp.display(1, onCHAS);} else {
disp.display(0,floor(onCHAS/10.0));
disp.display(1,(onCHAS-floor(onCHAS/10.0)*10.0));
}
disp.point(1);
  delay(1000);
  disp.point(0);
  disp.displayByte(_0, _F, _F, _dash);
  delay(1000);
disp.point(1);
if (offMIN<10){
disp.display(2, 0);
disp.display(3, offMIN);} else {
disp.display(2,floor(offMIN/10.0));
disp.display(3,(offMIN-floor(offMIN/10.0)*10.0));
}

if (offCHAS<10){
disp.display(0, 0);
disp.display(1, offCHAS);} else {
disp.display(0,floor(offCHAS/10.0));
disp.display(1,(offCHAS-floor(offCHAS/10.0)*10.0));
}
disp.point(true);
  delay(1000);
}
void OnOff()
{
  if (MIN>=onMIN and CHAS>=onCHAS ) OnOffFlag=1;
  if ( MIN>=offMIN and CHAS>=offCHAS) OnOffFlag=0;
digitalWrite(B, OnOffFlag);
}
void BUTTON()
{
  while (LOW == digitalRead(MY_BUTTON)){
if ((millis() - lastTime) >= 100 and (millis() - lastTime)<500)
  { lastTime1 = millis();
   buttonTime="fast";
   }
if ((millis() - lastTime) >= 1500 )
  { lastTime1 = millis();
   buttonTime="long";}
  }
  if (buttonTime=="fast") displayONOFF();
  if (buttonTime=="long") {
   for (int i=0; i <= 10; i++){
  disp.displayByte(_dash, _dash, _dash, _dash);
  disp.point(1);
  displayCHAS();
  delay(200);
  if(LOW == digitalRead(MY_BUTTON))
{
MIN++;
if (MIN==60) MIN=0;
i=0;
displayMIN();
delay(100);
}
  displayMIN();
  delay(300);
  }
/////////////////////////
for (int i=0; i <= 10; i++){
  disp.displayByte(_dash, _dash, _dash, _dash);
  disp.point(1);
  displayMIN();
  delay(200);
  if(LOW == digitalRead(MY_BUTTON))
{
CHAS++;
if (CHAS==24) CHAS=0;
i=0;
displayCHAS();
delay(100);
}
  displayCHAS();
  delay(300);
  }
////////////////////////////
  }
//}
}
void displayMIN()
{
if (MIN<10){
disp.display(2, 0);
disp.display(3, MIN);} else {
disp.display(2,floor(MIN/10.0));
disp.display(3,(MIN-floor(MIN/10.0)*10.0));
}
}
void displayCHAS()
{
if (CHAS<10){
disp.display(0, 0);
disp.display(1, CHAS);} else {
disp.display(0,floor(CHAS/10.0));
disp.display(1,(CHAS-floor(CHAS/10.0)*10.0));

}
void loop(void)
{
if(LOW == digitalRead(MY_BUTTON)) BUTTON();
OnOff();
disp.point(DVOETOCHIE);
if ((millis() - lastTime) >= 1000) {
lastTime = millis();
SEC++;
if (DVOETOCHIE==1) DVOETOCHIE=0; else DVOETOCHIE=1;
if (SEC==60){
  SEC=0; MIN++;
}
if (SEC==0 and MIN==60){
  MIN=0; CHAS++;
}
if (CHAS==24 and SEC==0 and MIN==0){
   CHAS=0;
}
displayMIN();
displayCHAS();
}
}

Не в сети

#3 11-03-2021 23:33:55

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Простой таймер автоматического включения/выключения подсветки рассады.

Программа позволяет изменять текущее время нажатием встроенной кнопки(WITTEY CLOUD). При коротком нажатии кнопки, на дисплее отображается время включения/выключения нагрузки). При длинном нажатии на кнопку, более 1,5 секунд, включается режим установки текущего времени.

Не в сети

#4 11-03-2021 23:38:35

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Простой таймер автоматического включения/выключения подсветки рассады.

Девайс на фото, не совсем соответствует схеме выше. Была уже готовая железка, написал для неё код.
16154805496501329213190690989639.jpg

1615480608258110040048319653000.jpg

Не в сети

#5 11-03-2021 23:49:17

IvanAltay
Administrator
Зарегистрирован: 03-05-2018
Сообщений: 4,589

Re: Простой таймер автоматического включения/выключения подсветки рассады.

У WITTEY CLOUD есть полезная функция на борту(для такого устройства), а именно встроенный фоторезистор/датчик освещённости. Можно его задействовать, если на рассаду попадает естественное освещение. Зачем светить на рассаду дополнительно, если и так солнце светит?

Не в сети

Подвал раздела

Работает на FluxBB (перевод Laravel.ru)