Помогите найти ошибку.
- Войдите на сайт для отправки комментариев
Добрый день, господа.
Я новичок в 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") и на этом и остаётся, пока руку не поднесёшь.
Периодически подёргивая серву на пару зубцов...
За отсутствие нумерации строк не пинайте пожалуйста. В остальном - оставляю на ваш суд.
В строке №39 уберите точку с запятой
Всё осталось на своих местах. Только перестал вместе с Auto PSHHH писать Stendby.
а что вас не устраивает? "АвтоПых" пишет - значит работает
Автопых пишет, но Серовой не шевелит...
шевелить начинает только если дилей поставить.
Но дилей не совсем правильно. Хочу найти взрослое решение:)
разберитесь с условиями строк 34 и 39. Поставьте себя на место контроллера и выполните код пошагово - и вы убедитесь. что в условие 39 программа никогда не попадает.
Вас понял. Доберусь до ноута- побуду контроллером:) спасибо.
надеюсь- хватит циане понять...
Всё осталось на своих местах. Только перестал вместе с Auto PSHHH писать Stendby.
ну, это то точно было неправильно, а дальше я и не смотрел. Ошибки по одной править нужно.
Согласен, глупая ошибка:) не доглядел.
Спасибо.