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;
}
}
0件のコメント