Serial и blink

Ravor
Offline
Зарегистрирован: 22.02.2016

Ребят помогите , пытаюсь сделать , что бы при отправке 1 , дуинка включала блинк , пока не получит 0 , но после получения 1 , она идёт в бесконечный цикл.
 

int led = 13 ;
int dan;
void setup() {
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0){
     dan = Serial.read();
     if  (dan == '1'){
      for (int i ; dan == '1';  ){
      digitalWrite(led,HIGH);
      delay(1000);
      digitalWrite(led,LOW);
      delay(1000);
      }
     }
  } if (dan == '0'){
    digitalWrite(led,LOW);
  }
nevkon
Offline
Зарегистрирован: 20.01.2015

Так. Читаем сериал отдельно, условие проверяем отдельно. У вас сейчас проверка на 1 идет сразу после чтения прям внутри.

Также читаем блинк без делай. И во второй строке тоже значение по умолчанию желательно сделать (например 0 чтобы при включениии не мигала).

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Есть такое понятие - флаг. С помощью флага и выполняйте. Алгоритм такой. Если мы получаем 1 то флаг 1 а значить при loop где стоит if флаг == 1 выполнять код с блинком. НО для этого я бы советовал использовать millis чтобы не тормозить программу delay-ями (blinkWithoutDelay)

const int ledPin =  13;     //номер светодиода по цифровым выходам
boolean ledState = 0; //состояние пина светодиода
int flag=0;           //наш флаг разрешения
unsigned long previousMillis = 0;        //храним предыдущее время для сравнения пройденного интервала
const long interval = 1000;            //Интервал в секундах
String datax;

void setup() {
Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
while(Serial.available()){
char data = Serial.read();
  datax += data;
}
  
if(datax == "1")flag=1; //если 1 то разрешаем
if(datax == "2")flag=0; //если 2 то запрещаем (связано с тем что Serial считает ноль как ничего и не воспринимает его, поэтому управляем с помощью 1-2).
  datax="";
  
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if(flag == 0) digitalWrite(ledPin, 0); //выключаем вообще светодиод если выключили
if(flag == 1){  //если флаг равен 1 то выполнить ниже
    ledState = !ledState; //инвертируем состояние
    digitalWrite(ledPin, ledState);    //исполняем
}

  }
}
Код немного избыточный но работает))
Radjah
Offline
Зарегистрирован: 06.08.2014

Читаешь byte в int.