[UNO] 温控风扇中电机对温度显示的干扰

[复制链接]
 楼主| 打广告看考场 发表于 2020-2-7 16:56 | 显示全部楼层 |阅读模式
本帖最后由 打广告看考场 于 2020-2-7 17:00 编辑

想用DS18B20,uno板,LCD1602,ULN2003,直流电机做一个温控风扇,测试的时候发现如果不接直流电机,用手触摸18B20,在串口和LCD上显示的温度值都是连续变化的;但是如果接上电机,再用手触摸18B20,刚开始串口和LCD都显示正常,随着温度升高,串口上瞬间显示84℃。请问各位大佬怎么解决呢?下面是正常和异常的温度曲线及程序:
Snipaste_2020-02-06_22-24-06.png    Snipaste_2020-02-06_22-47-50.png
  1. #include <DallasTemperature.h>
  2. #include <LiquidCrystal.h>

  3. #define GREEN_LED 5
  4. #define YELLOW_LED 6
  5. #define RED_LED 7
  6. #define ULN2003 3
  7. #define ONE_WIRE_BUS 4             //1-wire数据总线连接在IO4
  8. OneWire oneWire(ONE_WIRE_BUS);       //创建对象
  9. DallasTemperature sensors(&oneWire); //创建对象
  10. LiquidCrystal lcd(13,12,11,10,9,8);  //必须按RS,E,D4,D5,D6,D7顺序显示

  11. float tempMin = 18;
  12. float tempMax = 25;
  13. int fanSpeed;

  14. void setup()                                                                                    
  15. {
  16.   pinMode(GREEN_LED, OUTPUT);
  17.   pinMode(YELLOW_LED, OUTPUT);
  18.   pinMode(RED_LED, OUTPUT);
  19.   pinMode(ULN2003, OUTPUT); //不要忘记
  20.   sensors.begin(); //初始化ds18b20总线
  21.   Serial.begin(115200);// 设置串口波特率
  22.   lcd_init();
  23. }

  24. void loop()
  25. {
  26.   float temp = get_temperature(); //获取温度
  27.   control_motor(temp); //控制电机
  28.   lcd_main(temp); //显示温度
  29.   Serial.println(temp);
  30. }

  31. void lcd_init()
  32.   {
  33.     lcd.begin(16,2); //设置LCD显示的数目。16 X 2:16列2行。
  34.     lcd.print("Welcome to use!");
  35.     delay(1000);
  36.     lcd.clear();
  37.   }

  38. void lcd_main(float temp)
  39.   {
  40.     lcd.setCursor(0,0); //设置LCD开始位置
  41.     lcd.print("TEMP(");
  42.     lcd.print(char(223)); //o符号
  43.     lcd.print("C) :");
  44.     lcd.setCursor(10,0);
  45.     display_temperature(temp);
  46.   }

  47. void control_motor(float temp)
  48.   {
  49.     if (temp < tempMin)
  50.       {
  51.         fanSpeed = 0;
  52.         digitalWrite(ULN2003, fanSpeed);
  53. //        digitalWrite(YELLOW_LED, HIGH);
  54. //        digitalWrite(GREEN_LED, LOW);
  55. //        digitalWrite(RED_LED, LOW);
  56.       }
  57.     else if ((temp >= tempMin) && (temp < tempMax))
  58.       {
  59.         fanSpeed = map(temp, tempMin, tempMax, 60, 170);
  60.         analogWrite(ULN2003, fanSpeed);
  61. //        digitalWrite(YELLOW_LED, LOW);
  62. //        digitalWrite(GREEN_LED, HIGH);
  63. //        digitalWrite(RED_LED, LOW);
  64.       }
  65.     else if (temp >= tempMax)
  66.       {
  67.         fanSpeed = map(temp, tempMax, tempMax+5, 170, 255);
  68.         analogWrite(ULN2003, fanSpeed);
  69. //        digitalWrite(YELLOW_LED, LOW);
  70. //        digitalWrite(GREEN_LED, LOW);
  71. //        digitalWrite(RED_LED, HIGH);
  72.       }
  73.   }

  74. float get_temperature()
  75.   {
  76.     sensors.requestTemperatures(); //向总线上所有设备发送温度转换请求,默认情况下该方**阻塞
  77.     float temp = sensors.getTempCByIndex(0); //获取索引号0的传感器摄氏温度数据
  78.     delay(500); //温度检测间隔
  79.     if (temp != DEVICE_DISCONNECTED_C) //如果设备连接正常
  80.     {
  81.       return temp;
  82.     }
  83.   }

  84. void display_temperature(float temp)
  85.   {
  86.     lcd.print(int(temp)); //tempC=23.52-->> 23
  87.     lcd.print(".");
  88.     lcd.print(int(temp * 10) % 10); //tempC=23.52-->> 235.2-->>235-->>5
  89.     lcd.print(int(temp * 100) % 10); //取小数点后第二位
  90.   }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部