Вот код: #define echoPin 10 #define trigPin 11 #define MOTOR_PIN 9 void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(MOTOR_PIN, OUTPUT); } void loop(){ digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); int distance = (pulseIn(echoPin, HIGH))/58; if (distance < 20 ) { analogWrite(MOTOR_PIN, 255); delayMicroseconds(5000);} // ЭТА ЗАДЕРЖКА НЕ РАБОТАЕТ СОВСЕМ // УБИРАЮ РУКУ ОТ ДАТЧИКА И МОТОР СРАЗУ ОСТАНАВЛИВАЕТСЯ else analogWrite(MOTOR_PIN,0); } Как задержать работу моторчика на 5 секунд после того как убрал руку от сенсора?
5000 микросекунд == 5 миллисекунд != 5 секунд Код (C++): delay(5000); // задержка на 5 секунд Согласно представленного исходника логика кажется немного странноватой -- что на выходе хотите получить?
Спасибо! Не подскажете еще алгоритм, как сделать одно считывание сенсора (1000 мс) включение, второе выключение
Вопрос, если я перед патчиком замираю и не двигаюсь, он через 10 секунд останавливается, причем когда выводил показания датчика на монитор, у него между верными показаниями проскакивали показания гораздо большего расстояния. В чем может быть причина?
Совсем ни чего не понял... А зачем тогда задержка в 5 сек? Дело в том, что с логикой из первого поста задержка будет колебаться от 0 до 5 сек (т.е. вентилятор может отключиться как сразу, так и, например, через 2 сек, и через 5) -- поэтому и высказал своё мнение о странности логики. Догадываюсь, что датчик ультразвуковой. Причина может быть в том, что, когда Вы замираете, датчик ловит не только сигнал отражённый от вас, но ещё паразитные сигналы отражённые от других объектов и при этом плохо срабатывает фильтрация паразитных сигналов. Но это только догадки основанные на теоретических предположениях (на практике с такими датчиками не сталкивался).
Пока я двигаюсь все нормально, как только замираю он в 90% встает. Вот и хочу, чтобы от одного считывания на 10 мкс 20 см он включался, а от второго выключался. Т.Е. махнул перед ним- включился, махнул второй выключился. Но не знаю с чего начать. Думаю в переменных счетчик поставить на взмахи с чередованием 0 и 1, а в теле программы управление от этих переменных. Так пойдет?
Не обязательно 0 или 1. Сохраняйте значение уровня ШИМ (Вы же используте analogWrite()), т. е. 0 или 255.
Если надо -- "рукой махнул -- мотор включился, махнул -- выключился" -- то ниже пример кода: Код (C++): #define echoPin 10 #define trigPin 11 #define MOTOR_PIN 9 #define SENSOR_CHANGE 0x80 #define SENSOR_DELAY 500 // задаёт задержку между реакциями на состояние датчика в миллисекундах unsigned int flag = 0; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(MOTOR_PIN, OUTPUT); } void loop(){ digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); int distance = (pulseIn(echoPin, HIGH))/58; if (distance < 20 ) { unsigned long current = millis(); if ((flag & SENSOR_CHANGE) == 0) { if ((current - flag) > SENSOR_DELAY) { flag = current; flag |= SENSOR_CHANGE; } } else { if ((current - (flag & ~SENSOR_CHANGE)) > SENSOR_DELAY) { flag = current; flag &= ~SENSOR_CHANGE; } } } if (flag & SENSOR_CHANGE) { analogWrite(MOTOR_PIN, 255); } else { analogWrite(MOTOR_PIN, 0); } }
Спасибо огромное!!! Сейчас попробую разобраться для себя как это работает. Но работает просто супер!!! Респект!!!
Еще раз спасибо! Приблизительно через 10-15 срабатываний туда сюда начинает датчик подглючивать, чем дальше тем я так думаю ошибки накапливаются, сам не смог разобраться с Вашим кодом, Я новичок. Попробовал написать сам попроще, на моем уровне. только не смейтесь. Но по синтексису выдает ошибки. Можете посмотреть? Код (C++): #define echoPin 10 #define trigPin 11 #define MOTOR_PIN 9 int IO =0; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(MOTOR_PIN, OUTPUT); pinMode(13, OUTPUT); digitalWrite(13, HIGH); pinMode(12, OUTPUT); } void loop(){ for (int IO=0; IO < 2;;) { digitalWrite(13, HIGH); digitalWrite(trigPin, LOW); delayMicroseconds(10000); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); int distance = (pulseIn(echoPin, HIGH))/58; if (distance < 20 ) { IO=++1; if (IO == 1) { analogWrite(MOTOR_PIN, 255); digitalWrite(12, HIGH); } else { analogWrite(MOTOR_PIN, 0); digitalWrite(12, LOW); } } else continue; }}
Из моего примера строку: Код (C++): unsigned long current = millis(); замените на: Код (C++): unsigned int current = millis(); Что касается Вашего кода: 1. переменная IO объявляется два раза: Код (C++): int IO =0; Код (C++): for (int IO=0; IO < 2;;) в теле цикла будет использоваться вторая переменная, первая -- ни где не используется. 2. переменной IO в теле цикла сразу присваивается значение 2: Код (C++): IO=++1; соответственно выполнится только условие: Код (C++): else { analogWrite(MOTOR_PIN, 0); digitalWrite(12, LOW); }