Проблемы с сведением двух скетчей.
- Войдите на сайт для отправки комментариев
Пнд, 18/07/2016 - 21:48
Добрый всем вечер. Такой вот вопрос назрел. Надо подключить к ардуино уно 2 пир датчика(hc sr501) и 1 ультразвуковой датчик(hc sr04). Естественно при определённых условиях, прописанных в скетче должен загореться светодиод.
Взял 2 скетча.
для PIR HC SR501:
//Тестировалось на Arduino IDE 1.0.1 //Время калибровки датчика (10-60 сек. по даташиту) int calibrationTime = 30; //Время, в которое был принят сигнал отсутствия движения(LOW) long unsigned int lowIn; //Пауза, после которой движение считается оконченным long unsigned int pause = 5000; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет boolean lockLow = true; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения boolean takeLowTime; int pirPin = 2; //вывод подключения PIR датчика int ledPin = 13; //вывод сигнального диода void setup() { Serial.begin(9600); pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); digitalWrite(pirPin, LOW); //дадим датчику время на калибровку Serial.print("Calibrating"); for(int i = 0; i < calibrationTime; i++) { Serial.print("."); delay(1000); } Serial.println(" done"); Serial.println("SENSOR ACTIVE"); delay(50); } void loop() { //Если обнаружено движение if(digitalRead(pirPin) == HIGH) { //Если еще не вывели информацию об обнаружении if(lockLow) { lockLow = false; Serial.println("Motion detected"); delay(50); } takeLowTime = true; } //Ели движения нет if(digitalRead(pirPin) == LOW) { //Если время окончания движения еще не записано if(takeLowTime) { lowIn = millis(); //Сохраним время окончания движения takeLowTime = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения } //Если время без движение превышает паузу => движение окончено if(!lockLow && millis() - lowIn > pause) { //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения lockLow = true; Serial.println("Motion finished"); delay(50); } } }
для HC SR04:
//Тестировалось на Arduino IDE 1.0.1 #define Trig 9 #define Echo 8 #define ledPin 13 void setup() { pinMode(Trig, OUTPUT); //инициируем как выход pinMode(Echo, INPUT); //инициируем как вход pinMode(ledPin, OUTPUT); Serial.begin(9600); /* задаем скорость общения. В нашем случае с компьютером */ } unsigned int impulseTime=0; unsigned int distance_sm=0; void loop() { digitalWrite(Trig, HIGH); /* Подаем импульс на вход trig дальномера */ delayMicroseconds(10); // равный 10 микросекундам digitalWrite(Trig, LOW); // Отключаем impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=impulseTime/58; // Пересчитываем в сантиметры Serial.println(distance_sm); // Выводим на порт if (distance_sm<30) // Если расстояние менее 30 сантиметром { digitalWrite(ledPin, HIGH); // Светодиод горит } else { digitalWrite(ledPin, LOW); // иначе не горит } delay(100); /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего. Это время называется периодом цикла (cycle period). Рекомендованный период между импульсами должен быть не менее 50 мс. */ }
После сведения получил вот такой скетч:
Создай классы HC SR501 и HC SR04 отладь каждый и потом сведи.
ПС: для светодиода тоже. Меньше будет проблем.
Создай классы HC SR501 и HC SR04 отладь каждый и потом сведи.
ПС: для светодиода тоже. Меньше будет проблем.
Спасибо за информацию, но я не так давно начал заниматься программированием, чтоб полностью понять Ваш совет и как создать классы. Так понимаю, у меня в коде 2 класса(на 2 вида датчиков), которые должны работать по отдельности и потом свести в один или я не так это понимаю?
Там скорее еще проще. Надо убрать калибровку.
Смотри http://smart-home.te.ua/arduino-datchyk-dvyzhenyya-hc-sr501-pir/
вот собрал программку.
вот собрал программку.
А у нас чего, пины могут иметь отрицательные значения? И их так много, аж 65535? Это я к тому, что - бездарный расход оперативы.
Можно поинтересоваться, какой процент от всей доступной памяти был так бездано израсходован?
Можно поинтересоваться, какой процент от всей доступной памяти был так бездано израсходован?
я всю доступную память в банк на депозит ложу - кодю доходы от процентов
Можно поинтересоваться, какой процент от всей доступной памяти был так бездано израсходован?
Достаточный, чтобы в больших проектах не применять этот код. Вы, наверное, байтики ещё не считали в оперативе? Если не жмёт - то можно всё, но жать начинает вот в таких вот бездарных местах. Впрочем, для over9000 всех поделок на ардуине указанный код применять можно - "всем похер" (с).
Цитата из компилятора:Скетч использует 1 280 байт (3%) памяти устройства. Всего доступно 32 256 байт.
Похоже при такой конструкции ни один байт ардуины не пострадал. Что флеш, что озу.
Привычка - вторая натура. И если сразу привыкать говнокодить - то потом избавиться от таких вот повсеместных бездарностей будет очень сложно. Мало того, вы этому и других учите ещё. Так что да - нехороший qwone, согласен полностью.
Можно поинтересоваться, какой процент от всей доступной памяти был так бездано израсходован?
Достаточный, чтобы в больших проектах не применять этот код. Вы, наверное, байтики ещё не считали в оперативе?
Считать байтики - дело нехитрое. Иногда считаю, иногда - нет. С моей точки зрения умение считать байтики существенно проигрывает умению определять, в каких случаях стоит считать байтики, а в каких - нет. В данном случае - не стоит. Я не занимаюсь оптимизацией ради оптимизации.
С моей точки зрения умение считать байтики существенно проигрывает умению определять, в каких случаях стоит считать байтики, а в каких - нет. В данном случае - не стоит. Я не занимаюсь оптимизацией ради оптимизации.
Верно, ключевое здесь - знание когда надо экономить, а когда не обязательно. Профи конечно это всё знают, а новичок даже и не догадывается. И будет лепить int'ы где надо и где не надо. Поэтому надо сразу приучать делать правильно, чтобы новички не привыкали везде писать int'ы
Поэтому надо сразу приучать делать правильно, чтобы новички не привыкали везде писать int'ы
Заплюсовал именно вот эту фразу. Потому как искренне считаю, что если сразу не учиться делать хорошо, то потом уже будет поздняк метаться. И дело, конечно, не в байтиках, а в самом подходе. Как говорил мудрый человек - делай хорошо, плохо - оно само получится.
2andriano: Из недостатков лёгкого вхождения в программирование МК, кое даёт Arduino IDE, считаю невероятное количество говнокода, которое расплодилось в сети. Плохо - оно как-то само получается. А вот хорошо - можно ведь и чуть-чуть научиться, правда? И да, я тоже против оптимизации ради оптимизации, как самоцели. Но тут - другой случай, обучательный.
Ардуино тут ни при чем.
Сейчас так на любом ресурсе, посвященном программированию. И, думаю, не только программрованию. По крайней мере, с автомобилями - точно так же.
Хотя, с другой стороны, мы ведь привыкли, что приходя домой с улицы, нужно вытирать ноги. И с сеью - та же история. Просто нужно принять как должное, что печатное слово сегодня совершенно не то, что было хотя бы лет 30 назад.
Есть только два замечания:
- резковато это как-то прозвучало (а может, это проблема с моим восприятием),
- пример для обучения неудачный. Собственно, могу даже сформулировать формальный критерий: если не используются массивы, экономить на длине типа данных совершенно бесперспективно (хотя, кроме объема може сказываться скорость обработки, например, в прерывании).
Всем большое спасибо за помощь, за объяснения того, как правильно писать код. Я только начинаю программировать и подобный код (верхняя его часть) для меня не ясна, что по чем:
А если уж совсем честно, то как написать класс на вторую часть кода (под HC SR04) и как их потом свести для меня не понятно(((
Полезу в поиск, узнавать каким образом пишется класс и какая строка за, что отвечает.
На лови с датчиком до цели. Программу проверил на ошибки. живьем не пробовал.
Куда бы положить сэкономленные байты в банк на проценты?
Можно свободную память использовать для распределенных вычислительных систем под расчет холодного термояда...
Огромное спасибо. Прямо сейчас и проверю скетч.