打印
[UNO]

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

[复制链接]
791|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 打广告看考场 于 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); //取小数点后第二位
  }


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝