341_Arduino+python分析天气变化导致颈椎病发的原因

    最近两年加班有点多,一直加到了老孙严重。现在身体三天两头报警,时常变天的时候就会肩膀、脖子、脑袋疼,还伴随着一只眼睛发胀流泪。或许,这是传说中的职业病?看起来,以后的身体还是得好好注意。

    对于天气的敏感一直以来是我想弄清楚的地方,到底是什么因素还是综合的因素导致了我的身体不适?正好看到了博世BME280的一个传感器,能够采集温度、湿度、气压以及近似的高度。高度或许我还不需要,其他的几个很可能就是我需要分析的因素。

   

    上面就是我用的简单的测试平台,上面是淘宝买的一个Arduino的以太网板盾,下面是一个Arduino。其实,我用这个板盾的目的不是使用以太网,而是这个板盾方便安装TF卡,可以方便我使用文件系统记录数据。传感器一共四根线,其中2根是供电,另外两根是IIC通信。

    Arduino本身有很多可以直接用的库,正好就有这个传感器的库文件,还有文件系统。基于简单的例程,直接设计代码如下:

/***************************************************************************
  This is a library for the BME280 humidity, temperature & pressure sensor

  Designed specifically to work with the Adafruit BME280 Breakout
  ----> http://www.adafruit.com/products/2650

  These sensors use I2C or SPI to communicate, 2 or 4 pins are required
  to interface. The device's I2C address is either 0x76 or 0x77.

  Adafruit invests time and resources providing this open source code,
  please support Adafruit andopen-source hardware by purchasing products
  from Adafruit!

  Written by Limor Fried & Kevin Townsend for Adafruit Industries.
  BSD license, all text above must be included in any redistribution
  See the LICENSE file for details.
***************************************************************************/
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>
#include <SD.h>
#include <SPI.h>
#include <Wire.h>

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C
// Adafruit_BME280 bme(BME_CS); // hardware SPI
// Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

// for SD card
const int chipSelect = 4;
unsigned long delayTime;

void setup()
{
    /* Serial.begin(9600); */
    /* Serial.println("Initializing SD card..."); */
    /* see if the card is present and can be initialized: */
    if (!SD.begin(chipSelect))
    {
        /* Serial.println("Card failed, or not present"); */
        /* // don't do anything more: */
        /* while (1) */
        /*     ; */
    }
    /* Serial.println("card initialized."); */
    /* Serial.println(F("BME280 test")); */

    if (!bme.begin(0x76, &Wire))
    {
        /* Serial.println("Could not find a valid BME280 sensor, check wiring!"); */
        /* while (1) */
        /*     ; */
    }

    /* Serial.println("-- Default Test --"); */
    /* Serial.println("normal mode, 16x oversampling for all, filter off,"); */
    /* Serial.println("0.5ms standby period"); */
    delayTime = 5000;

    /* Serial.println(); */
}

void loop()
{
    // Only needed in forced mode! In normal mode, you can remove the next line.
    bme.takeForcedMeasurement(); // has no effect in normal mode

    printValues();
    delay(delayTime);
}

void printValues()
{
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    // if the file is available, write to it:
    if (dataFile)
    {
        /* dataFile.println(dataString); */
        dataFile.print("Temperature = ");
        dataFile.print(bme.readTemperature());
        dataFile.println(" *C");
        dataFile.print("Pressure = ");
        dataFile.print(bme.readPressure() / 100.0F);
        dataFile.println(" hPa");
        dataFile.print("Approx. Altitude = ");
        dataFile.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
        dataFile.println(" m");
        dataFile.print("Humidity = ");
        dataFile.print(bme.readHumidity());
        dataFile.println(" %");
        dataFile.println();
        dataFile.close();
        // print to the serial port too:
        /* Serial.println(dataString); */
    }
    // if the file isn't open, pop up an error:
    else
    {
        /* Serial.println("error opening datalog.txt"); */
    }
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
}

    为了方便查看,看得到记录的状态,我还增加了一个LED的闪烁。记录的周期不是很准确,采集的频率大概是1HZ。不是很快,但是也不是很慢,对于我们要采集的几种信号来说已经足够快了。

    采集到的数据大概是这样子的:

    数据采集完了之后,使用pandas很容易可以实现一个数据的可视化。最近连续有三次身体不适,每次不舒服的时候,都咬牙看了下数据。两次数据就大概找到了一点规律:每次身体不适的时候都是气压突降的时候。第三次身体不适的时候,算是正好做了一个验证,也刚好验证了我这个简单的结论。

    三次身体不适的时候,查看数据,每次都看到了气压的突然下降。就像上面图中框出来的(3条曲线依次是温度、湿度和气压)。

    程序源文件我会放到我的Github,供大家参考:https://github.com/GreyZhang/g_arduino

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页