Arduino で１日に１回、温度と気圧をツイートする

Arduino で１日に１回、温度と気圧をツイートします。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115935/54f859f9-bf36-3036-b876-86394169a872.png)
Twitterのアクセストークンの取得方法はこちら
[Arduinoからツイート＋Webサーバー化 - Qiita ](https://qiita.com/mugimugi/items/052b4fefaa70ae7666de)

使用機材

|項目|機材名|
|---|---|
|使用しているArduino |arduino nano|
|書き込みブートローダ |atmega328old|
|LAN シールド|[ENC28J60](https://www.diymore.cc/products/enc28j60-ethernet-network-module-shield-v2-0-for-arduino)|
|気圧センサー|BMP085|

GPIO端子の接続設定

|センサー端子|Arduino端子|
|---|---|---|
|SDA|A4|
|SDL|A5|
|3.3V|3.3V|
|GND|GND|

ソースコードはこちら

```c:TweetTemperatureHumidity.ino
// ====================================================================================================
// Settings
// ====================================================================================================

// ----------------------------------------------------------------------------------------------------
// setting : internet
// ----------------------------------------------------------------------------------------------------
#include <UIPEthernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x78, 0xEE  };  
IPAddress ip(192, 168, 0, 117);
IPAddress myDns(192, 168, 0, 1);                        

// ----------------------------------------------------------------------------------------------------
// setting : twitter
// ----------------------------------------------------------------------------------------------------
#include <Twitter.h>
Twitter twitter("xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxx");

// ----------------------------------------------------------------------------------------------------
// setting : temperature and humidity
// ----------------------------------------------------------------------------------------------------
/*
#include <DHT.h>
const int PIN_DHT = 8; // read pin
DHT dht( PIN_DHT, DHT11 );
*/

// ----------------------------------------------------------------------------------------------------
// setting : bmp085Calibration( Temperature and Pressure )
// ----------------------------------------------------------------------------------------------------
#include <Wire.h>
#define BMP085_ADDRESS 0x77  // I2C address of BMP085
const unsigned char OSS = 0;  // Oversampling Setting
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;
long b5;

// ====================================================================================================
// init
// ====================================================================================================
void setup() {

  //Serial.begin(9600);

  // start ip address
  Ethernet.begin(mac, ip , myDns );

  // start dht
  //dht.begin();
  
  //
  Wire.begin();
  bmp085Calibration();

  // wait caribration
  delay(3000);

}

// ====================================================================================================
// loop
// ====================================================================================================
void loop() {

  // --------------------------------------------------------------------------------------------------
  //
  // --------------------------------------------------------------------------------------------------
  /*
  // read
  float tempC    = dht.readTemperature(); //温度の読み出し 摂氏　℃
  float humidity = dht.readHumidity();    //湿度の読み出し

  // check value
  if( isnan( tempC ) || isnan( humidity ) ) {
    //Serial.println("ERROR");
    return;
  }

  //
  float discomfortIndex = 100.0 - ( 0.81f * tempC + 0.01f * humidity * (0.99f * tempC - 14.3f) + 46.3f );
  */
  
  // --------------------------------------------------------------------------------------------------
  // bmp085Calibration Temperature and Pressure
  // --------------------------------------------------------------------------------------------------
  float temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
  float pressure    = bmp085GetPressure(bmp085ReadUP()) / 100 ;

  // --------------------------------------------------------------------------------------------------
  // twitter message
  // --------------------------------------------------------------------------------------------------
  String help = "";
  if( pressure < 1000 ){
    help = "気をつけて ";
  }else if( pressure >= 1000 ){
  }
  String message = "ぷいぷい 温度は " + String( temperature , 0 ) + "℃ 気圧は " + String( pressure , 0 ) + " hPa だよ " + help + "#Arduino";
  char* msg = message.c_str();

  // send to twitter 
  if (twitter.post(msg)) {
    int status = 0;
    status = twitter.wait();
    if (status == 200) {
      //Serial.println("OK.");
    } else {
      //Serial.print("failed : code ");
      //Serial.println(status);
    }
  } else {
    //Serial.println("connection failed.");
  }

  // --------------------------------------------------------------------------------------------------
  // wait 1 day ;-)
  // --------------------------------------------------------------------------------------------------
  delay( 1000 * 86400 );
  
}

// ====================================================================================================
// bmp085Calibration( Temperature and Pressure ) functions
// ====================================================================================================
void bmp085Calibration(){
  ac1 = bmp085ReadInt(0xAA);
  ac2 = bmp085ReadInt(0xAC);
  ac3 = bmp085ReadInt(0xAE);
  ac4 = bmp085ReadInt(0xB0);
  ac5 = bmp085ReadInt(0xB2);
  ac6 = bmp085ReadInt(0xB4);
  b1 = bmp085ReadInt(0xB6);
  b2 = bmp085ReadInt(0xB8);
  mb = bmp085ReadInt(0xBA);
  mc = bmp085ReadInt(0xBC);
  md = bmp085ReadInt(0xBE);
}
float bmp085GetTemperature(unsigned int ut){
  long x1, x2;
  x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  x2 = ((long)mc << 11)/(x1 + md);
  b5 = x1 + x2;
  float temp = ((b5 + 8)>>4);
  temp = temp /10;
  return temp;
}
long bmp085GetPressure(unsigned long up){
  long x1, x2, x3, b3, b6, p;
  unsigned long b4, b7;
  b6 = b5 - 4000;
  // Calculate B3
  x1 = (b2 * (b6 * b6)>>12)>>11;
  x2 = (ac2 * b6)>>11;
  x3 = x1 + x2;
  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
  // Calculate B4
  x1 = (ac3 * b6)>>13;
  x2 = (b1 * ((b6 * b6)>>12))>>16;
  x3 = ((x1 + x2) + 2)>>2;
  b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
  b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  if (b7 < 0x80000000)
    p = (b7<<1)/b4;
  else
    p = (b7/b4)<<1;
  x1 = (p>>8) * (p>>8);
  x1 = (x1 * 3038)>>16;
  x2 = (-7357 * p)>>16;
  p += (x1 + x2 + 3791)>>4;
  long temp = p;
  return temp;
}
char bmp085Read(unsigned char address){
  unsigned char data;
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 1);
  while(!Wire.available())
    ;
  return Wire.read();
}
int bmp085ReadInt(unsigned char address){
  unsigned char msb, lsb;
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 2);
  while(Wire.available()<2)
    ;
  msb = Wire.read();
  lsb = Wire.read();
  return (int) msb<<8 | lsb;
}
unsigned int bmp085ReadUT(){
  unsigned int ut;
  // Write 0x2E into Register 0xF4
  // This requests a temperature reading
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x2E);
  Wire.endTransmission();
  // Wait at least 4.5ms
  delay(5);
  // Read two bytes from registers 0xF6 and 0xF7
  ut = bmp085ReadInt(0xF6);
  return ut;
}
unsigned long bmp085ReadUP(){
  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;
  // Write 0x34+(OSS<<6) into register 0xF4
  // Request a pressure reading w/ oversampling setting
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x34 + (OSS<<6));
  Wire.endTransmission();
  // Wait for conversion, delay time dependent on OSS
  delay(2 + (3<<OSS));
  // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
  msb = bmp085Read(0xF6);
  lsb = bmp085Read(0xF7);
  xlsb = bmp085Read(0xF8);
  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
  return up;
}
void writeRegister(int deviceAddress, byte address, byte val) {
  Wire.beginTransmission(deviceAddress); // start transmission to device 
  Wire.write(address);       // send register address
  Wire.write(val);         // send value to write
  Wire.endTransmission();     // end transmission
}
int readRegister(int deviceAddress, byte address){
  int v;
  Wire.beginTransmission(deviceAddress);
  Wire.write(address); // register to read
  Wire.endTransmission();
  Wire.requestFrom(deviceAddress, 1); // read a byte
  while(!Wire.available()) {
    // waiting
  }
  v = Wire.read();
  return v;
}
float calcAltitude(float pressure){
  float A = pressure/101325;
  float B = 1/5.25588;
  float C = pow(A,B);
  C = 1 - C;
  C = C /0.0000225577;
  return C;
}
````

※本当は温湿度と不快指数も表示したかったのですが、Arduinoのメモリが足りなくて断念orz

参考リンク

- [DHT11 を用いた温度と湿度の計測 - Arduino - 基礎からの IoT 入門 ](https://iot.keicode.com/arduino/temperature-dht11.php)
- [adafruit/Adafruit_Sensor: Common sensor library ](https://github.com/adafruit/Adafruit_Sensor)
- [気圧測定：BMP085とArduino | 別棟備忘録４ ](https://bibo.capture.jp/arduino-processing/post-149)
- [Arduino 入門 Lesson 11 【温湿度センサ編】 | おもろ家 ](https://omoroya.com/arduino-lesson11/)