Nokia 5110 LCD проблема с отображением номера
У меня возникла проблема с ЖК-дисплеем Nokia 5110. В данный момент собираю паяльную станцию на основе ПИД-регулятора. В исходном коде использовался 7-сегментный дисплей, и я адаптировал код для дисплея Nokia.
Проблема в том, что когда я поворачиваю потенциометр, "считанная температура" и "заданная температура" показывают одно и то же число, и после того, как я заканчиваю вращать потенциометр, значения возвращаются к своему нормальному числу.
Как решить эту проблему?
Это мой код: https://pastebin.com/inPtkniX
Это оригинальный проект: https://www. allaboutcircuits.com/projects/сделай сам-паяльную станцию-с-an-atmega8/
//Программное обеспечение паяльной станции с использованием PID
//Спасибо Alex с https://geektimes.ru/ за помощь с функцией led array
//AllAboutCircuits.com
//epilepsynerd.wordpress.com
#include <PID_v1.h>
#include <PCD8544.h>
PCD8544 lcd;
unsigned long updaterate = 500; //Изменить скорость обновления дисплея. Не ниже 500
unsigned long lastupdate;
int temperature = 0;
// Определяем переменные, к которым мы будем подключаться
double Setpoint, Input, Output;
//Определяем агрессивные и консервативные параметры настройки
double aggKp = 4, aggKi = 0.2, aggKd = 1;
double consKp = 1, consKi = 0.05, consKd = 0.25;
//Указываем ссылки и параметры начальной настройки
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
void setup() {
lcd.begin(84, 48);
//Мы не хотим гнать паяльник на 100%, потому что он может сгореть, поэтому ставим примерно 85% (220/255)
myPID.SetOutputLimits(0, 220);
myPID.SetMode(AUTOMATIC);
lastupdate = millis();
Setpoint = 0;
}
void loop() {
lcd.clear();
// Чтение температуры
Input = analogRead(0);
// Преобразование 10-битного показания в градусы Цельсия
Input = map(Input, 0, 450, 25, 350);
//Показать температуру
if (millis() - lastupdate > updaterate) {
lastupdate = millis();
temperature = Input;
}
//Чтение заданного значения и преобразование его в градусы Цельсия (минимум 150, максимум 350)
double newSetpoint = analogRead(1);
newSetpoint = map(newSetpoint, 0, 1023, 150, 350);
//Отображение заданного значения
if (abs(newSetpoint - Setpoint) > 3) {
Setpoint = newSetpoint;
//температура = новаяУставка;
lastupdate = millis();
}
double gap = abs(Setpoint - Input); //расстояние от заданного значения
if (gap < 10) {
//мы близки к заданному значению, используйте консервативные параметры настройки
myPID.SetTunings(consKp, consKi, consKd);
} else {
//мы далеки от уставки, используйте агрессивные параметры настройки
myPID.SetTunings(aggKp, aggKi, aggKd);
}
myPID.Compute();
// Управление выводом
analogWrite(11, Output);
// Отображение температуры
show(temperature, newSetpoint);
}
void show(int value, int newspnt) {
lcd.setCursor(0, 0);
lcd.print("READ TEMP");
lcd.setCursor(0, 1);
lcd.print(value);
lcd.setCursor(0, 2);
lcd.print("SET TEMP");
lcd.setCursor(0, 3);
lcd.print(newspnt);
delay(200);
}
@beard999, 👍0
Обсуждение1 ответ
Посмотрите на строку 55, где вы это делаете
temperature = newSetpoint;
Нет причин присваивать температуре то же значение, что и уставка. Это не имеет смысла. И переменная temperature
та же самая, которую вы используете для отображения.
Итак, пока вы меняете уставку, переменная temperatur
перезаписывается уставкой. Когда вы больше не меняете его, измеренная температура все еще находится в этой переменной, когда вы ее отображаете.
Просто удалите указанную строку.
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отобразить символ º на ЖК-дисплее?
- Путаница между SPI и I2C для SSD1306 OLED
- Потенциометр 10 кОм против резистора 10 кОм на ЖК-дисплее
- Не могу заставить 4 значный 7 сегментный дисплей показывать разные значения
- Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)
- Запуск 7-контактного OLED-дисплея с 4 контактами (I2C)
- Как отобразить переменные с плавающей запятой на OLED-дисплее (0,96 дюйма)
Пожалуйста, включите код в свой вопрос, чтобы он стоял отдельно, даже когда ссылка на pastbin становится недействительной., @chrisl