本帖最后由 打广告看考场 于 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); //取小数点后第二位
- }
|