利用arduino、微型真空泵、BME280模拟高海拔气压,运行时会死机。求教!
本帖最后由 fsi270308 于 2017-6-27 15:45 编辑求助,运行时(电机工作时)发生死机,运行时间不定,可能半小时,也可能几分钟,程序中加了看门狗,但是问题照旧,复位后几分钟就卡死。
单甩开电机,其它操作都是OK的;
单甩开OLED,电机工作也是正常的,也没有卡死;
arduino和电机为分开供电。
本人编程白痴,程序都是东拼西凑的,怀疑问题出在程序上,请大神不吝赐教!
已解决:
原来是OLED连接线问题,排线时候使用了一根U槽传感器的四芯线,较细,而且有1米左右,线路绕在开关电源附近;
更换了一根较粗的半米长四芯线,远离开关电源,问题解除,看门狗也不需要了。:P
用到的硬件如下:
Mega2560
BMP280模块接线方式:I2C
OLED模块接线方式:I2C
旋转编码器模块
12V光耦隔离继电器模块低触发
微型真空泵2只
12V开关电源
库文件在附件。
程序如下:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>//气压传感器库
#include <Adafruit_BME280.h>//气压传感器库
//#include <Adafruit_GFX.h>
//#include <Adafruit_SSD1306.h>
//----------------------大气压传感器本地海平面设置--------------------------------------
#define SEALEVELPRESSURE_HPA (seaLevelPressure)//当地当天海平面大气压
//----------------------大气压传感器接线方式定义-------------------------------------------------
Adafruit_BME280 bme; // I2C
//----------------------OLED屏设置------------------------------------
/*#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif */
int pump1 = 6;
int pump2 = 7;
int seaLevelPressure = 1006;
int siAltitude = 20;
float siAltitudeHm = 1;
void setup() {
//-----------气压传感器启动----------------------------------
bme.begin();
pumpInit();
Serial.begin(9600);
//display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//display.display();
//display.clearDisplay();
}
void loop() {
//----------------bme读取温湿度-----------------------------------------------------
bme.readTemperature(); //必须读取这些值才能计算出准确的大气压
bme.readHumidity(); //必须读取这些值才能计算出准确的大气压
// displayHomeScreen();
siAltitudeHm = siAltitude * 100; //显示为百米
float a = bme.readAltitude(SEALEVELPRESSURE_HPA);
//----------------bme读取温湿度-----------------------------------------------------
bme.readTemperature(); //必须读取这些值才能计算出准确的大气压
bme.readHumidity(); //必须读取这些值才能计算出准确的大气压
if(a <= siAltitudeHm)
{
if(a < siAltitudeHm - 50)
{
pump1Start();
pump2Start();
}
else if(a >= siAltitudeHm - 50 && a < siAltitudeHm - 5)
{
pump1Stop();
pump2Start();
}
}
else if(a >= siAltitudeHm + 5)
{
turnPumpOff();
}
Serial.println(bme.readAltitude(SEALEVELPRESSURE_HPA),0);
delay(200);
}
void pumpInit()
{
pinMode(pump1, OUTPUT);
pinMode(pump2, OUTPUT);
digitalWrite(pump1, HIGH);
digitalWrite(pump2, HIGH);
}
void pump1Start()
{
digitalWrite(pump1, LOW);
}
void pump2Start()
{
digitalWrite(pump2, LOW);
}
void pump1Stop()
{
digitalWrite(pump1, HIGH);
}
void pump2Stop()
{
digitalWrite(pump2, HIGH);
}
void turnPumpOn()
{
if(bme.readAltitude(SEALEVELPRESSURE_HPA),0 < siAltitudeHm-100)
{
pump1Start();
pump2Start();
}
else if(bme.readAltitude(SEALEVELPRESSURE_HPA),0 > siAltitudeHm-100)
{
pump1Stop();
pump2Start();
}
else if(bme.readAltitude(SEALEVELPRESSURE_HPA),0 < 0)
{
turnPumpOff();
}
else if(bme.readAltitude(SEALEVELPRESSURE_HPA),0 > 4000)
{
turnPumpOff();
}
else
{
turnPumpOff();
}
}
void turnPumpOff()
{
pump1Stop();
pump2Stop();
}
//---------------------主界面-------------------------------------------
/*void displayHomeScreen()
{
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("JZ-APSD");
display.drawFastHLine(0,10,128,WHITE);
display.setCursor(5, 15);
display.print("Altitude");
display.setCursor(5+12, 25);
display.print("(m)");
display.setTextSize(2);
display.setCursor(5, 35);
display.print(bme.readAltitude(SEALEVELPRESSURE_HPA), 0);
display.setTextSize(1);
display.setCursor(65, 15);
display.print("Pressure");
display.setCursor(65+12, 25);
display.print("(hpa)");
display.setTextSize(2);
display.setCursor(65, 35);
display.print(bme.readPressure() / 100.0F, 0);
display.display();
}*/
感谢楼主分享,学习了。 IIC (I2C) 不能太遠,電路建議 30CM 內,10CM 以上要另加電容。30cm 以上建議用 SPI, 1米以上建議用 UART。如接線要用敝屏線,另加電容。
页:
[1]