Программа индикации часов на светодиодах, сбой (совет)
- Войдите на сайт для отправки комментариев
Написал програмку индикации часов на 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(); }
При необходимости могу привести то что выдает принт_темп, но имеющие желание сами могут загрузить скетч в ардуино без схемы и убюедиться что на функции дата и время выдача данных в монитор порта ускоряется.