Программа индикации часов на светодиодах, сбой (совет)

Нет ответов
andrikll
Offline
Зарегистрирован: 04.08.2013

Написал програмку индикации часов на 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();
     }

При необходимости могу привести то что выдает принт_темп, но имеющие желание сами могут загрузить скетч в ардуино без схемы и убюедиться что на функции дата и время выдача данных в монитор порта ускоряется.