HELP!!! Требуется подсказка ... в адаптации кода.
- Войдите на сайт для отправки комментариев
Привет всем !
Пытаюсь адаптировать скетч из проекта "Temperature PID controller - Arduino" к уже спаянному своему терморегулятору. Отличие от оригинального проекта в дисплее - у меня OLED 0,96" и в энкодере - у меня 3 кнопки вместо него.
С программированием у меня туго, поэтому стараюсь исходный код особо не корёжить и именно поэтому нужна подсказка знатоков.
С дисплеем всё адаптировал, а вот фрагмент с обработкой энкодера, что-то то не хочет с моими кнопками работать ... Вернее кнопка "+" работает, а "-" что-то никак. Хотя в мониторе порта вижу, что при нажатии кнопки "-" переход на вектор прерывания происходит и значение переменной "dt_state" вроде такое как надо, но почему-то не обрабатывается правильно.
Вот фрагмент кода с обработкой кнопок:
//The interruption vector for push button and rotary encoder ISR(PCINT0_vect){ if(menu_activated==1) { #ifdef __DEBUG__ Serial.println("-> int <- "); #endif clk_State = (PINB & B00000001); //pin 8 state? It is HIGH? / Читаем в переменные состояние пинов D8 dt_State = (PINB & B00000010); //pin 9 state? It is HIGH? \ и D9, фактически кнопок "-" и "+" ( clk_State - это кн. "+", dt_State - это кн. "-" ) #ifdef __DEBUG__ Serial.println("Last_State - " + String(Last_State)); Serial.println("clk_State - " + String(clk_State)); Serial.println("dt_State - " + String(dt_State)); #endif if (clk_State != Last_State) { //если нажата кнопка "-", проверяем состояние кн. "+" if (dt_State != clk_State) { // If the data state is different to the clock state, that means the encoder is rotating clockwise (если состояние пина D9 отличается от D8, значит энкодер вращается по часовой стрелке) set_temperature = set_temperature + 1; } else if (dt_State == 0) { if (clk_State == 1) { set_temperature = set_temperature - 1; } } Last_State = clk_State; // Updates the previous state of the clock with the current state } }
До 18 строки всё нормально отрабатывает, а дальше ELSE нет, поскажите кто шарит, что я не так там делаю?
Уберите 20 строку. Она всё путает.
Уберите 20 строку. Она всё путает.
Убрал, безрезультатно... Такое ощущение, что на это ELSE программа вообще не попадает.
Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять? И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер.
Странный подход к делу: Не разбираюсь, но буду что-то там править.
Вы либо повторяйте 1 в 1 (если не разбираетесь), либо учитесь - и правьте потом что угодно (или даже пишите своё).
Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять? И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер.
Значение по умолчанию равно 0 градусов. Нажмите кнопку установки поворотного энкодера. Поверните его влево, чтобы увеличить или уменьшить значение температуры. Нажмите кнопку установки еще раз, и теперь вы можете установить константу P для ПИД-регулятора. Нажмите еще раз и выберите значение I. Наконец, снова нажмите кнопку и выберите значение D. Теперь нажмите кнопку и выйдите из меню, и новые настройки будут сохранены.
Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять? И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер.
Значение по умолчанию равно 0 градусов. Нажмите кнопку установки поворотного энкодера. Поверните его влево, чтобы увеличить или уменьшить значение температуры. Нажмите кнопку установки еще раз, и теперь вы можете установить константу P для ПИД-регулятора. Нажмите еще раз и выберите значение I. Наконец, снова нажмите кнопку и выберите значение D. Теперь нажмите кнопку и выйдите из меню, и новые настройки будут сохранены.
Что это было? Перевод со странички я прочитал и так. Особенно порадовали секундные задержки после каждого этого шага. Писал программу явно кто то с эстонскими корнями :-)
Что это было? Перевод со странички я прочитал и так. Особенно порадовали секундные задержки после каждого этого шага. Писал программу явно кто то с эстонскими корнями :-)
раз программу смотрел, то резюме вполне естественное, всё переписать, кнопки на интах нормально работать не будут, на дюпонах однозначно!
Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять? И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер.
Да, всё так и есть, исходный код написан для энкодера. И "хитрым" нажатием кнопок получается и уменьшать и увеличивать уставки. Но я чё то подумал, что энкодер это те же кнопки, только нажимающиеся в определенном порядке. Хотел без большой переписи кода обойтись. Видимо ошибался ...
Сам точно быстро не перепишу, придется исполнителя искать.
Инты это прерывания а дюпоны провода? Синее с горячим? А так да переписывать надо управление.
Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять? И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер.
Да, всё так и есть, исходный код написан для энкодера. И "хитрым" нажатием кнопок получается и уменьшать и увеличивать уставки. Но я чё то подумал, что энкодер это те же кнопки, только нажимающиеся в определенном порядке. Хотел без большой переписи кода обойтись. Видимо ошибался ...
Сам точно быстро не перепишу, придется исполнителя искать.
Да не сильно. Надо выкинуть кусок определения какая кнопка раньше нажата и просто написать если одна то плюс, если вторая то минус. К каким ногам кнопки + - продключил?
Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять? И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер.
Да, всё так и есть, исходный код написан для энкодера. И "хитрым" нажатием кнопок получается и уменьшать и увеличивать уставки. Но я чё то подумал, что энкодер это те же кнопки, только нажимающиеся в определенном порядке. Хотел без большой переписи кода обойтись. Видимо ошибался ...
Сам точно быстро не перепишу, придется исполнителя искать.
Да не сильно. Надо выкинуть кусок определения какая кнопка раньше нажата и просто написать если одна то плюс, если вторая то минус. К каким ногам кнопки + - продключил?
D8 - "-", D9 - "+", D11 - "переключение меню", всё как в исходном проекте.
У меня терморегулятор собраный уже и в корпусе, отличие только в другом дисплее и кнопки вместо энкодера из-за ограничений по габаритам. Взял этот алгоритм потому, что можно PID коэффициенты на лету подстраивать. Не думал, что на кнопках застопорюсь. Казалось всё очевидно и просто.
Ну тогда как то так. Не проверял. Только идея.
Возможно в if придётся перевернуть условие если кнопки замыкаются на массу типа if (!clk_State)ki = ki + 1 ;
Ну тогда как то так. Не проверял. Только идея.
Возможно в if придётся перевернуть условие если кнопки замыкаются на массу типа if (!clk_State)ki = ki + 1 ;
Проверил - работает. Я правда пока только в одной секции меню поменял. С кнопками код как-то даже упростился, я бы сказал.
Спасибо огромное !
З/Ы: Буду пытаться ещё кое какие "хотелки" прикрутить туда. Ещё раз спасибо!
Обращайся. Поможем.
Обращайся. Поможем.
Спасибо.
Я сначала вообще сомневался могу ли я здесь вопрос по адаптации чужого кода задать, в правилах для новичков написано, что вопросы задавать только по коду написанному собственноручно. А я вроде как "копипастом" занимаюсь, хоть и пытаюсь его адаптировать под свое железо.
Обращайся. Поможем.
Спасибо.
Я сначала вообще сомневался могу ли я здесь вопрос по адаптации чужого кода задать, в правилах для новичков написано, что вопросы задавать только по коду написанному собственноручно. А я вроде как "копипастом" занимаюсь, хоть и пытаюсь его адаптировать под свое железо.
это у Ника запас добрых дел за неделю не закончился )))
Адекватным падаванам помогать даже при таких условиях возможно. Неадекваты бесят.
Добрый вечер . Возможно ли такое чтоб Ардуино начинал принимать импульс от текста смс . От самого содержимого. Например если приходит смс с текстом привет Ардуино начинает работу . Если другое слово например пока . То никаких действий не происходит .
Чудо!
В церковь сходите.
А если серьёзно - проверять питание и программу.