|
本帖最后由 sadfun 于 2025-8-1 17:21 编辑
Arduino C语言 PID恒温 通过18B20温度传感器,感应加热片的温度,控制MOS管 0~255的PWM
目前PID运行很好,我很满意,但是我想要用一个按钮调整温度,按下按钮没有反应,按钮接在11引脚和12引脚
代码如下:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PinChangeInterrupt.h>
LiquidCrystal_I2C mylcd(0x27,16,2);
volatile double kd;
volatile double ki;
volatile double kp;
volatile int setpint;
volatile long sumerror;
volatile long lasterror;
volatile int input;
volatile int output;
volatile long newerror;
volatile float t;
volatile int p;
OneWire oneWire_9(9);
DallasTemperature sensors_9(&oneWire_9);
DeviceAddress insideThermometer;
float ds18b20_9_getTemp(int w) {
sensors_9.requestTemperatures();
if(w==0) {
return sensors_9.getTempC(insideThermometer);
}
else {
return sensors_9.getTempF(insideThermometer);
}
}
void attachPinInterrupt_fun_CHANGE_11() {
setpint++;
}
//按下按钮,设置温度加1,就是这里的代码不生效
void attachPinInterrupt_fun_FALLING_12() {
setpint = setpint - 1;
}
//按下按钮,设置温度减1,就是这里的代码不生效
void setup(){
mylcd.init();
mylcd.backlight();
kd = 0.12;
ki = 0.2;
kp = 0.5;
setpint = 40; //这个是当前设置的温度
sumerror = 0;
lasterror = 0;
input = 10;
output = 0;
newerror = 0;
t = 0;
p = 0;
mylcd.setCursor(1-1, 1-1);
mylcd.print("T");
mylcd.setCursor(2-1, 1-1);
mylcd.print(":");
mylcd.setCursor(8-1, 1-1);
mylcd.print("C");
mylcd.setCursor(1-1, 2-1);
mylcd.print("SET");
mylcd.setCursor(4-1, 2-1);
mylcd.print(":");
mylcd.setCursor(5-1, 2-1);
mylcd.print(setpint);
mylcd.setCursor(9-1, 2-1);
mylcd.print("PWM");
mylcd.setCursor(12-1, 2-1);
mylcd.print(":");
sensors_9.getAddress(insideThermometer, 0);
sensors_9.setResolution(insideThermometer, 9);
pinMode(6, OUTPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
}
void loop(){
mylcd.setCursor(13-1, 2-1);
mylcd.print(p);
mylcd.setCursor(3-1, 1-1);
mylcd.print(ds18b20_9_getTemp(0));
t = ds18b20_9_getTemp(0); //读取18B20温度传感器的值,并且赋值给 变量 t
newerror = setpint - t;
sumerror = sumerror + newerror;
output = (kp * newerror + ki * sumerror) + kd * (lasterror - newerror);
lasterror = newerror;
p = output;
if (p >= 255) {
p = 255;
}
if (p <= 0) {
p = 0;
}
analogWrite(6, p); //接MOS管 接6号引脚
attachPCINT(digitalPinToPCINT(11),attachPinInterrupt_fun_CHANGE_11,CHANGE);//按下按钮,设置温度加1,就是这里的代码不生效
attachPCINT(digitalPinToPCINT(12),attachPinInterrupt_fun_FALLING_12,FALLING);//按下按钮,设置温度减1,就是这里的代码不生效
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|