Программа индикации часов на светодиодах, сбой (совет)
- Войдите на сайт для отправки комментариев
Написал програмку индикации часов на 3-х светодиодах, методом последовательной передачи, поразрядно, миганиями. Это простой таймер времени дня поэтому секунды не отображаются, минуты только десятки и получается что первый диод, день недели,второй час, третий десятки минут (сколько моргнет каждый тому и равно значение. Пока отображал часы все было идеально, стоило добавить еще пару значений-температуру и влажность и программа перестала нормально отображать время, как я только не бился. Сейчас добился того что все значения отображаются, но время почему то в 5 раз быстрее мигает, ничего не могу понять, спасайте.
#include "DHT.h"
#define DHTPIN A2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// Соединить pin 1 (слева) для подачи +5V pin 2 DHTPIN пин13
// pin 4 (справа) на землю через 10K resistor на pin 2 (data)
volatile int diod_status=1, diod_odin, diod_dva, diod_tri;
int humidity, temp;
byte secunda_clock, minuta_clock, chas_clock, day_clock=1, diod_pin=3, diod_light;
byte schet_miganiya, vibor_info=1;
byte minuta_clock_diod, chas_clock_diod, day_clock_diod;
byte funk;
byte day_flag; //указывает выходной 1 или будний день 0
unsigned long time_old, miganie_old, period_info, chastota_miganiya=500;
int sch;
void setup() {
Serial.begin(9600);
pinMode(2,INPUT);
pinMode(3,OUTPUT); //минуты
pinMode(4,OUTPUT); //часы
pinMode(5,OUTPUT); //Дни
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT); //diode
pinMode(10,OUTPUT); //diode
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(A2,INPUT);
pinMode(A3,INPUT);
dht.begin();
test_dio(); delay(1500); indikaciya_no(); digitalWrite(diod_pin+3, 0);
}
void test_dio() {for (int i=0; i<4; i++) digitalWrite(diod_pin+i, 1);}
/**********************Функция расчета времени***************************/
void time () { funk=1; print_temp ();
if (millis ()-time_old>=10000) { time_old+=10000; secunda_clock+=10;}
if (secunda_clock==60) {secunda_clock-=60; minuta_clock++; }
if (minuta_clock==60) { minuta_clock-=60; chas_clock++;}
if (chas_clock==24) { chas_clock-=24; day_clock++; }
if (day_clock>=8) day_clock-=7;
if (day_clock%7==0||day_clock%7==6) day_flag=1; else day_flag=0;
if (chas_clock>12) chas_clock_diod=2*(chas_clock-12); else chas_clock_diod=chas_clock*2;
minuta_clock_diod=(minuta_clock-minuta_clock%10)/5; //десятки минут 5=10/2
}
/**********************Функция индикации на 3 диода любой цифро информации***************************/
void diod_minut () {digitalWrite(diod_pin, diod_light); funk=2; print_temp ();}
void diod_chasov() {digitalWrite(diod_pin+1, diod_light); funk=3; print_temp ();}
void diod_day () {digitalWrite(diod_pin+2, diod_light); funk=4; print_temp ();}
/************Функция для индикации строго по интервалу и расчета перехода на следующий диод***********/
void logika_indikasii () { funk=5; print_temp ();
if ((millis ()-miganie_old)>=chastota_miganiya)
{ diod_status*=-1; diod_light=(diod_status+1)/2; schet_miganiya++; miganie_old=millis ()+chastota_miganiya;
if (schet_miganiya<=diod_odin+2) {if(schet_miganiya<=diod_odin) diod_day(); else indikaciya_no ();}
if (schet_miganiya>(diod_odin+2)&& schet_miganiya<=(diod_odin+diod_dva+4))
{if(schet_miganiya<=(diod_odin+diod_dva+2)) diod_chasov(); else indikaciya_no ();}
if (schet_miganiya>(diod_odin+diod_dva+4))
{if(schet_miganiya<=(diod_odin+diod_dva+diod_tri+4)) diod_minut(); else indikaciya_no ();}
if(schet_miganiya>=(diod_odin+diod_dva+diod_tri+10)) {vibor_info++; print_temp ();schet_miganiya=0;} }
//if(vibor_info==2){ Serial.print(schet_miganiya); Serial.print(" "); }
}
/**********************Функция погасания 3-х диодов***********************************************/
void indikaciya_no () { for (int i=0; i<3; i++) digitalWrite(diod_pin+i, 0); }
/*******************измеряем влажность и разбиваем на единицы, десятки**************************/
void diod_humidity() { humidity = dht.readHumidity();
diod_odin=(humidity-humidity%10)/5; diod_dva=2*(humidity%10); diod_tri=0;
logika_indikasii();} // занчения умножены на 2 потому что индицируется 0 потом 1
/*******************измеряем температуру и разбиваем на единицы, десятки**************************/
void diod_temperature() { temp = dht.readTemperature();
diod_odin=0; diod_dva=(temp-temp%10)/5; diod_tri=2*(temp%10);
logika_indikasii(); } // занчения умножены на 2 потому что индицируется 0 потом 1
//здесь записал какие то значения чтобы не ждать пока набегут секунды, минуты часы, дни
void diod_day_chas_min () { diod_odin=8; diod_dva=4; diod_tri=6; // занчения кратны 2 потому что индицируется 0 потом 1
logika_indikasii();}
/***выбираем индицируемое значение, переменная меняется в логике индикации по окончании индации значений 3-х диодов + 5секунд**/
void raschet_period_info () {
if(vibor_info==5) vibor_info=1;
if(vibor_info==1 ) {diod_humidity(); }
if(vibor_info==2 ) {diod_day_chas_min(); }
if(vibor_info==3 ) {diod_temperature(); }
if(vibor_info==4 ) {diod_day_chas_min(); }
}
/************функция вывода переменных для отслеживания процесса******************/
void print_temp () {
Serial.println(); Serial.print(funk); Serial.print(" "); Serial.print(schet_miganiya); Serial.print(" ");
Serial.print(vibor_info); Serial.print(" "); Serial.print(miganie_old); Serial.print(" ");
Serial.print(diod_odin/2); Serial.print(" ");
Serial.print(diod_dva/2); Serial.print(" ");
Serial.print(diod_tri/2); Serial.print(" "); Serial.print(temp); Serial.print(" ");
Serial.print(humidity); }
void loop() {
time();
raschet_period_info();
}
При необходимости могу привести то что выдает принт_темп, но имеющие желание сами могут загрузить скетч в ардуино без схемы и убюедиться что на функции дата и время выдача данных в монитор порта ускоряется.