极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16957|回复: 6

用温度传感器控制加热管,没反应,代码是不是对的?

[复制链接]
发表于 2016-5-12 10:38:51 | 显示全部楼层 |阅读模式
本帖最后由 hxkdtc123 于 2016-5-12 10:40 编辑

温度低于31度的时候,加热管不工作(也就是说继电器不跳),温度高于31的时候继电器也没反应,这代码有问题吗?

附上代码

int LM35 = 0 ;//温度传感器
int farepan = 8 ;//加热管引脚(其实是连接继电器的,用继电器控制加热管开合)
int val;//温度传感器电压值
int wendu;//转换成温度值

void setup()
{
Serial.begin(9600);
pinMode(farepan,OUTPUT);//发热管(继电器引脚)为输出模式
}

void loop()
{
  val = analogRead(LM35);//读取温度传感器的电压值
  wendu = (125*val)>>8 ; //转换成实际温度值
  delay(500);
  if(wendu < 31){int jiare();}//如果读取的温度小于31度则进入加热子函数
  Serial.print("Tep : ") ; //原样输出显示Tep字符串代表温度
  Serial.print(wendu) ; //输出显示dat的值
  Serial.println("C"); //原样输出显示C字符串
  delay(1000);
}

int jiare()//加热子函数
{
  digitalWrite(farepan,LOW);//继电器是低电平有效的,所以给LOW就相当于接通加热管
  delay(10000);//加热10秒钟
  val = analogRead(LM35);
  wendu = (125*val)>>8 ;//再次检测温度值
  delay(500);
  if(wendu < 31)
{
  int jiare();//如果温度还是低于31度则返回加热子函数重新加热10秒
}
else
{
  digitalWrite(farepan,HIGI);//如果已经加热到31度以上,关闭加热管,退出子函数,返回主函数
}
}
回复

使用道具 举报

发表于 2016-5-12 20:20:04 | 显示全部楼层
最好不要自己嵌套自己,会出问题的。
回复 支持 反对

使用道具 举报

发表于 2016-5-12 21:45:55 | 显示全部楼层
如果你要不定义0号针脚的pinMode的话,你必须指明为A0针脚才可以,你这么写可能会导致它去读取0针脚
回复 支持 反对

使用道具 举报

发表于 2016-5-12 21:51:03 | 显示全部楼层
而且自己嵌套自己也有运行风险,你可以

  1. void loop()
  2. {
  3.   val = analogRead(LM35);       //读取温度传感器的电压值
  4.   wendu = (125*val)>>8 ;      //转换成实际温度值
  5.   delay(500);
  6.   if(wendu < 31)
  7.   {
  8.        int jiare();                       //如果读取的温度小于31度则进入加热子函数
  9.        return;                           //返回if重新判断温度是否合规
  10.   }
  11.   Serial.print("Tep : ") ;         //原样输出显示Tep字符串代表温度
  12.   Serial.print(wendu) ;          //输出显示dat的值
  13.   Serial.println("C");             //原样输出显示C字符串
  14.   delay(1000);
  15. }

  16. int jiare()//加热子函数
  17. {
  18.   digitalWrite(farepan,LOW);      //继电器是低电平有效的,所以给LOW就相当于接通加热管
  19.   delay(10000);                         //加热10秒钟
  20.   val = analogRead(LM35);
  21.   wendu = (125*val)>>8 ;        //再次检测温度值
  22.   delay(500);
  23.   return wendu;
  24. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2016-5-12 21:53:18 | 显示全部楼层
还有一个问题,使用int类型的自定义函数需要返回值,使用return语句
回复 支持 反对

使用道具 举报

发表于 2016-5-12 23:33:27 | 显示全部楼层
if(wendu < 31){int jiare();}//如果读取的温度小于31度则进入加热子函数

){int jiare();}  这句话什么意思?   重新定义一个函数吗  去掉前面的 int
还有 根本不需要自己调用自己嵌套  只要在主程序中加判断即可  
得到读数后判断是否要加热,要加热就调用加热函数,不用就调用不加热函数即可
arduino 的程序是自己循环的 不需自己嵌套自己
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-5-14 11:49:30 | 显示全部楼层
ysq123001 发表于 2016-5-12 23:33
if(wendu < 31){int jiare();}//如果读取的温度小于31度则进入加热子函数

){int jiare();}  这句话什么 ...

去掉int已经可以了,但是这个加热程序我是单独用一个子函数去做的,因为后期还有别的子函数,所以不想吧loop里写的太庞杂,这个函数的意思是在loop检测到温度低于规定值,就跳转到子函数加热10秒,如果加热10秒后还没温度还没达到规定值,那就再重来进这个函数再加热一次,直到达到规定值为止,如果达到规定值了,那就退出这个函数,好像也能用while循环去做,不过对这个循环不是很熟悉,我菜鸟一个,所以只能用最笨的办法
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 02:48 , Processed in 0.035467 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表