Ви не увійшли.
Сторінки 1
Всем привет. Очень нужна помошь с реализацией меню на данном дисплее, ниже показал свой скетч, в котором просто реализовано включение и выключение реле по кнопке, и высчитывается температура с термистора. Нужно сделать меню с тремя режимами работы с таймером:
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");
}
}
Неактивний
А код можете правильно вставить ?
Объясните, что происходит в этой строке.
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");
}
}
Неактивний
Всем привет. Очень нужна помошь с реализацией меню на данном дисплее
А зачем меню? Назначай на каждую кнопку свой режим и все
renoshnik пише:А код можете правильно вставить ?
Объясните, что происходит в этой строке.
float tr = 1023.0 / t - 1; //
Эта строка высчитывает сопротивление термистора, с помощю которого потом высчитываем температуру
Моя логика рассчета сопротивления термистора - зная напряжение на входе и выходе резистивного делителя, а также номинал верхнего сопротивления легко высчитать сопротивление терморезистора по формуле Rt=Rup/(5/Uизм - 1).
Пожалуйста объясните логику своей формулы .
Пожалуйста объясните почему там тип float .
Остання редакція renoshnik (2021-05-24 19:30:01)
Неактивний
Моя логика рассчета сопротивления термистора - Rt=Rup/(5/Uизм - 1).
А что в вашей формуле значит - 5 ?
Я не особо понял логику формулы, взял готовый скетч высчитывания температуры с термистора, и хочу сделать несколько режимов по таймеру, 20, 30 и 40 мин, чтобы в каждом режиме включалось-отключалось реле в зависимости от значений температуры(steinhart)
Неактивний
Я не особо понял логику формулы, взял готовый скетч высчитывания температуры с термистора, и хочу сделать несколько режимов по таймеру, 20, 30 и 40 мин, чтобы в каждом режиме включалось-отключалось реле в зависимости от значений температуры(steinhart)
Вот именно это я и имел ввиду.
Вы просто бездумно надергали кусков кода из интернета. Просить помощь как-то не логично. Помогают тем кто пытается разобраться в ситуации но возникла какая-то проблемка, и просящему указывают на путь решения такой проблемы.
В вашем случае ситуация выглядит как - хочу чтобы программа делала вот так, напишите мне такую программу.
Поэтому логичнее вам разместить свой заказ в соответствующем разделе форума.
Неактивний
Сторінки 1