Условие принудительного выключения

exface
Offline
Зарегистрирован: 23.08.2015

Доброго времени суток!

Есть стандартный код на включение\выключение диода командами. Суть в том чтобы диод включался\выключался командами, но если команда LOW не поступала принудительно, то выключить по истечению 1 минуты. Функция delay () блокирует все, поэтому не могу разобраться... Подскажите пожалуйста что можно сделать?

int led = 10; 
int val;

void setup() {    
Serial.begin(9600);            
  pinMode(led, OUTPUT);     
}
void loop()
{
  if (Serial.available()) {
val = Serial.read();
    if (val == 'H') {
      digitalWrite(led, HIGH),Serial.println(" Led ON ");
    }
    if (val == 'L') {
      digitalWrite(led, LOW),Serial.println(" Led OFF ");
    }
  }
}

 

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

exface пишет:

что можно сделать?

Сесть и почитать про функцию millis() или про установку перываний от таймера.

std
Offline
Зарегистрирован: 05.01.2012
#define timelimit (60000)
int led = 10; 
int val;
unsigned long timestamp=millis();

void setup() {    
Serial.begin(9600);            
  pinMode(led, OUTPUT);     
}
void loop()
{
  if (Serial.available()) {
val = Serial.read();
    if (val == 'H') {
      digitalWrite(led, HIGH);
      Serial.println(" Led ON ");
    }
    if (val == 'L') {
      digitalWrite(led, LOW);
      Serial.println(" Led OFF ");
    }
  }
  if(millis()-timestamp>=timelimit){
      digitalWrite(led, LOW);
      Serial.println(" Led OFF ");
  }
}

Я хочу COG 1602 экран. Пожалуйте 18 юаней на QIWI +79145891987. Это в российских рублях около пары сотен.

All, думаю, это честно.

exface
Offline
Зарегистрирован: 23.08.2015

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

exface пишет:

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

Функция millis() никого никуда не посылает - она лишь скромно возвращает вреемя, прошедшее после последней загрузки контроллера.

Тут Вам уже двое советовали почитать - так почитайте. Там нет ничего, в чём не мог бы разобраться любой, имеющий такое желание от пятикласника и старше.

Кстати, исправить код std можно добавлением одной единственной строки. Почитайте и разберитесь.

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

exface пишет:

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

Функция millis() никого никуда не посылает - она лишь скромно возвращает вреемя, прошедшее после последней загрузки контроллера.

Тут Вам уже двое советовали почитать - так почитайте. Там нет ничего, в чём не мог бы разобраться любой, имеющий такое желание от пятикласника и старше.

Кстати, исправить код std можно добавлением одной единственной строки. Почитайте и разберитесь.

Читать не хочу, думать не хочу, юаня тоже давать не хочу, халява хочу.

exface
Offline
Зарегистрирован: 23.08.2015

Проблема остается даже с той самой строчкой

#define timelimit (60000)
int led = 10; 
int val;
unsigned long timestamp=millis();

void setup() {    
Serial.begin(9600);            
  pinMode(led, OUTPUT);     
}
void loop()
{
  if (Serial.available()) {
val = Serial.read();
    if (val == 'H') {
      digitalWrite(led, HIGH);
      Serial.println(" Led ON ");

      timestamp = millis();

    }
    if (val == 'L') {
      digitalWrite(led, LOW);
      Serial.println(" Led OFF ");

      timestamp = 0; // to keep the timer from printing upmteen Led OFF messages

    }
  }
  if ( timestamp > 0 ){
    if(millis()-timestamp>=timelimit){
      digitalWrite(led, LOW);
      Serial.println(" Led OFF ");
    }
  }
}

P.s. больше троллей хочу

std
Offline
Зарегистрирован: 05.01.2012

exface

Вам таки раз в минуту выключать?

if(millis()-timestamp>=timelimit){
  digitalWrite(led, LOW);
  Serial.println(" Led OFF ");
  timestamp=millis();
}

Или чтобы после посылания H проработало не меньше минуты?

#define timelimit (60000)
int led = 10; 
int val;
unsigned long timestamp=millis();
boolean bOnState=false;

void setup(){
  Serial.begin(9600);            
  pinMode(led, OUTPUT);     
}
void loop(){
  if (Serial.available()) {
    val = Serial.read();
    if (val == 'H' && !bOnState) changeState(true);
    if (val == 'L' && bOnState) changeState(false);
  }
  if(millis()-timestamp>=timelimit && bOnState) changeState(false);
}

void changeState(boolean newState){
  if(newState==bOnState) return;
  bOnState=newState;
  if(bOnState){
    digitalWrite(led, HIGH);
    Serial.println(" Led ON ");
    timestamp = millis();
  }else{
    digitalWrite(led, LOW);
    Serial.println(" Led OFF ");
    timestamp=millis();
  }
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
exface пишет:
Проблема остается даже с той самой строчкой
 
Это вовсе не та самая строчка. Такая строчка нафиг не нужна. std Вам уже написал правильно.
exface
Offline
Зарегистрирован: 23.08.2015

Немножко не то, но я уже понял принцип работы millis(), всем огроменное спасибо - кто помогал.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

std пишет:

All, думаю, это честно.

Получил свои 10 серебрянников?

std
Offline
Зарегистрирован: 05.01.2012

JollyBiber, ждёмс

bwn
Offline
Зарегистрирован: 25.08.2014

Шо, юаня нэма?

rus2014
Offline
Зарегистрирован: 11.09.2014

std пишет:

#define timelimit (60000)
int led = 10; 
int val;
unsigned long timestamp=millis();

void setup() {    
Serial.begin(9600);            
  pinMode(led, OUTPUT);     
}
void loop()
{
  if (Serial.available()) {
val = Serial.read();
    if (val == 'H') {
      digitalWrite(led, HIGH);
      Serial.println(" Led ON ");
    }
    if (val == 'L') {
      digitalWrite(led, LOW);
      Serial.println(" Led OFF ");
    }
  }
  if(millis()-timestamp>=timelimit){
      digitalWrite(led, LOW);
      Serial.println(" Led OFF ");
  }
}

Я хочу COG 1602 экран. Пожалуйте 18 юаней на QIWI +79145891987. Это в российских рублях около пары сотен.

All, думаю, это честно.

Насчет юаней это шутка или серьезно?

bwn
Offline
Зарегистрирован: 25.08.2014

А почему бы и несерьезно? Пост №6