概要
前回 まで Arduino で超音波センサを扱ってきました
今回は ESP-WROOM-02 を使って HC-SR04 を制御してみました
環境
- ESP-WROOM-02 開発ボード
- Arduino IDE 1.6.7
- 超音波センサ HC-SR04
- 温度センサ
- 抵抗 470Ω
配線
配線の全体図は以下の通りです
若干ごちゃごちゃしていますがそこまで難しい配線ではないと思います
HC-SR04 は VCC, GND をそれぞれ WROOM の VOUT (5V), GND に接続し、Trig をデジタルピンの 2 番、Echo をデジタルピンの 4 番に接続しています
ポイント
温度センサが若干複雑になっていて WROOM の TOUT で温度の値を取得するのですが、TOUT の入力電圧が 1.1V 以下である必要があるので、例のごとく分圧しています
その部分だけ拡大した配線は以下の通りです
温度センサの真ん中のピンを直接 TOUT に接続するのではなく、抵抗470Ωを挟んで分圧しています
温度センサ真ん中 -> 抵抗 470Ω -> ジャンパ -> TOUT -> ジャンパ -> 抵抗 470Ω 並行 -> GND
という感じです
これで電圧を 1/3 にすることで 1.1V 以下の電圧を VOUT に入力することができます
スケッチ
今回は HC-SR04 から取得した距離情報を MQTT に Publish するところまでやっています
そこまで不要という方は必要な部分を削除してお使いください
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
extern "C" {
#include "user_interface.h"
}
// Update these with values suitable for your network.
const char* ssid = "ssid";
const char* password = "password of ssid";
const char* mqtt_server = "yourbroker.name.server";
const int mqtt_port = 1883;
const char* mqtt_pub_topic = "topic";
const char* mqtt_username = "mqtt-user";
const char* mqtt_password = "mqtt-pass";
int duration = 0;
double distance = 0;
int trigger = 2;
int echo = 4;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
int getToutValue(){
int res = system_adc_read();
return res;
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP8266Client", mqtt_username, mqtt_password)) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish(mqtt_pub_topic, "hello world");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
pinMode(trigger, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// 温度を取得
int ans, temp, tv;
ans= getToutValue();
tv = map(ans, 0, 1023, 0, 3000);
temp = map(tv, 300, 1600, -30, 100);
// 時間を測定
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
duration = pulseIn(echo, HIGH, 5000);
// 距離を測定し publish
if (duration > 0) {
distance = duration / 2;
Serial.print("distance1: ");
Serial.println(distance);
float sonic = 331.5 + 0.6 * temp;
distance = distance * sonic * 100 / 1000 / 1000;
Serial.print("distance2: ");
Serial.println(distance);
dtostrf(distance, -1, 2, msg);
client.publish(mqtt_pub_topic, msg);
}
delay(500);
}
若干長いですが、setup -> loop 関数と追っていけばだいたいわかると思います
まず Wifi ネットワークに接続します
接続が完了したら MQTT ブローカとの接続を行います
その後で温度センサの情報を取得し、その情報を元に光の速度を求め HC-SR04 から取得した時間情報と合わせて距離を算出しています
ポイント
Arduino と同じようなできなかった部分を紹介します
tv = map(ans, 0, 1023, 0, 3000);
の最後の引数が Arduino の場合は 5000 になっていました
Arduino の場合は 5V で温度センサを動かしていたので 5000 にしていましたが、WROOM の場合分圧をしなければいけない関係で 3.3V で温度センサを動かしていたため 3000 に修正しました
dtostrf(distance, -1, 2, msg);
を使って算出した距離情報を String に変換しています
Arduino の場合は Serial.write
などを使って出力していたので、特に double 型のままでも問題ないのですが、今回 MQTT に publish する関係で String に変換する必要があったため dtostrf を使っています
引数の説明は以下の通りです
- 1 つ目・・・変換する値
- 2 つ目・・・変換後の文字数
- 3 つ目・・・変換後の小数点以下の桁数
- 4 つ目・・・変換した文字列を格納する変数
動作確認
スケッチを WROOM に書き込んで指定した Topic を Subscribe して待ってみましょう
以下のように受信できれば OK です
上記は mosquitto_sub
コマンドを使って確認しています
最後に
スケッチも含め完全互換とまではいきませんでしたが、ほぼ Arduino で動作した制御と同じ制御で WROOM でも動かすことができました
距離の精度もほぼ変わりませんでした (同じ超音波センサなので当たり前といえば当たり前ですが)
温度センサを使わないのでもいいのであれば、もっと簡単に使うことができると思います
0 件のコメント:
コメントを投稿