attiny 13 проблема со временем

dennnissska
Offline
Зарегистрирован: 22.02.2015

Здравствуйте Всем кто читает данную тему.

Сталкнулся с проблемой времени на тини 13, начну по порядку.

Основное управление контролером это  одна кнопка (без фиксации, подтянутая на минус через резистор) и три светодиода (индикация включения определенного режима) включает нагрузку реле ( реле подключено через транзистор)

Алгоритм работы следующий:

1) если нажать кнопку и отпустить, включится первый режим ( соответственно включится светодиод первого режима и включится реле) отключится через 30 минут.

2) если нажать и удержать кнопку включается второй режим,( горят светодиоды первого и второго режима, реле также включится)  отключается через 20 минут

3) если нажать и удержать кнопку еще дольше включится третий режим (соответсвенно будут гореть все три светодиода, а так же включится реле) отключается через 10 десять минут.

Режимы работают все включается и выключается, проблема со временем отключения. Первый режим 30 мин., а работает 45 секунд, второй режим 20 мин., а работает 30 секунд, и третий должен работать 10 мин., а работает 15секунд.

int flag=0; 

void setup()    
{ 
       
    pinMode(3, OUTPUT);
    pinMode(0, OUTPUT);
     pinMode(4, OUTPUT);  
    pinMode(1, OUTPUT); 
    digitalWrite(1,LOW);
      
        
} 

void loop() 

{ 
      if(digitalRead(2)==HIGH&&flag==0)
    { delay(1000);
    digitalWrite(3,HIGH);
    delay(1000);
    if(digitalRead(2)==LOW&&flag==0){
     digitalWrite(1,HIGH);
      delay(1000*60*30);
      digitalWrite(3,LOW);
      digitalWrite(1,LOW);
    
     }
     if(digitalRead(2)==HIGH&&flag==0)
    { delay(1000);
    digitalWrite(4,HIGH);
    delay(1000);
    if(digitalRead(2)==LOW&&flag==0){
     digitalWrite(1,HIGH);
      delay(1000*60*20);
      digitalWrite(4,LOW);
      digitalWrite(1,LOW);
      digitalWrite(3,LOW);
   
    }
    }
   

    if(digitalRead(2)==HIGH&&flag==0)
    { delay(1000);
    digitalWrite(0,HIGH);
    delay(1000);
    flag=1;}
     }
    
    if(digitalRead(2)==LOW&&flag==1){
     digitalWrite(1,HIGH);
      delay(1000*60*10);
      digitalWrite(0,LOW);
      digitalWrite(4,LOW);
      digitalWrite(1,LOW);
      digitalWrite(3,LOW);
      flag=0;
    }

    }
    
 

delay писал и без умножений то есть 30 мин (1800000) 20 мин (1200000) и 10 мин (600000) результат такой же.

Но самое интересное когда код отлаживал на UNO все работало. 

Почему так происходит? Я в коде напортачил? Подскажите пожалуйста.

Прошивал этим кодом 2 тини работают одинаково. Прошиваю через UNO

Прошу прощения что код без пояснений, он приметивный, наверно и так понятен.

b707
Offline
Зарегистрирован: 26.05.2017

попробуйте написать время как delay(1000*60*10ul);

Но вообще код отвратительный и работать нормально все равно не будет.

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

Все как у Вас оставил, дэлэй и все что вы писали

 

int flag=0;
int count_but=0;

void setup()    
  { 
    pinMode(3, OUTPUT);
    pinMode(0, OUTPUT);
    pinMode(4, OUTPUT);  
    pinMode(1, OUTPUT); 
    pinMode(2, INPUT);
   
  } 

void loop() { //если нажата кнопка, подождать секунду
      if(digitalRead(2)==HIGH&&flag==0) {flag=1; delay(1000); }
      if(digitalRead(2)==HIGH&&flag==1) {   // проверить нажата ли еще кнопка спустя секунду, режим 1     
         count_but++;  //count_but счетчик нажатий
       digitalWrite(3,HIGH); delay(1000);} //индикация вкл 1 режима
              else flag=0;
       
      if(digitalRead(2)==HIGH&&flag==1) {   // проверить нажата ли еще кнопка спустя 2с, режим 2     
         count_but++; digitalWrite(4,HIGH); delay(1000);} //индикация вкл 2 режима   
       
       if(digitalRead(2)==HIGH&&flag==1) {   // проверить нажата ли еще кнопка спустя 3с, режим 3     
         count_but++;  digitalWrite(0,HIGH); } //индикация вкл 3 режима  
      
      if(count_but>3)count_but=3; //Чтобы небыло больше 30 мин если передержал кнопку
         
      if(digitalRead(2)==LOW&&flag==1){ //Если кнопка не нажата, но были нажатия больше 1с
      digitalWrite(1,HIGH);
      delay(1000*60*count_but); //умножаем минуту на количество нажатий
      count_but=0;
      digitalWrite(0,LOW);
      digitalWrite(1,LOW);
      digitalWrite(3,LOW);
      digitalWrite(4,LOW);
      flag=0;
      }
  }

 

b707
Offline
Зарегистрирован: 26.05.2017

andrikll, у вас та же ошибка. Что убедиться в этом, вставьте перед строкой 31 оператор Serial.print((1000*60*count_but); - и посмотрите, какие значения он выведет.

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

Эту ошибку он и сам может исправить, не работало у него не из-за ul. (проверял на <32000 задержках... работает)

 а так конечно спасибо за коментарий..

Посмотрел -16800 (или около того)