Serial и blink
- Войдите на сайт для отправки комментариев
Пнд, 05/09/2016 - 06:25
Ребят помогите , пытаюсь сделать , что бы при отправке 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);
}
Так. Читаем сериал отдельно, условие проверяем отдельно. У вас сейчас проверка на 1 идет сразу после чтения прям внутри.
Также читаем блинк без делай. И во второй строке тоже значение по умолчанию желательно сделать (например 0 чтобы при включениии не мигала).
Есть такое понятие - флаг. С помощью флага и выполняйте. Алгоритм такой. Если мы получаем 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); //исполняем } } }Читаешь byte в int.