fsi270308 发表于 2017-6-27 14:09:57

利用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();
}*/

碌碌无为 发表于 2020-3-26 22:55:26

感谢楼主分享,学习了。

allen727hk 发表于 2020-3-27 11:03:54

IIC (I2C) 不能太遠,電路建議 30CM 內,10CM 以上要另加電容。30cm 以上建議用 SPI, 1米以上建議用 UART。如接線要用敝屏線,另加電容。
页: [1]
查看完整版本: 利用arduino、微型真空泵、BME280模拟高海拔气压,运行时会死机。求教!