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