您好,我想使用Arduino建造焊接站。焊台有效,但代码可能存在错误,显示器不会按预期更新。当我旋转锅时,显示器(7段3位)显示从罐中读取的值,但显示器不会更新,因为焊接铁是加热的。
请看看代码,然后告诉我你的想法。
请看看代码,然后告诉我你的想法。
焊接站:
#include #include int thermoDO = 12;int thermoCS = 10;int thermoCLK = 13;MAX6675热电偶(thermoCLK, thermoCS, thermoDO);//保护int relay_pin = A5;0-9字节const digits[] = {B00111111, B00000110, B01011011, B01001111, B01100110, B01101101, B01111101, B00000111, B01111111, B01101111};int digit_common_pins[] = {A2, A3, A4};//三段7段LED显示屏常用引脚int max_digits = 3;Int current_digit = max_digits - 1;Unsigned long update = 1000; //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; double heaterTemp; //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() { DDRD = B11111111; // sets Arduino pins 0 to 7 as outputs for (int y = 0; y < max_digits; y++) { pinMode(digit_common_pins[y], OUTPUT); } //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; pinMode(relay_pin, OUTPUT); digitalWrite(relay_pin, LOW); delay(1000); digitalWrite(relay_pin, HIGH); } void loop() { // Read temperature heaterTemp = thermocouple.readCelsius(); Input = (0.779828 * heaterTemp) - 10.3427; //Display temperature if (isnan(heaterTemp) or Input >= 432) // No TC Connection OR over-temperature { while (true) { digitalWrite(relay_pin, LOW); digitalWrite(11, LOW); PORTD = B00000000; } } 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, 400); //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 if (temperature < 50){ show(50); } else { show(temperature); } } void show(int value) { int digits_array[] = {}; boolean empty_most_significant = true; for (int z = max_digits - 1; z >= 0; z--) //Cycle through each digit { digits_array[z] = value / pow(10, z); //We now take each digit from the number if (digits_array[z] != 0 ) empty_most_significant = false; //Do not display leading zeros value = value - digits_array[z] * pow(10, z); if (z == current_digit) { if (!empty_most_significant || z == 0) { //Check to see that we do not have leading zeros and display the current digit PORTD = digits[digits_array[z]]; //Remove ~ for common cathode } else { PORTD = B00000000; } digitalWrite(digit_common_pins[z], HIGH);//Change to LOW for common cathode } else { digitalWrite(digit_common_pins[z], LOW);//Change to HIGH for common cathode } } current_digit--; if (current_digit < 0) { current_digit = max_digits; //Start over } }