消失的龙猫 2020-02-07 17:43 采纳率: 0%
浏览 356

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

想用DS18B20,arduino uno板,LCD1602,ULN2003,普通直流电机做一个温控风扇,测试的时候发现如果不接电机,用手触摸18B20,在串口和LCD上显示的温度值都是连续变化的;但是如果接上电机,再用手触摸18B20,刚开始串口和LCD都显示正常,随着温度升高,串口上瞬间显示84℃,LCD直接不显示数值。请问各位大佬怎么解决呢?下面是正常和异常的温度曲线及程序:
图片说明
图片说明

#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条回答 默认 最新

  • weixin_46269382 2020-02-07 19:23
    关注

    如果是变频电机的话是有可能会影响的,建议缩短连接线,或者对占空比进行更改,电源加强EMI措施

    评论

报告相同问题?

悬赏问题

  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误