0

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);
}
dda
1,5951 gold badge12 silver badges17 bronze badges
asked Apr 2, 2020 at 16:36
1
  • 2
    Please include the code into your question, so that it stands alone, even, when the pastbin link becomes invalid Commented Apr 2, 2020 at 16:59

1 Answer 1

2

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.

answered Apr 2, 2020 at 17:03
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.