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

, 👍0

Обсуждение

Пожалуйста, включите код в свой вопрос, чтобы он стоял отдельно, даже когда ссылка на pastbin становится недействительной., @chrisl


1 ответ


2

Посмотрите на строку 55, где вы это делаете

temperature = newSetpoint;

Нет причин присваивать температуре то же значение, что и уставка. Это не имеет смысла. И переменная temperature та же самая, которую вы используете для отображения.

Итак, пока вы меняете уставку, переменная temperatur перезаписывается уставкой. Когда вы больше не меняете его, измеренная температура все еще находится в этой переменной, когда вы ее отображаете.

Просто удалите указанную строку.

,