DHT11を使用した温湿度計測ユニットのArduinoソースコードは以下のとおりです。やっつけ感満載のソースコードですが、参考になりましたら幸いです。

 //----------------------------------------------
 // ADT7410 温度計測→SakuraIOへ送信
 //----------------------------------------------
 #include <SakuraIO.h>
 #include <DHT.h>
 #include <Adafruit_GFX.h>
 #include <Adafruit_SSD1306.h>
 
 #if (SSD1306_LCDHEIGHT != 64)
 #error("Height incorrect, please fix Adafruit_SSD1306.h!");
 #endif

 #define OLED_MOSI   9
 #define OLED_CLK   10
 #define OLED_DC    11
 #define OLED_CS    12
 #define OLED_RESET 13

 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
 #define DHT11_PIN   8
 DHT dht(DHT11_PIN, DHT11);

 SakuraIO_I2C sakuraio;

 #define DISP_SEC 60
 #define SEND_SEC 900

 unsigned long datasend_ms;
 unsigned long display_ms;
 float humidity = 0;
 float temperature = 0;

 //デバイスを識別する番号:書き込む直前に変更する
 double device_no = 0;

 void disp_refresh() {
   humidity = dht.readHumidity();
   temperature = dht.readTemperature();

   display.clearDisplay();
   display.setTextSize(2);
   display.setTextColor(WHITE);
   display.setCursor( 0, 20);display.print(temperature);display.println("C");
   display.setCursor( 0, 40);display.print(humidity);display.println("%");
   display.display();
 }

 void senddata() {
   sakuraio.enqueueTx(0, device_no);
   sakuraio.enqueueTx(1, temperature);
   sakuraio.enqueueTx(2, humidity);
   sakuraio.send();
 }

 void setup()
 {
   pinMode(7, INPUT);
   if(digitalRead(7) == HIGH){
     device_no = 1;
   }

   Serial.begin(9600);
   dht.begin();

   display.begin(SSD1306_SWITCHCAPVCC);
   display.clearDisplay();
   display.setTextSize(2);
   display.setTextColor(WHITE);
   display.setCursor( 0, 0);display.println("initialize");
   display.display();

   while(!sakuraio.getConnectionStatus() & 0x80){
     delay(1000);
   }
   Serial.println("getConnectionStatus OK");

   display.clearDisplay();
   display.setCursor( 0, 0);display.println("mt-megami");
   display.setCursor( 0,20);display.println(device_no);
   display.display();
   delay(2000);

   disp_refresh();

   delay(3000UL);

   datasend_ms = millis();
   display_ms = millis();
 }

 void loop() {
   unsigned long now_ms = millis();
   if(now_ms > datasend_ms + (1000UL * SEND_SEC)){
     disp_refresh();
     senddata();
     datasend_ms = millis();
     return;
   }

   if(now_ms > display_ms + (1000UL * DISP_SEC)){
     disp_refresh();
     display_ms = millis();
     return;
   }
 }

カテゴリー: ロボット/IoT

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください