极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4784|回复: 2

利用arduino、微型真空泵、BME280模拟高海拔气压,运行时会死机。求教!

[复制链接]
发表于 2017-6-27 14:09:57 | 显示全部楼层 |阅读模式
本帖最后由 fsi270308 于 2017-6-27 15:45 编辑

求助,运行时(电机工作时)发生死机,运行时间不定,可能半小时,也可能几分钟,程序中加了看门狗,但是问题照旧,复位后几分钟就卡死。

单甩开电机,其它操作都是OK的;

单甩开OLED,电机工作也是正常的,也没有卡死;

arduino和电机为分开供电。

本人编程白痴,程序都是东拼西凑的,怀疑问题出在程序上,请大神不吝赐教!

已解决:
原来是OLED连接线问题,排线时候使用了一根U槽传感器的四芯线,较细,而且有1米左右,线路绕在开关电源附近;
更换了一根较粗的半米长四芯线,远离开关电源,问题解除,看门狗也不需要了。:P

用到的硬件如下:
        Mega2560
        BMP280模块  接线方式:I2C
        OLED模块  接线方式:I2C
        旋转编码器模块
        12V光耦隔离继电器模块  低触发
        微型真空泵2只
        12V开关电源

库文件在附件。

程序如下:

  1. #include <SPI.h>
  2. #include <Wire.h>
  3. #include <Adafruit_Sensor.h>  //气压传感器库
  4. #include <Adafruit_BME280.h>  //气压传感器库
  5. //#include <Adafruit_GFX.h>
  6. //#include <Adafruit_SSD1306.h>

  7. //----------------------大气压传感器本地海平面设置--------------------------------------
  8. #define SEALEVELPRESSURE_HPA (seaLevelPressure)  //当地当天海平面大气压

  9. //----------------------大气压传感器接线方式定义-------------------------------------------------
  10. Adafruit_BME280 bme; // I2C

  11. //----------------------OLED屏设置------------------------------------
  12. /*#define OLED_RESET 4
  13. Adafruit_SSD1306 display(OLED_RESET);

  14. #define NUMFLAKES 10
  15. #define XPOS 0
  16. #define YPOS 1
  17. #define DELTAY 2

  18. #if (SSD1306_LCDHEIGHT != 64)
  19. #error("Height incorrect, please fix Adafruit_SSD1306.h!");
  20. #endif */

  21. int pump1 = 6;
  22. int pump2 = 7;

  23. int seaLevelPressure = 1006;
  24. int siAltitude = 20;
  25. float siAltitudeHm = 1;


  26. void setup() {
  27.   //-----------气压传感器启动----------------------------------
  28.   bme.begin();
  29.   pumpInit();
  30.   Serial.begin(9600);
  31.   //display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  32.   //display.display();
  33.   //display.clearDisplay();
  34.   
  35. }

  36. void loop() {
  37. //----------------bme读取温湿度-----------------------------------------------------
  38.   bme.readTemperature();   //必须读取这些值才能计算出准确的大气压
  39.   bme.readHumidity();    //必须读取这些值才能计算出准确的大气压
  40. // displayHomeScreen();

  41.     siAltitudeHm = siAltitude * 100;   //显示为百米
  42.     float a = bme.readAltitude(SEALEVELPRESSURE_HPA);
  43.   
  44. //----------------bme读取温湿度-----------------------------------------------------
  45.   bme.readTemperature();   //必须读取这些值才能计算出准确的大气压
  46.   bme.readHumidity();    //必须读取这些值才能计算出准确的大气压
  47. if(a <= siAltitudeHm)
  48.     {
  49.       if(a < siAltitudeHm - 50)
  50.       {
  51.       pump1Start();
  52.       pump2Start();
  53.       }
  54.       else if(a >= siAltitudeHm - 50 && a < siAltitudeHm - 5)
  55.       {
  56.       pump1Stop();
  57.       pump2Start();
  58.       }
  59.     }
  60.    
  61.     else if(a >= siAltitudeHm + 5)
  62.     {
  63.       turnPumpOff();
  64.     }
  65.    
  66. Serial.println(bme.readAltitude(SEALEVELPRESSURE_HPA),0);
  67.   delay(200);

  68. }

  69. void pumpInit()
  70. {
  71.   pinMode(pump1, OUTPUT);
  72.   pinMode(pump2, OUTPUT);
  73.   digitalWrite(pump1, HIGH);
  74.   digitalWrite(pump2, HIGH);
  75. }

  76. void pump1Start()
  77. {
  78.   digitalWrite(pump1, LOW);
  79. }

  80. void pump2Start()
  81. {
  82.   digitalWrite(pump2, LOW);
  83. }

  84. void pump1Stop()
  85. {
  86.   digitalWrite(pump1, HIGH);
  87. }

  88. void pump2Stop()
  89. {
  90.   digitalWrite(pump2, HIGH);
  91. }

  92. void turnPumpOn()
  93.   {

  94.     if(bme.readAltitude(SEALEVELPRESSURE_HPA),0 < siAltitudeHm-100)
  95.     {
  96.       pump1Start();
  97.       pump2Start();
  98.     }
  99.     else if(bme.readAltitude(SEALEVELPRESSURE_HPA),0 > siAltitudeHm-100)
  100.     {
  101.       pump1Stop();
  102.       pump2Start();
  103.     }
  104.     else if(bme.readAltitude(SEALEVELPRESSURE_HPA),0 < 0)
  105.     {
  106.       turnPumpOff();
  107.     }
  108.     else if(bme.readAltitude(SEALEVELPRESSURE_HPA),0 > 4000)
  109.     {
  110.       turnPumpOff();
  111.     }
  112.     else
  113.     {
  114.       turnPumpOff();
  115.     }
  116.   }

  117.       void turnPumpOff()
  118.   {
  119.     pump1Stop();
  120.     pump2Stop();
  121.   }
  122. //---------------------主界面-------------------------------------------
  123. /*void displayHomeScreen()
  124. {
  125.     display.setTextSize(1);
  126.     display.clearDisplay();
  127.     display.setTextColor(WHITE);
  128.     display.setCursor(0, 0);
  129.     display.print("JZ-APSD");
  130.     display.drawFastHLine(0,10,128,WHITE);
  131.     display.setCursor(5, 15);
  132.     display.print("Altitude");
  133.     display.setCursor(5+12, 25);
  134.     display.print("(m)");
  135.     display.setTextSize(2);
  136.     display.setCursor(5, 35);
  137.     display.print(bme.readAltitude(SEALEVELPRESSURE_HPA), 0);
  138.    
  139.     display.setTextSize(1);
  140.     display.setCursor(65, 15);
  141.     display.print("Pressure");
  142.     display.setCursor(65+12, 25);
  143.     display.print("(hpa)");
  144.     display.setTextSize(2);
  145.     display.setCursor(65, 35);
  146.     display.print(bme.readPressure() / 100.0F, 0);

  147.     display.display();
  148. }*/
复制代码

libraries.rar

318.77 KB, 下载次数: 25

回复

使用道具 举报

发表于 2020-3-26 22:55:26 | 显示全部楼层
感谢楼主分享,学习了。
回复 支持 反对

使用道具 举报

发表于 2020-3-27 11:03:54 | 显示全部楼层
IIC (I2C) 不能太遠,電路建議 30CM 內,10CM 以上要另加電容。30cm 以上建議用 SPI, 1米以上建議用 UART。如接線要用敝屏線,另加電容。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-7-9 11:04 , Processed in 0.049026 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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