本帖最后由 打广告看考场 于 2020-2-7 17:00 编辑
想用DS18B20,uno板,LCD1602,ULN2003,直流电机做一个温控风扇,测试的时候发现如果不接直流电机,用手触摸18B20,在串口和LCD上显示的温度值都是连续变化的;但是如果接上电机,再用手触摸18B20,刚开始串口和LCD都显示正常,随着温度升高,串口上瞬间显示84℃。请问各位大佬怎么解决呢?下面是正常和异常的温度曲线及程序:
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#define GREEN_LED 5
#define YELLOW_LED 6
#define RED_LED 7
#define ULN2003 3
#define ONE_WIRE_BUS 4 //1-wire数据总线连接在IO4
OneWire oneWire(ONE_WIRE_BUS); //创建对象
DallasTemperature sensors(&oneWire); //创建对象
LiquidCrystal lcd(13,12,11,10,9,8); //必须按RS,E,D4,D5,D6,D7顺序显示
float tempMin = 18;
float tempMax = 25;
int fanSpeed;
void setup()
{
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(ULN2003, OUTPUT); //不要忘记
sensors.begin(); //初始化ds18b20总线
Serial.begin(115200);// 设置串口波特率
lcd_init();
}
void loop()
{
float temp = get_temperature(); //获取温度
control_motor(temp); //控制电机
lcd_main(temp); //显示温度
Serial.println(temp);
}
void lcd_init()
{
lcd.begin(16,2); //设置LCD显示的数目。16 X 2:16列2行。
lcd.print("Welcome to use!");
delay(1000);
lcd.clear();
}
void lcd_main(float temp)
{
lcd.setCursor(0,0); //设置LCD开始位置
lcd.print("TEMP(");
lcd.print(char(223)); //o符号
lcd.print("C) :");
lcd.setCursor(10,0);
display_temperature(temp);
}
void control_motor(float temp)
{
if (temp < tempMin)
{
fanSpeed = 0;
digitalWrite(ULN2003, fanSpeed);
// digitalWrite(YELLOW_LED, HIGH);
// digitalWrite(GREEN_LED, LOW);
// digitalWrite(RED_LED, LOW);
}
else if ((temp >= tempMin) && (temp < tempMax))
{
fanSpeed = map(temp, tempMin, tempMax, 60, 170);
analogWrite(ULN2003, fanSpeed);
// digitalWrite(YELLOW_LED, LOW);
// digitalWrite(GREEN_LED, HIGH);
// digitalWrite(RED_LED, LOW);
}
else if (temp >= tempMax)
{
fanSpeed = map(temp, tempMax, tempMax+5, 170, 255);
analogWrite(ULN2003, fanSpeed);
// digitalWrite(YELLOW_LED, LOW);
// digitalWrite(GREEN_LED, LOW);
// digitalWrite(RED_LED, HIGH);
}
}
float get_temperature()
{
sensors.requestTemperatures(); //向总线上所有设备发送温度转换请求,默认情况下该方**阻塞
float temp = sensors.getTempCByIndex(0); //获取索引号0的传感器摄氏温度数据
delay(500); //温度检测间隔
if (temp != DEVICE_DISCONNECTED_C) //如果设备连接正常
{
return temp;
}
}
void display_temperature(float temp)
{
lcd.print(int(temp)); //tempC=23.52-->> 23
lcd.print(".");
lcd.print(int(temp * 10) % 10); //tempC=23.52-->> 235.2-->>235-->>5
lcd.print(int(temp * 100) % 10); //取小数点后第二位
}
|