Помогите найти ошибку.

Snowball
Snowball аватар
Offline
Зарегистрирован: 16.01.2020

Добрый день, господа.

Я новичок в Arduino, начал заниматься МК и изучать программирование на Arduino, читаю этот сайт, поглядываю в форум. Ищу информацию в других источниках в сети.
Решил сделать простой скетч, с одним датчиком, одной сервой и с таймером. Но, как вы понимаете, что-то пошло не так...

Суть.

Цель: Сделать устройство для распыления освежителя воздуха. Устройство должно активироваться по датчику линии и распылять пока пользователь держит руку у датчика. Далее, если устройство не используется какое то время, ну допустим - час, оно автоматически немного освежителя распыляет.

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

Далее приведу код, который я мучаю уже пару дней.


#include <Servo.h>
Servo servo1; // это дешманская sg90
boolean sens = 0; //Это датчик линии
unsigned long lstTime; 
long interval = 5000; // интервал, по которому включается автоматическое распыление
long autopsh = 2000; // время, в течении которого идёт авт. распыление
boolean servo_flag = 0; //эксперемент с флагами (на проблему не влияет, если вырубить их из кода - ничего не меняется.)
unsigned long Time;

void setup(){
  Serial.begin(9600);
servo1.attach(12); //серво на 12-м пине
pinMode(9, INPUT); // датчик линии на 9-ом
servo1.write(0); // серво устанавливается на "0" при запуске

}

void loop(){
 Time = millis(); // приравниваем переменную к счётчику аптайма.
  sens = digitalRead(9); // приравниваем переменную к состоянию пина
if (sens == 1 && servo_flag == 0){
  servo1.write(90); 
  lstTime = Time; // выставляем предыдущее время обращения на сейчас
  Serial.println("PSHHHH: "); // пишем в портмонитор 
  } 
else 
  {
    servo1.write(0);
  servo_flag = 0;
  }                           // Вот до сих пор всё работает ок

                              // А вот тут начинаются проблемы

  if (Time - lstTime > interval){ //Интервал отрабатывает
  lstTime=Time;
  servo1.write(90);  /*delay(1500);*/   //дёргается на полградуса и обратно если дилей отключен. Если дилей включен - то поворачивается только на 1,5 сек. 
  Serial.println("Auto PSHHHH: "); // в порт выдаёт как надо и сразу же записывает "Standby"
    
    if(Time - lstTime > autopsh);{  //условие. Мне кажется, что у меня какие то проблемы с временными условиями. Но это не точно...
    lstTime = Time; //сбрасываем предыдущее время
    servo1.write(0); // возвращаем серво на 0
    Serial.println("Standby "); //тоже в порт выдаёт, вместе с "AutoPSHHHH"... 
  }
  }
}
  /*Я себе думаю так, что когда есть "1" с датчика линии, то и сигнал постоянный,
   * он его выдаёт в порт нон-стопом, а когда идёт сигнал по времени, он коротенький, 
   * можно решить проблему через delay, но я хочу нормальное решение найти...  
   */

 

По сути, устройство работает так:

Подносишь руку - пшикает. (В порт выдаёт "PSHHHH")

Убираешь руку - молчит.

через 5 секунд в порт выдаёт ("AutoPSHHHH" "Standby") и на этом и остаётся, пока руку не поднесёшь.

Периодически подёргивая серву на пару зубцов...

За отсутствие нумерации строк не пинайте пожалуйста. В остальном - оставляю на ваш суд.

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

В строке №39 уберите точку с запятой

Snowball
Snowball аватар
Offline
Зарегистрирован: 16.01.2020

Всё осталось на своих местах. Только перестал вместе с Auto PSHHH писать Stendby.

 

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

а что вас не устраивает? "АвтоПых" пишет - значит работает

Snowball
Snowball аватар
Offline
Зарегистрирован: 16.01.2020

Автопых пишет, но Серовой не шевелит... 

шевелить начинает только если дилей поставить. 
Но дилей не совсем правильно. Хочу найти взрослое решение:)

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

разберитесь с условиями строк 34 и 39. Поставьте себя на место контроллера и выполните код пошагово - и вы убедитесь. что в условие 39 программа никогда не попадает.

Snowball
Snowball аватар
Offline
Зарегистрирован: 16.01.2020

Вас понял. Доберусь до ноута- побуду контроллером:) спасибо. 
надеюсь- хватит циане понять...

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

Snowball пишет:

Всё осталось на своих местах. Только перестал вместе с Auto PSHHH писать Stendby.

ну, это то точно было неправильно, а дальше я и не смотрел. Ошибки по одной править нужно.

Snowball
Snowball аватар
Offline
Зарегистрирован: 16.01.2020

Согласен, глупая ошибка:) не доглядел. 
Спасибо.