I have a problem regarding a Nokia 5110 LCD display. I am currently building a soldering station based on a PID controller. The original code was using a 7 segment display and I adapted the code to the Nokia display.
The problem is that when I rotate the potentiometer, the "read temp" and "set temp" is showing the exactly the same number, and after I finish rotating the potentiometer, the values return to their normal number.
How can I solve this problem ?
This is my code: https://pastebin.com/inPtkniX
This is the original project: https://www.allaboutcircuits.com/projects/do-it-yourself-soldering-station-with-an-atmega8/
//Soldering station Software using PID
//Thank you Alex from https://geektimes.ru/ for help with led array function
//AllAboutCircuits.com
//epilepsynerd.wordpress.com
#include <PID_v1.h>
#include <PCD8544.h>
PCD8544 lcd;
unsigned long updaterate = 500; //Change how fast the display updates. No lower than 500
unsigned long lastupdate;
int temperature = 0;
//Define Variables we'll be connecting to
double Setpoint, Input, Output;
//Define the aggressive and conservative Tuning Parameters
double aggKp = 4, aggKi = 0.2, aggKd = 1;
double consKp = 1, consKi = 0.05, consKd = 0.25;
//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
void setup() {
lcd.begin(84, 48);
//We do not want to drive the soldering iron at 100% because it may burn, so we set it to about 85% (220/255)
myPID.SetOutputLimits(0, 220);
myPID.SetMode(AUTOMATIC);
lastupdate = millis();
Setpoint = 0;
}
void loop() {
lcd.clear();
//Read temperature
Input = analogRead(0);
//Transform the 10bit reading into degrees celsius
Input = map(Input, 0, 450, 25, 350);
//Display temperature
if (millis() - lastupdate > updaterate) {
lastupdate = millis();
temperature = Input;
}
//Read setpoint and transform it into degrees celsius(minimum 150, maximum 350)
double newSetpoint = analogRead(1);
newSetpoint = map(newSetpoint, 0, 1023, 150, 350);
//Display setpoint
if (abs(newSetpoint - Setpoint) > 3) {
Setpoint = newSetpoint;
//temperature = newSetpoint;
lastupdate = millis();
}
double gap = abs(Setpoint - Input); //distance away from setpoint
if (gap < 10) {
//we're close to setpoint, use conservative tuning parameters
myPID.SetTunings(consKp, consKi, consKd);
} else {
//we're far from setpoint, use aggressive tuning parameters
myPID.SetTunings(aggKp, aggKi, aggKd);
}
myPID.Compute();
//Drive the output
analogWrite(11, Output);
//Display the temperature
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);
}
-
2Please include the code into your question, so that it stands alone, even, when the pastbin link becomes invalidchrisl– chrisl2020年04月02日 16:59:42 +00:00Commented Apr 2, 2020 at 16:59
1 Answer 1
Look at line 55, where you are doing this
temperature = newSetpoint;
There is no reason to give temperature the same value as the set point. It does not make sense. And the temperature
variable is the same, that you are using to display.
So, while you are changing the setpoint, the temperatur
variable gets overwritten with the setpoint. When you are not changing it anymore, the measured temperature is still in this variable, when you are displaying it.
Just remove the mentioned line.