#1 Re: Програмування Arduino » Меню LCD Keypad Shield 1602 » 2021-05-25 17:00:30

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

#2 Re: Програмування Arduino » Меню LCD Keypad Shield 1602 » 2021-05-23 22:33:43

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");
    }
   
     
}

#3 Програмування Arduino » Меню LCD Keypad Shield 1602 » 2021-05-23 14:06:16

Rimbo537
відповідей: 8

Всем привет. Очень нужна помошь с реализацией меню на данном дисплее, ниже показал свой скетч, в котором просто реализовано включение и выключение реле по кнопке, и высчитывается температура с термистора. Нужно сделать меню с тремя режимами работы с таймером:
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");
    }
   
     
}

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