FusionPCBでPCBAを発注してみた話の続きです!
基板についているセンサーとマイコンを使ってIoTをしてみようという試みです。
基板の内容についてと実際に測定・データ送信をやってみたことを紹介します!
PRありです
基板とプロジェクト
Seeed Studioが運営しているプリント基板製造サービス「FusionPCB」に発注した基板です!
FusionPCBのPCBAサービス紹介のページ: https://www.seeedstudio.com/pcb-assembly.html
注文ページ英語版: https://www.seeedstudio.com/fusion_pcb.html
注文ページ日本語版: https://www.fusionpcb.jp/fusion_pcb.html
基板の概要
- マイコンボード「XIAO_ESP32C3」:基板の制御&データ送信
- BME680:環境測定センサー。BME280の強い版なイメージ
- 青色LED:起動と送信を確認する用途
- 状態確認LED:センサー値によって緑・オレンジ・赤で状態を表示する。(判定値はプログラム上で設定)
プロジェクト
基板についてるセンサー「BME680」でいろいろ測定して、それをWi-Fiで「Ambient」にデータ送信します。Ambient上でグラフ化します。測定中の基板本体も何か表示したかったので、測定データによってLEDを点灯させるようにしています。今回は湿度データによって点灯するLEDを変えてみてます。
書き込んだコード
Arudino言語で書いたコードです。
XIAO_ESP32C3の使い方については公式のドキュメントにセットアップについての内容がありました。 https://wiki.seeedstudio.com/XIAO_ESP32C3_Getting_Started/
// XIAO_ESP32C3_BME680_to_Ambient
//BME680で測定したデータをAmbientに送信する。
//https://jcomet.com/
//1_各定義
//BME680
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
Adafruit_BME680 bme;
float temp = 0.0f; //温度
float humi = 0.0f; //湿度
float pres = 0.0f; //圧力
float gasr = 0.0f; //ガス抵抗値
float hukai = 0.0f; //不快指数
#define SEALEVELPRESSURE_HPA (1013.25)
//Ambient&WiFi
#include "Ambient.h"
unsigned int channelId = "channelId"; // AmbientのチャネルID
const char* writeKey = "writeKey"; // ライトキー
WiFiClient client;
Ambient ambient;
const char* ssid = "ssid";
const char* password = "password";
//LED
int led1 = D10;
int led2 = D9;
int led3 = D8;
int led4 = D7;
//LED1(測定確認風LED)定義
int led1_state = LOW;
unsigned long pre_millis = 0;
const long interval = 100;
//送信間隔用の定義
unsigned long prev_sendtime = 0;
const long send_interval = 5*60*1000;
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
//WiFi設定
WiFi.begin(ssid, password); // Wi-Fi APに接続
while (WiFi.status() != WL_CONNECTED) { // Wi-Fi AP接続待ち,接続できるまで赤LEDを点滅
digitalWrite(led4, LOW);
delay(100);
digitalWrite(led4, HIGH);
delay(100);
}
ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
if (!bme.begin(0x76)) {
display.print("Could not find a valid BME680 sensor, check wiring!");
while (1);
}
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150);
}
void loop() {
//起動中は青色LEDを点滅させる
unsigned long cur_miillis = millis();
if (cur_miillis - pre_millis >= interval) {
pre_millis = cur_miillis;
if (led1_state == LOW) {
led1_state = HIGH;
} else {
led1_state = LOW;
}
digitalWrite(led1, led1_state);
}
valueset();
delay(50);
humi_judgeled();
delay(50);
//データ送信後に青色LEDの点滅間隔を速くする
unsigned long cur_sendtime = millis();
if (cur_sendtime - prev_sendtime >= send_interval) {
prev_sendtime = cur_sendtime;
ambient.send(); // データをAmbientに送信
int count_send_led = 0;
while(count_send_led < 15){
digitalWrite(led1, LOW);
delay(100);
digitalWrite(led1, HIGH);
delay(100);
count_send_led++;
}
}
}
//loop内でセンサー測定と測定値をセットする
void valueset() {
if (! bme.performReading()) {
display.print("Failed to perform reading :(");
return;
}
temp = bme.temperature; //温度
humi = bme.humidity; //湿度
pres = bme.pressure / 100; //圧力
gasr = bme.gas_resistance / 1000.0; //ガス抵抗値
hukai = 0.81f * temp + 0.01f * humi * (0.99f * temp - 14.3f) + 46.3f; //不快指数
ambient.set(1, temp); // 温度をデータ1にセット
ambient.set(2, humi); // 湿度をデータ2にセット
ambient.set(3, pres); // 気圧をデータ3にセット
ambient.set(4, gasr); // ガス抵抗値をデータ4にセット
ambient.set(5, hukai); // 不快指数をデータ5にセット
}
//測定値に応じて点灯するLEDを指定する
void humi_judgeled() {
// 湿度によってLEDの点灯する色を変える
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
if (humi <= 40) {
digitalWrite(led4, HIGH); // 動作A
} else if (humi >= 70 ) {
digitalWrite(led2, HIGH); // 動作B
} else {
digitalWrite(led3, HIGH); // 動作C
}
}
測定と送信するときの様子です!
LEDのチカチカもちゃんとできました🔦
感想
センサー周りの配線が少し不安だったのですが、無事に動いてくれたので良かったです🥳
動作させてるときにLEDを点滅させる方法も勉強できたので、すこしレベルアップできたかなと思ってます。
今回はAmbientにデータをアップしましたが、ラズパイにデータ蓄積とかもやってみたいなーなんて思ったりもしてます。
コメント