搜索
bottom↓
回复: 9

arduino 多个变量后会边卡 求帮助

[复制链接]

出0入0汤圆

发表于 2018-2-19 09:23:52 | 显示全部楼层 |阅读模式
这个有两个infrared sensor,一个LM35DT,一个servo,一个LCD,一个GROVE temperature sensor

作用:
利用2个infrared sensor来控制servo的不同转向
lm35DT是用来检测水温度
GROVE是用来检测环境温度
LCD显示35和GROVE的温度度数

问题:
lm35DT在LCD显示的温度一直在10多和30多之间跳,正常温度显示是20度左右

已用失败方案:
1.components用额外电源供电
lm35差点烧了。。很烫
servo转的比平时还快,然后就失灵了

2.用中断
尝试用中断来减少arduino的工作量,但是还是没什么用


求大神给个解决方案,感激不尽,再不行只有用2个arduino分开搞了。。。

以下是我的代码
通熟易懂的

#include <Wire.h>
#define PIR_MOTION_SENSOR2 2         //Use pin 2 to receive the signal from the module
#define PIR_MOTION_SENSOR3 3
#include <Servo.h>
Servo myservo;
#include <math.h>
const int A = 4275;                // B value of the termistor
const int R0 = 100000;             // R0 = 100K
const int pinTempSensor1 = A0;     // Grove - Temperature Sensor connect to A0
#include "rgb_lcd.h"
rgb_lcd lcd;
const int colorR = 100;             //define LCD screen color
const int colorG = 100;
const int colorB = 100;                  
int pos = 0;                     //define servo intialization of angle
int tempPin = 1;
void setup()
{
lcd.begin(16, 2);                     // define screen row and column
lcd.setRGB(colorR, colorG, colorB);   //define LCD color
delay(100);
Serial.begin(9600);
pinsInit();
myservo.attach(9);              // attaches the servo on pin 9 to the servo object
}
void loop()
{
{
if(isPeopleDetected2())         //if it detects the moving people?
{
  turnonlcd();                   //lcd and servo turn on
}
}
{
  if(isPeopleDetected3())

{
  turnofflcd();
}
}
waterTemp();
}
void pinsInit()                //define PIR sensor input
{
pinMode(PIR_MOTION_SENSOR2, INPUT);
pinMode(PIR_MOTION_SENSOR3, INPUT);
}
void turnonlcd()                           //**lcd and servo turn on function
{
pos = 0;
myservo.write(pos);
int a = analogRead(pinTempSensor1);
float Rs1 = 1023.0/a-1.0;
Rs1 = R0*Rs1;
float temp1 = 1.0/(log(Rs1/R0)/A+1/298.15)-273.15;       // convert to temperature via datasheet
lcd.setCursor(11,0);
lcd.print("P:OUT");                             // show first row imformation
lcd.setCursor(0,1);
lcd.print("ET=");
lcd.print(temp1);                               // show second row temp
delay(10);
}
void turnofflcd()                          // **lcd and servo turn off function
{
pos = 179;
myservo.write(pos);
int a = analogRead(pinTempSensor1);
float Rs1 = 1023.0/a-1.0;
Rs1 = R0*Rs1;
float temp1 = 1.0/(log(Rs1/R0)/A+1/298.15)-273.15;       // convert to temperature via datasheet
lcd.setCursor(11,0);
lcd.print("P:IN ");                            // show first row imformation
lcd.setCursor(0,1);
lcd.print("ET=");
lcd.print(temp1);                                            // show second row temp
delay(10);

}
void waterTemp()
{
  int temp;
  int tempC = analogRead(tempPin);
  temp = tempC * 0.48828125;
  lcd.setCursor(0, 0);
  lcd.print("WT=");
  lcd.print(temp);
  delay(100);
}

boolean isPeopleDetected2()             // **Return-boolean funtion:Detect whether people moves in it's detecting range
{
int sensor2Value = digitalRead(PIR_MOTION_SENSOR2);
int sensor3Value = digitalRead(PIR_MOTION_SENSOR3);
if(sensor2Value == HIGH&&sensor3Value == LOW)  //if the sensor value is HIGH?
{
return 1;                     
}
else
{
return 0;
}
}

boolean isPeopleDetected3()
{
int sensor2Value = digitalRead(PIR_MOTION_SENSOR2);
int sensor3Value = digitalRead(PIR_MOTION_SENSOR3);
if(sensor3Value == HIGH&&sensor2Value == LOW)
{
return 1;
}
else
{
return 0;
}
}

出200入2554汤圆

发表于 2018-2-19 16:50:45 | 显示全部楼层
本帖最后由 t3486784401 于 2018-2-19 16:52 编辑

这么多 float 还有 log 函数,当 AVR 是神仙啊。

单说语法只会用 int 么,这一句有没有试试 sizeof(int)==2......
  1. const int R0 = 100000;             // R0 = 100K
复制代码


这么点任务 AVR 是可以完成的,但这个代码的优化程度,估计算错了都不知道

简单一试便知上边的毛病:
  1. void setup()
  2. {
  3.         // put your setup code here, to run once:
  4.         Serial.begin(9600);
  5.         Serial.println(sizeof(int));
  6. }
复制代码


出0入0汤圆

 楼主| 发表于 2018-2-21 19:39:34 | 显示全部楼层
本帖最后由 .Alan. 于 2018-2-21 19:41 编辑

。。。。

出0入0汤圆

 楼主| 发表于 2018-2-21 19:42:11 | 显示全部楼层
t3486784401 发表于 2018-2-19 16:50
这么多 float 还有 log 函数,当 AVR 是神仙啊。

单说语法只会用 int 么,这一句有没有试试 sizeof(int)== ...

只有2bype和4.。。。

出0入0汤圆

 楼主| 发表于 2018-2-21 20:45:33 | 显示全部楼层
t3486784401 发表于 2018-2-19 16:50
这么多 float 还有 log 函数,当 AVR 是神仙啊。

单说语法只会用 int 么,这一句有没有试试 sizeof(int)== ...

我觉得是我用太多除法运算导致运行变慢

和float  Log关系不太大

出0入0汤圆

发表于 2018-2-22 00:25:08 来自手机 | 显示全部楼层
换成stm32的

出0入0汤圆

 楼主| 发表于 2018-2-22 08:50:08 | 显示全部楼层

能换我早换啦,还不如上Pi更好

出0入0汤圆

 楼主| 发表于 2018-2-22 09:28:38 | 显示全部楼层
这个失败的原因是觉得应该是LM358和LM35dt两个互不相容

我用2个一样的LM358就可以正常工作,所以我觉得和float  log没什么太大关系

出200入2554汤圆

发表于 2018-2-22 14:24:52 | 显示全部楼层
.Alan. 发表于 2018-2-21 19:42
只有2bype和4.。。。

R0已经溢出,其他的自己找吧

出200入2554汤圆

发表于 2018-2-22 14:46:02 | 显示全部楼层
本帖最后由 t3486784401 于 2018-2-22 14:48 编辑
.Alan. 发表于 2018-2-21 20:45
我觉得是我用太多除法运算导致运行变慢

和float  Log关系不太大


我用 ICCAVR+AvrStudio 测试了下运算性能(标于每行注释),你可以大致看下:

  1. #include "math.h"

  2. void main(void)
  3. {
  4.     char  v8;
  5.     short v16;
  6.     long  v32;
  7.     float vfl;
  8.    
  9.     v8= 1;          // 2T
  10.     v8= v8+v8;      // 1T
  11.     v8= v8*5;       // 5T/43T
  12.     v8= v8/3;       // 173T
  13.    
  14.     v16= 10000;     // 3T
  15.     v16= v16+v16;   // 2T
  16.     v16= v16*5;     // 37T/62T
  17.     v16= v16/3;     // 247T
  18.    
  19.     v32= 100000000; // 12T
  20.     v32= v32+v32;   // 22T
  21.     v32= v32*5;     // 179T/211T
  22.     v32= v32/3;     // 928T
  23.    
  24.     vfl= 3.14159;   // 54T
  25.     vfl= vfl+vfl;   // 348T
  26.     vfl= vfl*5.0;   // 390T/682T
  27.     vfl= vfl/3.0;   // 1025T
  28.     vfl= log(vfl);  // 8973T
  29.    
  30.     while(1);
  31. }
复制代码


注释标的是测得的机器周期数,对于 16M 主频的 Arduino 而言,1600T=1ms.
标注两个周期的,后一个是禁用了硬件乘法器的编译结果。

想减轻负担,还是得从减少浮点、MATH库着手。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 21:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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