Помогите разобратся с кнопками

Kam41
Offline
Зарегистрирован: 06.04.2019

 

Уважаемые Гуру! Прошу вашей помощи. Что нужно поправить или как правильно написать скетч, чтоб он заработал правильно.

Есть кнопки, подключенные через нонейм микросхему которая выдает код как с ИК пульта.

Написал некий скетч по управлению теном с использованием терморезистора. Так вот, отдельный код без кнопок работает, 

а в рамках управления кнопками нет. Помогите пожалуйста!

#define POWER        0x51DA01F8
#define TIME_STTING  0x1F72CFA1
#define TEMPERATURE  0xA83B8E71 
#define HEATING      0x974D2F31
#define VACUUM       0xCE53E021
#define TIMING       0x1B4F8AC1
#define PLUS         0x8876C5E1
#define MINUS        0xD080A1B1
#include <IRremote.h>
int RECEIVE_PIN = 2;
IRrecv irrecv(RECEIVE_PIN);
decode_results results;
  
int VAKUUM_RELEY = A3;
int TEN_1_RELEY = A1;
int TEN_2_RELEY = A2;
int state =0;
int regim = 1;
int flag = 0;
int termPin = A0;  //Вход терморезистора 

void setup(){

  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(TEN_1_RELEY, OUTPUT);  //Выход на тен №1
  pinMode(TEN_2_RELEY, OUTPUT);  //Выход на тен №2
  pinMode(VAKUUM_RELEY, OUTPUT); //Выход на вакуумный насос
  pinMode(RECEIVE_PIN, INPUT);
}
 void loop(){

  int adc_value=analogRead(termPin);
  Serial.print("ADC = ");
  Serial.println(adc_value);
  delay(500);

//--------------------------------------------------------------------------------
 
    if ((irrecv.decode(&results)) && (results.value==HEATING) ) {
       if (flag == 0){
           regim ++;
           flag = 1;
           }
           if(regim>4){
           regim = 1;}
           }
      if ((irrecv.decode(&results)) && (results.value==HEATING) ) {
        if (flag == 1){
            flag = 0;
           }
      if(regim==1){
           digitalWrite(TEN_1_RELEY, LOW);
           digitalWrite(TEN_2_RELEY, LOW);
           }
      if(regim==2){
        if (analogRead(termPin)>910){
              digitalWrite(TEN_1_RELEY, HIGH);
              }
          if (analogRead(termPin)<900){
              digitalWrite(TEN_1_RELEY, LOW);
              }
              digitalWrite(TEN_2_RELEY, LOW);
              }
      if(regim==3){
        if (analogRead(termPin)>910){
              digitalWrite(TEN_1_RELEY, HIGH);
              }
         if (analogRead(termPin)<900){
              digitalWrite(TEN_1_RELEY, LOW);
              }
         if (analogRead(termPin)>910){
              digitalWrite(TEN_2_RELEY, HIGH);
              }
         if (analogRead(termPin)<900){
              digitalWrite(TEN_2_RELEY, LOW);
             }
       }
        if(regim==4){
          if (analogRead(termPin)>910){
              digitalWrite(TEN_2_RELEY, HIGH);
              }
          if (analogRead(termPin)<900){
              digitalWrite(TEN_2_RELEY, LOW);
              }
              digitalWrite(TEN_1_RELEY, LOW);
              }
         delay(300);
         irrecv.resume();
       }    
    }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kam41 пишет:
отдельный код без кнопок работает, а в рамках управления кнопками нет. 
Так никто ж, кроме Вас, не знат, что он должен делать и что Вы понимаете по "работает" и "нет".

Опишите подробно что именно он делает. И что идёт не так с кнопками.

Kam41
Offline
Зарегистрирован: 06.04.2019

по условию тен должен включится на нагрев, а по достижению температуры выключится. В данном коде управления не происходит.  

Какойто затык. Сами то кнопки работают и режимы переключаются вот только контроль по температуре не проходит.

SLKH
Offline
Зарегистрирован: 17.08.2015

Kam41 пишет:

по условию тен должен включится на нагрев, а по достижению температуры выключится. В данном коде управления не происходит.  

Какойто затык. Сами то кнопки работают и режимы переключаются вот только контроль по температуре не проходит.

Пишите вывод в монитор всех ваших переменных после всех ифов.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kam41 пишет:

по условию тен должен включится на нагрев, а по достижению температуры выключится. В данном коде управления не происходит.  

По какому условию, в какой строке? По достижению температуры - в какой строке программы. ну, опишите же свою программу - Вы хотите. чтобы человек сам разбирался где у Вас что? Не многовато? Опишите подробно, что должно происходить и что происходит. Тогда посмотрим.

Kam41
Offline
Зарегистрирован: 06.04.2019

После каждой переменной условие не выполняется самостоятельно. Режим 1 работает безукоризненно. Жмём кнопку, Режим 2 нагрев пошёл. По достижению выставленной температуры должен отключится нагрев, а нагрев не отключается, стоит прокрутить режимы по кругу, срабатывает отключение нагрева. По достижению значений для включения нагрева, нагрев не включается, опять клацаем кнопку по кругу нагрев включился. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Kam41, мне кажется, код не работает, как Вы хотите, потому, что Вы сами не понимаете, как он должен работать.

По крайней мере, ничего вменяемого даже на прямо поставленные вопросы Вы не написали.

Любой проект начинается (по крайней мере, должен начинаться) с проектирования. Т.е. с того, чтобы внятно по-русски расписать, как он должен работать.

Вот попытайтесь прямо здесь сделать такое описание.

SLKH
Offline
Зарегистрирован: 17.08.2015

Вы знаете, что означает температура ">910" попугаев. Мы не знаем, как у вас включен термистор и что такое >910 - это высокая температура или низкая?

Вы знаете, что означает TEN_1_RELEY, LOW. Мы не знаем - это включение или же выключение?

Вы знаете (надеюсь), что означает ваш флаг. Мы этого не знаем.

Вы знаете (надеюсь), что в каком из ваших режимов должно происходить. Мы этого не знаем.

Вы знаете (надеюсь), как должны переключаться ваши режимы. Мы этого не знаем.

Продолжать?

Kam41
Offline
Зарегистрирован: 06.04.2019

 

Упростил код и закоментировал.
Посмотрел сейчас в мониторе показания термистора в условии переменной if, показания считываются только при нажатой кнопке, как исправить?

 

 

 

#define HEATING      0x974D2F31
#include <IRremote.h>
int RECEIVE_PIN = 2;
IRrecv irrecv(RECEIVE_PIN);
decode_results results;
  

int TEN_1_RELEY = A1;             //Нагрузка неважно какая. Пусть будет светодиод.

int state =0;

int termPin = A0;  //Вход термистора с подтяжкой на землю.

void setup(){

  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(TEN_1_RELEY, OUTPUT);  //Выход на тен №1
  pinMode(RECEIVE_PIN, INPUT);   //Вход с кнопок 
}
 void loop(){

 // int adc_value=analogRead(termPin);
//  Serial.print("ADC = ");
  //Serial.println(adc_value);
 // delay(500);

//--------------------------------------------------------------------------------

if ((irrecv.decode(&results)) && (results.value==HEATING) ) { //Кнопка управления
        if (state == 0) {
            state = 1;
            if (analogRead(termPin)>940){  //Условие на включение нагрузки
              digitalWrite(TEN_1_RELEY, HIGH); //Включаем нагрузку по условию переменной
              }
          if (analogRead(termPin)<915){  //При достижении условия выключаем нагрузку
              digitalWrite(TEN_1_RELEY, LOW); //Выключаем нагрузку по условию переменной
              }
            } else {
            state = 0;
            digitalWrite(TEN_1_RELEY, LOW); //Выключаем полностью нагрузку
            
        }
      // delay(300);
        irrecv.resume();
  


       }    
    }

 

bwn
Offline
Зарегистрирован: 25.08.2014

Сядьте и человеческим языком выпишите на бумажке, что в какой момент происходит и при каких условиях. Подсказываю:

Температура достигла мульена попугаев - выключить рылю.
Считать значение "кнопки" и сделать........

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

Уважаемый, а как Вы думаете, прикаком условии программа попадет в диапазон 31-41 строк? Не по нажатию ли кнопочки? Так получается, что программа выполняет именно то, что Вы написали.

Совет - надо что бы было так - прочитали кнопку, изменили уставки и термостат далее работает. Кстати - в готовых проектах достаточно много термостатов. Может посмотреть, как это люди делают?

Kam41
Offline
Зарегистрирован: 06.04.2019

В том и проблема, условие 31-40 НЕ выполняется в пределе опроса кнопки. Если переменную вынести за пределы опроса то оно работает но само по себе, а надо что б от кнопки.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

.

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

Kam41 пишет:

В том и проблема, условие 31-40 НЕ выполняется в пределе опроса кнопки. Если переменную вынести за пределы опроса то оно работает но само по себе, а надо что б от кнопки.

Расскажите, а по какому условию должна работать программа, а по какому не должна?

Пока нажата кнопка? Пока не нажали другую кнопку? Пока Вы думаете о нажатии на кнопку?

У Вас сейчас написано - пока нажата кнопка (возможно, поскольку с подпрограммой IR не знаком). И напишите пока с обычной кнопкой, а потом добавьте IR. 

Kam41
Offline
Зарегистрирован: 06.04.2019

Условие, нажали кнопку, отпустили, включился тен, контроль нагрева до установленной температуры и ее поддержания. Ещё раз нажали, нагрев выключили. С одной стороны все просто но в условии IR не понятно. Если довести нагрев до выставленного значения отключение TEN_1_RELEY не происходит, если нажать на кнопку по кругу то TEN_1_RELEY будет находится в выключенном состоянии и так-же в обратном направлении.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Kam41 пишет:

Условие, нажали кнопку, отпустили, включился тен, контроль нагрева до установленной температуры и ее поддержания. Ещё раз нажали, нагрев выключили. С одной стороны все просто но в условии IR не понятно. Если довести нагрев до выставленного значения отключение TEN_1_RELEY не происходит, если нажать на кнопку по кругу то TEN_1_RELEY будет находится в выключенном состоянии и так-же в обратном направлении.

#define HEATING      0x974D2F31
#include <IRremote.h>
int RECEIVE_PIN = 2;
IRrecv irrecv(RECEIVE_PIN);
decode_results results;


int TEN_1_RELEY = A1;             //Нагрузка неважно какая. Пусть будет светодиод.

int state = 0;

int termPin = A0;  //Вход термистора с подтяжкой на землю.

void setup() {

  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(TEN_1_RELEY, OUTPUT);  //Выход на тен №1
  pinMode(RECEIVE_PIN, INPUT);   //Вход с кнопок
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, state);
  digitalWrite(TEN_1_RELEY, LOW); //Выключаем полностью нагрузку
}
void loop() {

  // int adc_value=analogRead(termPin);
  //  Serial.print("ADC = ");
  //Serial.println(adc_value);
  // delay(500);

  //--------------------------------------------------------------------------------

  if ((irrecv.decode(&results)) && (results.value == HEATING) ) { //Кнопка управления
    state = !state;
    digitalWrite(LED_BUILTIN, state);
    irrecv.resume();
  }
  if (state == 1) {
    if (analogRead(termPin) > 940) { //Условие на включение нагрузки
      digitalWrite(TEN_1_RELEY, HIGH); //Включаем нагрузку по условию переменной
    }
    if (analogRead(termPin) < 915) { //При достижении условия выключаем нагрузку
      digitalWrite(TEN_1_RELEY, LOW); //Выключаем нагрузку по условию переменной
    }
  } else {
    digitalWrite(TEN_1_RELEY, LOW); //Выключаем полностью нагрузку
  }

}

 

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

Kam41 пишет:

Условие, нажали кнопку, отпустили, включился тен, контроль нагрева до установленной температуры и ее поддержания. Ещё раз нажали, нагрев выключили. С одной стороны все просто но в условии IR не понятно. Если довести нагрев до выставленного значения отключение TEN_1_RELEY не происходит, если нажать на кнопку по кругу то TEN_1_RELEY будет находится в выключенном состоянии и так-же в обратном направлении.

Ну вот, наконец добились! Так для выполнения этого условия надо при нажатии на кнопку ставить флаг нажатия, при повторном - снимать флаг. А программа должна срабатывать по условию установки флага.

О, уже коллега написал :)

Kam41
Offline
Зарегистрирован: 06.04.2019

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

Переделал консрукцию из первого сообщения, все заработало!