Программа не работает не работает как должна

Askella
Offline
Зарегистрирован: 05.04.2016

Уже всю голову сломал или я чего не понимаю или лыжи не едут :)

  int svet_pin = 10;//Переменная порта для включения света
 int zvuk_pin = 13;// Переменная порта для подачи звукового сигнала об отсутвии зарядки
 int zaryadka_pin =A0; //Переменная порта для определения зарядки
 int tmp=0;// переменная для считывани показаний о зарядке
 int off_pin=12;//Переменная для порта принудительного выключения света
 int vkl;//Переменная для считывания показаний с порта 12
void setup() {
 pinMode(svet_pin, OUTPUT);// Устанавливаем 10 порт на выход
 pinMode(zvuk_pin, OUTPUT);//Устанавливаем 13 порт как выход
 pinMode(zaryadka_pin, INPUT); //Устанавливаем А0 как вход
 pinMode(off_pin, INPUT);//Устанавливаем 12 порт как вход
}

void loop() {
  vkl=digitalRead(off_pin);//считваем значение с порта 12
  tmp=analogRead(zaryadka_pin);// Считываем значение с порта А0
  if (vkl==HIGH && tmp>500){//Если на порту 12 5В и на порту А0 больше 2.5В (Вариант 1)
      digitalWrite(svet_pin,HIGH);// подать на порт 10 высокий уровень
      delay(1000);// задержка 1 сек
    }
  if (vkl==HIGH && tmp<=500){// Если на 12 порту 5в и на А0 меньше 2.5В то (Вариант 2)
      digitalWrite(svet_pin, LOW);// подать на 10 порт низкий уровень
      digitalWrite(zvuk_pin, HIGH);   // Звуковой сигнал
      delay(1000);               // пауза 1 секунда
      digitalWrite(zvuk_pin, LOW);   
      delay(1000);               
    }
  if (vkl==LOW) {// если на порте 12 низкий уровень (вариант 3)
     digitalWrite(svet_pin,LOW);
     delay(1000);
   }
   }

Программа должна считывать показания с порта 12 и порта АО, и выбирать один из 3 вариантов действий, в зависимости от условий, выполнять их и затем снова опрашивать порты 12 и А0, если выбирается 1 и 3 вариант, то все работает как и должно: портам присваиваются значения и идет опрос. Но если выбирается вариант 2 то контроллер на нем зацикливается и не реагирует на изменения значений на входных портах. Вопрос почему? 

З. Ы. Если что не так просьба ногами не бить, я очень новичек в программировании :)

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

1. Нулевой пин мне не ндравитса. Там что-то другое висит на нем. Хотя это я про UNO, а что у тебя за ардуина - я еще не угодал.

2. Во второй вариант вставь строки отладки для проверки значений переменных "vkl" и "tmp". И тогда станет понятно - прога глючит или переменные не чистятся.

Вот так сделай:

 int svet_pin = 10;//Переменная порта для включения света
 int zvuk_pin = 13;// Переменная порта для подачи звукового сигнала об отсутвии зарядки
 int zaryadka_pin =A0; //Переменная порта для определения зарядки
 int tmp=0;// переменная для считывани показаний о зарядке
 int off_pin=12;//Переменная для порта принудительного выключения света
 int vkl;//Переменная для считывания показаний с порта 12
void setup() {
 pinMode(svet_pin, OUTPUT);// Устанавливаем 10 порт на выход
 pinMode(zvuk_pin, OUTPUT);//Устанавливаем 13 порт как выход
 pinMode(zaryadka_pin, INPUT); //Устанавливаем А0 как вход
 pinMode(off_pin, INPUT);//Устанавливаем 12 порт как вход

Serial.begin(9600);          //запускаем терминал
Serial.println("Serial begin.... ");
}

void loop() {
  vkl=digitalRead(off_pin);//считваем значение с порта 12
  tmp=analogRead(zaryadka_pin);// Считываем значение с порта А0
  if (vkl==HIGH && tmp>500){//Если на порту 12 5В и на порту А0 больше 2.5В (Вариант 1)
      digitalWrite(svet_pin,HIGH);// подать на порт 10 высокий уровень
      delay(1000);// задержка 1 сек
    }
  if (vkl==HIGH && tmp<=500){// Если на 12 порту 5в и на А0 меньше 2.5В то (Вариант 2)
      digitalWrite(svet_pin, LOW);// подать на 10 порт низкий уровень
      digitalWrite(zvuk_pin, HIGH);   // Звуковой сигнал
      delay(1000);               // пауза 1 секунда
      digitalWrite(zvuk_pin, LOW);   
      delay(1000);               
Serial.println("vkl = "+vkl);    // печатаем в терминал vkl
Serial.println("tmp = "+tmp); // печатаем в терминал tmp
    }
  if (vkl==LOW) {// если на порте 12 низкий уровень (вариант 3)
     digitalWrite(svet_pin,LOW);
     delay(1000);
   }
   }

А потом, когда "Загрузка скетча завершена" , открой окно терминала и смотри что там написано.

Askella
Offline
Зарегистрирован: 05.04.2016

Спасибо! Но у меня Pro mini (извиняюсь что сразу не написал) USB UART еще не приехал а скетчи через USB asp заливаю, походу тогда ждать придется.

UPD попробую тогда на lcd 1602 вывести

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

А! Терминал тебе еще не приехал значит. Ну все равно как-то отдебаж эти две переменные. С ними какие-то нелады...

Askella
Offline
Зарегистрирован: 05.04.2016

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

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Надо подождать-таки USB UART. Он пригодится полюбому))