
たまにはリアルなモノづくりをやってみようということで、サンタに持ってきてもらった「Arduino学習キット」。いったいどんなものが出来上がるのか?
「まずは簡単なIoTデバイスを」ってことで,ペット達(ハムスター,熱帯魚)が快適な環境で過ごしているかをモニタし,環境変化があればスマホにメールで知らせてくれるセンサ(と監視システム)を作ってみよう。
要求仕様を満たすために,以下の構成でセンサ回路を作成する。
| 部品名 | 備考 |
|---|---|
| ESP-WROOM-02 | Arduinoとしてプログラムを書き込めるWiFiモジュール。これで制御しつつ,データを無線LANで自宅サーバーに送信する。 |
| AE-HDC1000 | I2C接続の温湿度センサ |
| サーミスタ | 水温計測用。ウチにあった水槽用温度センサを転用。 |
| AE-AQM0802 | I2C接続の液晶モニタ |
| 電源 | ACアダプタ(5V)で電源供給し,回路にて3.3Vに降圧して駆動する。 |
#include <Wire.h>
#include "Adafruit_HDC1000.h"
#include <ESP8266WiFi.h>
//監視データ初期値
float DefValue1 = 0; //気温
float DefValue2 = 0; //湿度
float DefValue3 = 0; //水温
float Delta1 = 0.4; //データアップする気温差
float Delta2 = 2; //同、湿度差
float Delta3 = 0.4; //同、水温差
//WiFiパラメータ
char WiFiSSID[] = "自宅WiFiのSSID";
char WiFipass[] = "自宅WiFiのパスワード";
IPAddress WiFiIP(xxx , xxx , xxx , xxx); //IPアドレス
IPAddress WiFiGW(xxx , xxx , xxx , xxx); //ゲートウェイIPアドレス
IPAddress WiFiSM(xxx , xxx , xxx , xxx); //サブネットマスク
//サーバーパラメータ
const char* Host = "xxx.xxx.xxx.xxx"; //自宅サーバーのIPアドレス
const int httpPort = 80;
String url = "/Solar/LivingdataUpload.php?";
String Data1 = "kion=";
String Data2 = "&hum=";
String Data3 = "&suion=";
//サーミスタパラメータ
float aData = 0;
float V1 = 3.22;
float V2 = 0;
float R1 = 50;
float R2 = 0;
//HDC1000
Adafruit_HDC1000 hdc = Adafruit_HDC1000();
//LCD_AQM0802
int I2Cadr = 0x3E;
byte Contrast = 32;
void LCD_cmd(byte x) {
Wire.beginTransmission(I2Cadr);
Wire.write(0x00);
Wire.write(x);
Wire.endTransmission();
}
void LCD_data(byte x) {
Wire.beginTransmission(I2Cadr);
Wire.write(0x40);
Wire.write(x);
Wire.endTransmission();
}
void LCD_puts(const char *s) {
while(*s) LCD_data(*s++);
}
// LCD initialize
void LCD_init() {
delay(40);
Wire.begin();
LCD_cmd(0x38); // function set
LCD_cmd(0x39); // function set
LCD_cmd(0x14); // intervalosc
LCD_cmd(0x70 + (Contrast & 0x0F)); // contrast low
LCD_cmd(0x5c + (Contrast >> 4)); // contrast high / icon / power
LCD_cmd(0x6c); // follower control
delay(300);
LCD_cmd(0x38); // function set
LCD_cmd(0x0c); // display on
LCD_cmd(0x01); // clear display
delay(2);
}
void LCD_move(byte pos) {
LCD_cmd(0x80 | pos);
}
void setup() {
Serial.begin(115200);
if (!hdc.begin()) {
while (1); //wait for starting
}
LCD_init();
//WiFi接続
WiFi.mode(WIFI_STA);
WiFi.begin(WiFiSSID, WiFipass);
WiFi.config(WiFiIP , WiFiGW , WiFiSM);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
}
void loop() {
//監視状態
int Status = 0; //0:通常 1:変化あり
//気温
LCD_move(0x0);
char Line1[9];
float Value1 = hdc.readTemperature();
String TEMP1 = String("RT " + String(Value1));
TEMP1.toCharArray(Line1 , 8);
LCD_puts(Line1);
if (abs(Value1 - DefValue1) > Delta1) {
Status = 1;
DefValue1 = Value1;
}
//湿度
LCD_move(0x40);
char Line2[9];
float Value2 = hdc.readHumidity();
String TEMP2 = String("RH " + String(Value2));
TEMP2.toCharArray(Line2 , 8);
LCD_puts(Line2);
if (abs(Value2 - DefValue2) > Delta2) {
Status = 1;
DefValue2 = Value2;
}
delay(3000);
//水温
LCD_move(0x0);
char Line3[9];
aData = analogRead(A0);
V2 = aData/1024;
R2 = V2/(V1 - V2) * R1;
float Value3 = 48.954 - 2.1393 * R2;
String TEMP3 = String("WT " + String(Value3));
TEMP3.toCharArray(Line3 , 8);
LCD_puts(Line3);
if (abs(Value3 - DefValue3) > Delta3) {
Status = 1;
DefValue3 = Value3;
}
//空白
LCD_move(0x40);
char Line4[9] =" ";
LCD_puts(Line4);
//状態変化があればデータアップロード
if (Status == 1) {
String Param = url + Data1 + String(Value1) + Data2 + String(Value2) + Data3 + String(Value3);
Serial.println(Param);
WiFiClient client;
if (client.connect(Host, httpPort)) {
client.print(String("GET ") + Param + " HTTP/1.1\r\n" + "Host: " + Host + "\r\n" + "Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
client.stop();
return;
}
}
}
Status = 0;
}
delay(3000);
}