#1 2021-05-23 14:06:16

Rimbo537
Учасник
Зареєстрований: 2021-05-23
Повідомлень: 3

Меню LCD Keypad Shield 1602

Всем привет. Очень нужна помошь с реализацией меню на данном дисплее, ниже показал свой скетч, в котором просто реализовано включение и выключение реле по кнопке, и высчитывается температура с термистора. Нужно сделать меню с тремя режимами работы с таймером:
1 режим: реле включено пока температура не достигнет например 57 градусов, когда достигает - отключается, и при 55 снова включается, на 20 минут, потом режим выключается и выходит на начальную страницу
2 и 3 режимы то же самое, только 30 и 40 минут
Я смотрел некоторые скетчи, как реализовано меню, но для меня это сложно в понимании, поэтому прошу помощи в реализации



#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define B 3950 // B-коэффициент
#define SERIAL_R 102000 // сопротивление последовательного резистора, 102 кОм
#define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм
#define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)

#define PIN_RELAY 5     //пин реле

const byte tempPin = A1;   //пин термистора

LiquidCrystal_I2C lcd(0x27,16,2); // Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой

void setup()
{
  //дисплей
 
  lcd.init();                      // Инициализация дисплея 

//термистор

    Serial.begin( 9600 );
    pinMode( tempPin, INPUT );

//реле
   pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход
   digitalWrite(PIN_RELAY, HIGH); // Выключаем реле - посылаем высокий сигнал

}
void loop()
{
  // термистор

    int t = analogRead( tempPin );                                    //
    float tr = 1023.0 / t - 1;                                             //
    tr = SERIAL_R / tr;                                                    //
    Serial.print("R=");                                                     //
    Serial.print(tr);                                                         //
    Serial.print(", t=");                                                   //
                                                                                   //
    float steinhart;                                                         //
    steinhart = tr / THERMISTOR_R; // (R/Ro)                  //Реализация термистора
    steinhart = log(steinhart); // ln(R/Ro)                        //который определяет температуру
    steinhart /= B; // 1/B * ln(R/Ro)                               //
    steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To)      //
    steinhart = 1.0 / steinhart; // Invert                          //
    steinhart -= 273.15;                                                 //
    Serial.println(steinhart);     //переменная выводит значение температуры

    delay(100);
 
  // дисплей, нажатие кнопок
 
  int x;
    x = analogRead (0);
    lcd.setCursor(0,1);
    if (x < 60) {
    lcd.print ("Right ");
     digitalWrite(PIN_RELAY, LOW);
    }
    else if (x < 200) {
    lcd.print ("Up    ");
     digitalWrite(PIN_RELAY, HIGH);
    }
    else if (x < 400){
    lcd.print ("Down  ");
     digitalWrite(PIN_RELAY, LOW);
    }
    else if (x < 600){
    lcd.print ("Left  ");
     digitalWrite(PIN_RELAY, HIGH);
    }
    else if (x < 800){
    lcd.print ("Select");
    }
   
     
}

Неактивний

#2 2021-05-23 17:37:34

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 901

Re: Меню LCD Keypad Shield 1602

А код можете правильно вставить ?

Объясните, что происходит в этой строке.

float tr = 1023.0 / t - 1;                                             //

Остання редакція renoshnik (2021-05-23 17:44:07)

Неактивний

#3 2021-05-23 22:33:43

Rimbo537
Учасник
Зареєстрований: 2021-05-23
Повідомлень: 3

Re: Меню LCD Keypad Shield 1602

renoshnik пише:

А код можете правильно вставить ?

Объясните, что происходит в этой строке.

float tr = 1023.0 / t - 1;                                             //

Эта строка высчитывает сопротивление термистора, с помощю которого потом высчитываем температуру

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define B 3950 // B-коэффициент
#define SERIAL_R 102000 // сопротивление последовательного резистора, 102 кОм
#define THERMISTOR_R 100000 // номинальное сопротивления термистора, 100 кОм
#define NOMINAL_T 25 // номинальная температура (при которой TR = 100 кОм)

#define PIN_RELAY 5     //пин реле

const byte tempPin = A1;   //пин термистора

LiquidCrystal_I2C lcd(0x27,16,2); // Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой

void setup()
{
  //дисплей
 
  lcd.init();                      // Инициализация дисплея 

//термистор

    Serial.begin( 9600 );
    pinMode( tempPin, INPUT );

//реле
   pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход
   digitalWrite(PIN_RELAY, HIGH); // Выключаем реле - посылаем высокий сигнал

}
void loop()
{
  // термистор

    int t = analogRead( tempPin );                                    //
    float tr = 1023.0 / t - 1;                                             //
    tr = SERIAL_R / tr;                                                    //
    Serial.print("R=");                                                     //
    Serial.print(tr);                                                         //
    Serial.print(", t=");                                                   //
                                                                                   //
    float steinhart;                                                         //
    steinhart = tr / THERMISTOR_R; // (R/Ro)                  //Реализация термистора
    steinhart = log(steinhart); // ln(R/Ro)                        //который определяет температуру
    steinhart /= B; // 1/B * ln(R/Ro)                               //
    steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To)      //
    steinhart = 1.0 / steinhart; // Invert                          //
    steinhart -= 273.15;                                                 //
    Serial.println(steinhart);     //переменная выводит значение температуры

    delay(100);
 
  // дисплей, нажатие кнопок
 
  int x;
    x = analogRead (0);
    lcd.setCursor(0,1);
    if (x < 60) {
    lcd.print ("Right ");
     digitalWrite(PIN_RELAY, LOW);
    }
    else if (x < 200) {
    lcd.print ("Up    ");
     digitalWrite(PIN_RELAY, HIGH);
    }
    else if (x < 400){
    lcd.print ("Down  ");
     digitalWrite(PIN_RELAY, LOW);
    }
    else if (x < 600){
    lcd.print ("Left  ");
     digitalWrite(PIN_RELAY, HIGH);
    }
    else if (x < 800){
    lcd.print ("Select");
    }
   
     
}

Неактивний

#4 2021-05-24 07:20:04

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 759

Re: Меню LCD Keypad Shield 1602

а в чем помощь заключается ?

Неактивний

#5 2021-05-24 10:39:59

г0сть
Гість

Re: Меню LCD Keypad Shield 1602

Rimbo537 пише:

Всем привет. Очень нужна помошь с реализацией меню на данном дисплее

А зачем меню? Назначай на каждую кнопку свой режим и все

#6 2021-05-24 19:28:26

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 901

Re: Меню LCD Keypad Shield 1602

Rimbo537 пише:
renoshnik пише:

А код можете правильно вставить ?

Объясните, что происходит в этой строке.

float tr = 1023.0 / t - 1;                                             //

Эта строка высчитывает сопротивление термистора, с помощю которого потом высчитываем температуру

Моя логика рассчета сопротивления термистора - зная напряжение на входе и выходе резистивного делителя, а также номинал верхнего сопротивления легко высчитать сопротивление терморезистора по формуле Rt=Rup/(5/Uизм - 1).

Пожалуйста объясните логику своей формулы .
Пожалуйста объясните почему там тип float .

Остання редакція renoshnik (2021-05-24 19:30:01)

Неактивний

#7 2021-05-24 19:52:32

г0сть
Гість

Re: Меню LCD Keypad Shield 1602

renoshnik пише:

Моя логика рассчета сопротивления термистора -  Rt=Rup/(5/Uизм - 1).

А что в вашей формуле значит - 5 ?

#8 2021-05-25 17:00:30

Rimbo537
Учасник
Зареєстрований: 2021-05-23
Повідомлень: 3

Re: Меню LCD Keypad Shield 1602

Я не особо понял логику формулы, взял готовый скетч высчитывания температуры с термистора, и хочу сделать несколько режимов по таймеру, 20, 30 и 40 мин, чтобы в каждом режиме включалось-отключалось реле в зависимости от значений температуры(steinhart)

Неактивний

#9 2021-05-25 17:29:01

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 901

Re: Меню LCD Keypad Shield 1602

Rimbo537 пише:

Я не особо понял логику формулы, взял готовый скетч высчитывания температуры с термистора, и хочу сделать несколько режимов по таймеру, 20, 30 и 40 мин, чтобы в каждом режиме включалось-отключалось реле в зависимости от значений температуры(steinhart)

Вот именно это я и имел ввиду.
Вы просто бездумно надергали кусков кода из интернета. Просить помощь как-то не логично. Помогают тем кто пытается разобраться в ситуации но возникла какая-то проблемка, и просящему указывают на путь решения такой проблемы.

В вашем случае ситуация выглядит как - хочу чтобы программа делала вот так, напишите мне такую программу.
Поэтому логичнее вам разместить свой заказ в соответствующем разделе форума.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму