Объединение двух sketch кодов
- Войдите на сайт для отправки комментариев
Ср, 19/01/2022 - 23:00
Добрый день, форумчане!
Недавно начал заниматься ардуино, появилась нужда в объединении скетчей, проблема такова:
Первый скетч считывает температуру и влажность с датчика DHT11 и выводит их на экран, второй скетч заставляет загораться и светодиод по хлопку, по отдельности каждый скетч работает стабильно, но при объединении второй скетч прекращает корректно работать, в чем может быть проблема?
(Скетчи прикрепляю ниже)
Первый скетч:
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); #include <dht11.h> dht11 sensor; #define DHT11PIN 2 byte degree[8] = // кодируем символ градуса { B00111, B00101, B00111, B00000, B00000, B00000, B00000, }; void setup() { lcd.init(); lcd.backlight(); lcd.createChar(1, degree); // Создаем символ под номером 1 } void loop() { int chk = sensor.read(DHT11PIN); lcd.setCursor(0, 0); lcd.print("vlajnost: %"); lcd.setCursor(13, 0); lcd.print(sensor.humidity); lcd.setCursor(0, 1); lcd.print("temperatura:"); lcd.setCursor(13, 1); lcd.print(sensor.temperature); lcd.print(char(1)); delay(500); }
Второй скетч:
const int MicPin = 6; // выбор пина для входа от микрофона const int RELAY_PIN = 13; // выбор пина для выхода на реле int flag=0; void setup () { pinMode(RELAY_PIN, OUTPUT); // Реле. Настраиваем вывод 2 Ардуино на Выход digitalWrite(RELAY_PIN, HIGH); // Выключаем реле } void loop () { if(digitalRead(MicPin) == HIGH && flag == 0){ flag=1; digitalWrite(RELAY_PIN, LOW); // Включаем реле delay (150); } if(digitalRead(MicPin) == HIGH && flag == 1){ flag=0; digitalWrite(RELAY_PIN,HIGH); // Выключаем реле delay(50); // Задержка. Для устранения дребезга. } }
зачем нам исходные скетчи? - вы лучше покажите, как обьединяли
Прежде, чем пытаться объединить скетчи, избавьтесь от delay в каждом из них. (скетчи, содержащие delay не поддаются объединению)
Объеденённый скетч:
Избавиться от делеев не значит тупо их удалить ))
Ну, так получилось)
И что, работает? Светодиод зажигается? ))
В самом начале, сам по себе зажигается, на хлопки не реагирует, но если подкрутить потенциометр на плате микрофона до состояния постоянной работы от любого шума, то состояние светодиода меняется
Ну, раз все устраивает, то умолкаю... )
Так в том и дело, что не устраивает, он должен срабатывать по хлопку, а не тогда, когда я кручу потенциометр на плате
Я встречал два вида "микрофонных" модулей: непосредственно микрофон и детектор шума. И работают они по-разному.
Значит не работает. А все почему? Да потому что
Избавиться от делеев не значит тупо их удалить ))
Светодиод у тебя срабатывает, но слишком быстро, глаз заметить не успевает. Чтобы успевал, там делеи и были вставлены. Но для объединенного скетча это не вариант. Тут по хорошему все полностью переписывать нужно
Так в том и дело, что не устраивает, он должен срабатывать по хлопку, а не тогда, когда я кручу потенциометр на плате
проблема микрофона не имеет ни малейшего отношения к обьединению скетчей
Начну с физики.
Хлопок имеет свою длительность.
В первом скетче длительность хлопка ограничивают дэлеи 150 и 50.
От первого можно избавится, перенеся второй ИФ в конец цикла ЛУП.
Вывод данных на экран займёт необходимые милисы.
А последний дэлей 50 верните на место.
Скобки убрать на 33 и 42.
И даже так, всё равно не работает
MrBobr, изучите пример BlinkWithoutDelay в шапке форума и перепишите программу по его образцу
MrBobr, изучите пример BlinkWithoutDelay в шапке форума и перепишите программу по его образцу
Ты думаешь твои слова в его голове в предложение складываются?)
Чаще секунды НЕ хлопать :)
vrd, вы - MrBobr? нафига подсказывать, пусть человек найдет сам.
А тупые подсказки ему не помогут, он через час придет тоже самое спрашивать, мы здесь такое уже проходили много раз
Благодарю, это действительно помогло, но заставить работать корректно два скетча вместе я смог только после того, как сделал второй скетч через if, в данный момент скетч выглядит так:
Не через if, а через millis(). Собственно, как и нужно было делать ))
Хотелось бы задать еще один вопрос, почему до тех пор пока я не ввёл новый тип для второй части скетча (uint32_t t = 0), а использовал старый (uint32_t t1 = 0), датчик работал некорректно (то работает, то нет)?
Принял)
вообще, два условия в строчках 34 и 41 почти совпадают. их можно обьединить в одно и записать короче
Хотелось бы задать еще один вопрос, почему до тех пор пока я не ввёл новый тип для второй части скетча (uint32_t t = 0), а использовал старый (uint32_t t1 = 0), датчик работал некорректно (то работает, то нет)?
потому что тогда время выполнения одного цикла будет зависеть от выполнения второго и наоборот. Например, после того как мигнул светодиод - датчик уже не запустится
Чтобы работали обе части, таймеры в каждой должны иметь свои отдельные переменные
Благодарю теперь понял, прозвучит ещё один банальный вопрос, но какую функцию выполняет millis в 37, 44 и 59 строке?
millis() - http://arduino.ru/Reference/Millis
В указанных строчках запоминается текущий момент времени, от которого в последствии пляшут строчки 34, 41 и 49
Я думал над этим, но разве тогда не будет получаться отрицательное значение?
Я думал над этим, но разве тогда не будет получаться отрицательное значение?
От большего вычитают меньшее, почему и где отрицательное?
Я думал над этим, но разве тогда не будет получаться отрицательное значение?
uint32_t - беззнаковый тип, отрицательным быть не может. При переполнении просто сбрасывается в нуль и начинает увеличиваться заново.
Я про то, что если, как вы и говорите, строки 37, 44 и 59 влияют на строки 34, 41, 49, то получается, что когда мы отнимаем t1 у нас будет либо 0 либо отрицательное значение
MrBobr
http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis
Я про то, что если, как вы и говорите, строки 37, 44 и 59 влияют на строки 34, 41, 49, то получается, что когда мы отнимаем t1 у нас будет либо 0 либо отрицательное значение
Еще раз - uint32_t НЕ может быть отрицательным. Почитай про беззнаковые типы.
И еще - millis() постоянно увеличивается, т.е. меньше t1 оно не может быть по определению. Только через 50 дней, но, если все сделано правильно ( а в твоем коде таки все сделано правильно), то и это не страшно ))
когда мы отнимаем t1 у нас будет либо 0 либо отрицательное значение
А я вот, когда отнимаю от часа ночи (1:00) два часа взат, у меня всегда получается не -1:00, а 23:00, не знаешь почему?
ТС, вот вам ещё пример соединения двух скетчей и более...
Я понимаю, что он не может быть отрицательным, просто я не могу понять за что конкретно в строках 34 и т.п. отвечают строки 37 и т.п., если за "millis(), то зачем тогда мы дали ему название такое же, как и типу, а если за t1, то как ему вообще тогда удаётся работать?
Ну, во первых, потому что так принято в наших странах, что до 01:00 находится 00:00, а до него 23:00, во вторых, мы с вами на ты не переходили, если вас что-то не устраивает, или что-то не нравится, прошу не писать и, банально, пройти мимо
Слушаю и повинуюсь, барин.
Нет. Это потому, что время отрицательным быть не может. Это тоже "беззнаковый тип". Потому подчиняется той же арифметике, что и uint32_t
ТС, вы поняли хоть что то из моего 35 сообщения?Или не понятно как работает строка типа:
if
(millis()-Y1>=100){Y1=millis();}
???
Коллеги! Почему этот позорный детсад еще не перенесен в "Песочницу"?
----------------
2 ТС: Наш Форум для общения по интересам, для ответов на вопросы и обучения есть форумы формата "Q&A" (например СтекОверфлоу), поисковики и обучающие платформы. Учитывая двузначный IQ у тебя, учебники не предлагаю.
А тут ты решил поучить жизни модератора. Как думаешь сам, теперь тебе станет легче получить помощь? ;)))))
------------------
Вообще, поддерживать разговор в тысячный раз об "объединении двух скетчей" - это уже психиатрия какая-то, нет? Не нужно так уж ронять планку форума. Но это уже не призыв, а просто Май Хамбл Опиньён. Один раз пациенту сказали убрать "делеи" и читать "блинк-без-делей" до просветления. Зачем еще что-то, если диагноз ясен?