HELP!!! Требуется подсказка ... в адаптации кода.

SubJorj
Offline
Зарегистрирован: 30.05.2021

Привет всем !

Пытаюсь адаптировать скетч из проекта "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 нет, поскажите кто шарит, что я не так там делаю?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уберите 20 строку. Она всё путает.

SubJorj
Offline
Зарегистрирован: 30.05.2021

mykaida пишет:

Уберите 20 строку. Она всё путает.

Убрал, безрезультатно... Такое ощущение, что на это ELSE программа вообще не попадает.

nik182
Offline
Зарегистрирован: 04.05.2015

Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять?  И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер. 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Странный подход к делу: Не разбираюсь, но буду что-то там править. 
Вы либо повторяйте 1 в 1 (если не разбираетесь), либо учитесь - и правьте потом что угодно (или даже пишите своё).

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

nik182 пишет:

Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять?  И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер. 

Значение по умолчанию  равно 0 градусов. Нажмите кнопку установки поворотного энкодера. Поверните его влево, чтобы увеличить или уменьшить значение температуры. Нажмите кнопку установки еще раз, и теперь вы можете установить константу P для ПИД-регулятора. Нажмите еще раз и выберите значение I. Наконец, снова нажмите кнопку и выберите значение D. Теперь нажмите кнопку и выйдите из меню, и новые настройки будут сохранены.

nik182
Offline
Зарегистрирован: 04.05.2015

ua6em пишет:

nik182 пишет:

Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять?  И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер. 

Значение по умолчанию  равно 0 градусов. Нажмите кнопку установки поворотного энкодера. Поверните его влево, чтобы увеличить или уменьшить значение температуры. Нажмите кнопку установки еще раз, и теперь вы можете установить константу P для ПИД-регулятора. Нажмите еще раз и выберите значение I. Наконец, снова нажмите кнопку и выберите значение D. Теперь нажмите кнопку и выйдите из меню, и новые настройки будут сохранены.

Что это было? Перевод со странички я прочитал и так. Особенно порадовали секундные задержки после каждого этого шага. Писал программу явно кто то с эстонскими корнями :-)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

nik182 пишет:

Что это было? Перевод со странички я прочитал и так. Особенно порадовали секундные задержки после каждого этого шага. Писал программу явно кто то с эстонскими корнями :-)

раз программу смотрел, то резюме вполне естественное, всё переписать, кнопки на интах нормально работать не будут, на дюпонах однозначно!

SubJorj
Offline
Зарегистрирован: 30.05.2021

nik182 пишет:

Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять?  И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер. 

Да, всё так и есть, исходный код написан для энкодера. И "хитрым" нажатием кнопок получается и уменьшать и увеличивать уставки. Но я чё то подумал, что энкодер это те же кнопки, только нажимающиеся в определенном порядке. Хотел без большой переписи кода обойтись. Видимо ошибался ...

Сам точно быстро не перепишу, придется исполнителя искать.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Инты это прерывания а дюпоны провода? Синее с горячим? А так да переписывать надо управление.

nik182
Offline
Зарегистрирован: 04.05.2015

SubJorj пишет:

nik182 пишет:

Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять?  И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер. 

Да, всё так и есть, исходный код написан для энкодера. И "хитрым" нажатием кнопок получается и уменьшать и увеличивать уставки. Но я чё то подумал, что энкодер это те же кнопки, только нажимающиеся в определенном порядке. Хотел без большой переписи кода обойтись. Видимо ошибался ...

Сам точно быстро не перепишу, придется исполнителя искать.

 

Да не сильно. Надо выкинуть кусок определения какая кнопка раньше нажата и просто написать если одна то плюс, если вторая то минус. К каким ногам кнопки + - продключил?

SubJorj
Offline
Зарегистрирован: 30.05.2021

nik182 пишет:

SubJorj пишет:

nik182 пишет:

Эти клики завязаны на энкодер. Эту подпрограмму нужно выкинуть и переписать код на кнопки. . Что должно происходить при нажатии кнопок. К каким ногам прицеплены кнопки и какие функции каждая кнопка должна выполнять?  И кроме того, меню тоже управляется от энкодера. Так что это не одно место где придётся править. Или учиться две кнопки нажимать одновременно, но одну в нужную сторону чуть раньше. Несколько миллисекунд смоделируют энкодер. 

Да, всё так и есть, исходный код написан для энкодера. И "хитрым" нажатием кнопок получается и уменьшать и увеличивать уставки. Но я чё то подумал, что энкодер это те же кнопки, только нажимающиеся в определенном порядке. Хотел без большой переписи кода обойтись. Видимо ошибался ...

Сам точно быстро не перепишу, придется исполнителя искать.

 

Да не сильно. Надо выкинуть кусок определения какая кнопка раньше нажата и просто написать если одна то плюс, если вторая то минус. К каким ногам кнопки + - продключил?

D8 - "-", D9 - "+", D11 - "переключение меню", всё как в исходном проекте.

У меня терморегулятор собраный уже и в корпусе, отличие только в другом дисплее и кнопки вместо энкодера из-за ограничений по габаритам. Взял этот алгоритм потому, что можно PID коэффициенты на лету подстраивать. Не думал, что на кнопках застопорюсь. Казалось всё очевидно и просто. 

nik182
Offline
Зарегистрирован: 04.05.2015

Ну тогда как то так. Не проверял. Только идея.

//The interruption vector for push button and rotary encoder
ISR(PCINT0_vect) {
  if (menu_activated == 1)
  {
    clk_State =   (PINB & B00000001); //pin 8 state? It is HIGH?
    dt_State  =   (PINB & B00000010);
    if (clk_State) set_temperature = set_temperature + 0.5 ;
    if (dt_State)  set_temperature = set_temperature - 0.5 ;
  }

  if (menu_activated == 2)
  {
    clk_State =   (PINB & B00000001); //pin 8 state?
    dt_State  =   (PINB & B00000010);
    if (clk_State)kp = kp + 1 ;
    if (dt_State)kp = kp + 1 ;
  }


  if (menu_activated == 3)
  {
    clk_State =   (PINB & B00000001); //pin 8 state?
    dt_State  =   (PINB & B00000010);
    if (clk_State)ki = ki + 1 ;
    if (clk_State)ki = ki - 1 ;
  }

  if (menu_activated == 4)
  {
    clk_State =   (PINB & B00000001); //pin 8 state?
    dt_State  =   (PINB & B00000010);
    if (clk_State ) kd = kd + 1 ;
    if (clk_State ) kd = kd - 1 ;
   }



  //Push button was pressed!
  if (PINB & B00001000) //Pin D11 is HIGH?
  {
    button_pressed = 1;
  }
  //We navigate through the 4 menus with each button pressed
  else if (button_pressed == 1)
  {

    if (menu_activated == 4)
    {
      menu_activated = 0;
      PID_values_fixed = 1;
      button_pressed = 0;
      delay(1000);
    }

    if (menu_activated == 3)
    {
      menu_activated = menu_activated + 1;
      button_pressed = 0;
      kd = kd + 1;
      delay(1000);
    }

    if (menu_activated == 2)
    {
      menu_activated = menu_activated + 1;
      button_pressed = 0;
      ki = ki + 1;
      delay(1000);
    }

    if (menu_activated == 1)
    {
      menu_activated = menu_activated + 1;
      button_pressed = 0;
      kp = kp + 1;
      delay(1000);
    }


    if (menu_activated == 0 && PID_values_fixed != 1)
    {
      menu_activated = menu_activated + 1;
      button_pressed = 0;
      set_temperature = set_temperature + 1;
      delay(1000);
    }
    PID_values_fixed = 0;

  }
}

Возможно в if придётся перевернуть условие если кнопки замыкаются на массу типа if (!clk_State)ki = ki + 1 ;

SubJorj
Offline
Зарегистрирован: 30.05.2021

nik182 пишет:

Ну тогда как то так. Не проверял. Только идея.

.....

Возможно в if придётся перевернуть условие если кнопки замыкаются на массу типа if (!clk_State)ki = ki + 1 ;

Проверил - работает. Я правда пока только в одной секции меню поменял. С кнопками код как-то даже упростился, я бы сказал.

Спасибо огромное ! 

З/Ы: Буду пытаться ещё кое какие "хотелки" прикрутить туда. Ещё раз спасибо!

nik182
Offline
Зарегистрирован: 04.05.2015

Обращайся. Поможем.

SubJorj
Offline
Зарегистрирован: 30.05.2021

nik182 пишет:

Обращайся. Поможем.

Спасибо.

     Я сначала вообще сомневался могу ли я здесь вопрос по адаптации чужого кода задать, в правилах для новичков написано, что вопросы задавать только по коду написанному собственноручно. А я вроде как "копипастом" занимаюсь, хоть и пытаюсь его адаптировать под свое железо.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

SubJorj пишет:

nik182 пишет:

Обращайся. Поможем.

Спасибо.

     Я сначала вообще сомневался могу ли я здесь вопрос по адаптации чужого кода задать, в правилах для новичков написано, что вопросы задавать только по коду написанному собственноручно. А я вроде как "копипастом" занимаюсь, хоть и пытаюсь его адаптировать под свое железо.

это у Ника запас добрых дел за неделю не закончился )))

nik182
Offline
Зарегистрирован: 04.05.2015

Адекватным падаванам помогать даже при таких условиях возможно. Неадекваты бесят. 

Maratkxk
Offline
Зарегистрирован: 29.10.2021

Добрый вечер . Возможно ли такое чтоб Ардуино начинал принимать импульс от текста смс . От самого содержимого. Например если приходит смс с текстом привет Ардуино начинает работу . Если другое слово например пока . То никаких действий не происходит .

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Чудо!
В церковь сходите.
А если серьёзно - проверять питание и программу.