你好,我想要建立一个使用Arduino焊接站。焊台的工作方式,但是代码可能有一个错误,显示不更新。当我转动锅,然后显示(7段3位数)显示的值读取从锅里,但没有更新显示为烙铁加热。
请查看代码和告诉我你的想法吗?
请查看代码和告诉我你的想法吗?
焊接站:
# include < PID_v2。h > # include < max6675。h > int thermoDO = 12;int thermoCS = 10;int thermoCLK = 13;MAX6675热电偶(thermoCLK thermoCS thermoDO);/ /保护int relay_pin = A5;/ /这个数组包含段需要打开显示数字0 - 9字节const位数[]= {B00111111、B00000110 B01011011, B01001111, B01100110, B01101101, B01111101, B00000111, B01111111, B01101111};int digit_common_pins [] = {A2、A3、A4};/ /普通针的三重7-Segment LED显示屏int max_digits = 3; int current_digit = max_digits - 1; unsigned long updaterate = 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 } }