Author Archives: chen

WeMos (15) Mini OLED+MLX90614

Published by:

ひさしぶりに投稿。

新型疫病で体温測るが必須になる昨今、非接触でおでこにピー!して測る 非接触温度計 をよく目にするうちに、 MLX90614 センサと ESP8266 を使って自分でも作ってみたくなりました。

しかしいくつ注文しても、発送しない、間違ったものが届く、そして倍々する値上げ、それで注文しても発送しない、一時諦めていた。

最近大抵倍の値段で落ち着いたから、2個購入した。

Mini OLEDと合わせて、モバイルバッテリに繋ぐのですが、非接触温度計ガンっぽくする為にちょっと工夫した。

 

#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define BLYNK_PRINT Serial
#include <Blynk.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
 
#define OLED_RESET 0       // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(OLED_RESET);
 
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
 
double temp_amb;
double temp_obj;
double calibration = 2.36;
 
char auth[] = "bOTyO9tRJyp8d0FLY8CoFyW115buIiZC";    // You should get Auth Token in the Blynk App.
char ssid[] = "Alexahome";                       // Your WiFi credentials.
char pass[] = "loranthus";
 
void setup()
{
  Serial.begin(9600);
  mlx.begin();         //Initialize MLX90614
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //initialize with the I2C addr 0x3C (128x64)
//  Blynk.begin(auth, ssid, pass);
  
  Serial.println("Temperature Sensor MLX90614");
 
  display.clearDisplay();
  display.setCursor(0,0);  
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println("Thermometer");
  display.setCursor(0,20);
  display.setTextSize(1);
  display.print("Initializing");
  display.display();
  delay(2500);
}
 
void loop()
{
  //Reading room temperature and object temp
  //for reading Fahrenheit values, use
  //mlx.readAmbientTempF() , mlx.readObjectTempF() )
//  Blynk.run();
  temp_amb = mlx.readAmbientTempC();
  temp_obj = mlx.readObjectTempC();
 
  //Serial Monitor
  Serial.print("Room Temp = ");
  Serial.println(temp_amb);
  Serial.print("Object temp = ");
  Serial.println(temp_obj);
 
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  
  display.setCursor(0,0);  
  display.setTextSize(1);
  display.print("Ambient: ");
  display.setCursor(0,10);
  display.print(temp_amb);
  display.print((char)247);
  display.print("C");
 
  display.setCursor(0,20);
  display.setTextSize(1);
  display.print("Object: ");
  display.setCursor(0,30);
  display.setTextSize(2);
  display.print(temp_obj + calibration);
  
  display.display();
  
//  Blynk.virtualWrite(V1, temp_amb);
//  Blynk.virtualWrite(V2, (temp_obj + calibration));
  
  delay(1000);
}

コードにblynkなど残骸あるのは、参考1のコードを参照したから。せっかくESP8266だから、そのうちクラウドへ保存のコードを作ってみる。

参考:

  1. https://how2electronics.com/iot-ir-thermometer-using-mlx90614-esp8266-on-blynk/
  2. https://servercan.net/blog/2020/05/mlx90614%E3%81%A8esp8266%E3%81%A7%E4%BD%9C%E3%82%8B%E9%9D%9E%E6%8E%A5%E8%A7%A6%E6%B8%A9%E5%BA%A6%E8%A8%88-1/

WeMos (e3) リレー制御

Published by:

制御の試し

参考資料1そのまま。

/*
 * Relay Shield - Blink
 * Turns on the relay for two seconds, then off for two seconds, repeatedly.
 *
 * Relay Shield transistor closes relay when D1 is HIGH
 */

const int relayPin = D1;
const long interval = 2000;  // pause for two seconds

void setup() {
  pinMode(relayPin, OUTPUT);
}

void loop() {
  digitalWrite(relayPin, HIGH); // turn on relay with voltage HIGH
  delay(interval);              // pause
  digitalWrite(relayPin, LOW);  // turn off relay with voltage LOW
  delay(interval);              // pause
}

 

firebaseから制御

FAN_Onエントリーをみて、リレーを制御。

 

#include "Firebase_ESP_Client.h"
#include <ESP8266WiFi.h>

#define relayPin D1

#define FIREBASE_HOST "test2-***.firebaseio.com"                    // Enter the Firebase Database URL Without Https and backslash
#define API_KEY "AIzaSyDfl-s-7-**********"

FirebaseData fbdo;

FirebaseAuth auth;
FirebaseConfig config;

FirebaseJson json;

#define WIFI_SSID "SSID003"                     // Change the name of your WIFI
#define WIFI_PASSWORD "12345"                        // Change the password of your WIFI

#define USER_EMAIL "xxx@yyy.net"
#define USER_PASSWORD "12345"

void setup() {
  pinMode(relayPin, OUTPUT);
    
  Serial.begin(115200);
  Serial.println("Relay for FAN Test");

  WiFi.begin (WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) 
  {
   delay(500);
   Serial.print(".");
  }

  Serial.println ("");
  Serial.println ("WiFi Connected!");
  
  /* Assign the project host and api key (required) */
  config.host = FIREBASE_HOST;
  config.api_key = API_KEY;

  /* Assign the user sign in credentials */
  auth.user.email = USER_EMAIL;
  auth.user.password = USER_PASSWORD;

  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);
}


void loop() {
String target;

//  if (Firebase.RTDB.getBool(&fbdo, "Thermostat/FAN_On")) {
//    target = fbdo.boolData();
  if (Firebase.RTDB.getString(&fbdo, "Thermostat/FAN_On")) {
    target = fbdo.stringData();
    Serial.println(target);
    Serial.println(fbdo.dataType());
    digitalWrite(relayPin, target.equals("true"));
  }
  else
  {
    Serial.println("FAILED");
    Serial.println("REASON: " + fbdo.errorReason());
    Serial.println("------------------------------------");
    Serial.println();
  }
  delay(500);
}

 

 

参考

  1. https://www.wemos.cc/en/latest/d1_mini_shield/relay.html — リレーの情報

WeMos (e2) LED表示

Published by:

IoT Study Kit 2のLEDは、FirebaseのLEDデータに従って表示。

プログラム1

単純に文字、パタンの表示。

3連ベースで、ESP8266, LED Matrix, SHT30を装着する。

 

 

Features

  • 8×8 dot matrix LED
  • 8 step adjustable intensity

Pins

D1 mini GPIO Shield
D5 14 CLK
D7 13 DIN

 

ライブラリから、WEMOS_Matrix_Adafruit_GFXを追加してください。

つぎは、ライブラリ付属のLED Matrix表示サンプルの修正版。

# コンパイルエラー発生した。

MLED matrix(7);  から

MLED matrix(7, D7, D5); に変更した。

 

#include <Adafruit_GFX.h>
#include <WEMOS_Matrix_GFX.h>

MLED matrix(7, D7, D5); //set intensity=7 (maximum)

void setup() {
  Serial.begin(9600);
  Serial.println("8x8 LED Matrix Test");
  
 
}

static const uint8_t PROGMEM
  smile_bmp[] =
  { B00111100,
    B01000010,
    B10100101,
    B10000001,
    B10100101,
    B10011001,
    B01000010,
    B00111100 },
  neutral_bmp[] =
  { B00111100,
    B01000010,
    B10100101,
    B10000001,
    B10111101,
    B10000001,
    B01000010,
    B00111100 },
  frown_bmp[] =
  { B00111100,
    B01000010,
    B10100101,
    B10000001,
    B10011001,
    B10100101,
    B01000010,
    B00111100 };

void loop() {
  matrix.clear();
  matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_ON);
  matrix.writeDisplay();
  delay(500);

  matrix.clear();
  matrix.drawBitmap(0, 0, neutral_bmp, 8, 8, LED_ON);
  matrix.writeDisplay();
  delay(500);

  matrix.clear();
  matrix.drawBitmap(0, 0, frown_bmp, 8, 8, LED_ON);
  matrix.writeDisplay();
  delay(500);

  matrix.clear();      // clear display
  matrix.drawPixel(0, 0, LED_ON);  
  matrix.writeDisplay();  // write the changes we just made to the display
  delay(500);

  matrix.clear();
  matrix.drawLine(0,0, 7,7, LED_ON);
  matrix.writeDisplay();  // write the changes we just made to the display
  delay(500);

  matrix.clear();
  matrix.drawRect(0,0, 8,8, LED_ON);
  matrix.fillRect(2,2, 4,4, LED_ON);
  matrix.writeDisplay();  // write the changes we just made to the display
  delay(500);

  matrix.clear();
  matrix.drawCircle(3,3, 3, LED_ON);
  matrix.writeDisplay();  // write the changes we just made to the display
  delay(500);

  matrix.setTextSize(1);
  matrix.setTextWrap(false);  // we dont want text to wrap so it scrolls nicely
  matrix.setTextColor(LED_ON);
  for (int8_t x=0; x>=-36; x--) {
    matrix.clear();
    matrix.setCursor(x,0);
    matrix.print("Hello");
    matrix.writeDisplay();
    delay(100);
  }
  matrix.setRotation(3);
  for (int8_t x=7; x>=-36; x--) {
    matrix.clear();
    matrix.setCursor(x,0);
    matrix.print("World");
    matrix.writeDisplay();
    delay(100);
  }
  matrix.setRotation(0);
}

 

プログラム2

Firebaseのデータ(/Speech) をLEDに表示する

Firebaseへのコンタクトは、MobizTのライブラリを利用することで成功した。

https://github.com/mobizt/Firebase-ESP8266

#include <Adafruit_GFX.h>
#include <WEMOS_Matrix_GFX.h>
#include "FirebaseESP8266.h"
#include <ESP8266WiFi.h>

MLED matrix(7, D7, D5); //set intensity=7 (maximum)

#define PIN D1
#define NUM_LEDS 8

const char* ssid = "ssid003";
const char* password = "12345";

FirebaseData firebaseData;

// Current color values
int redValue = 0;
int greenValue = 0;
int blueValue = 0;

void setup() {
  Serial.begin(115200);
  Serial.println("8x8 LED Matrix Test");

  connectWifi();
  
  Firebase.begin("https://test2.firebaseio.com/", "********4WxzwiCI");
}


void loop() {
String target;

  if (Firebase.getString(firebaseData, "/Speech")) {
    target = firebaseData.stringData();
    Serial.println(target);
    Serial.println(firebaseData.dataType());
    matrix.setTextSize(1);
    matrix.setTextWrap(false);  // we dont want text to wrap so it scrolls nicely
    matrix.setTextColor(LED_ON);
    for (int8_t x=0; x>=-56; x--) {
      matrix.clear();
      matrix.setCursor(x,0);
      matrix.print(target);
      matrix.writeDisplay();
      delay(100);
    }
  }
  else
  {
    Serial.println("FAILED");
    Serial.println("REASON: " + firebaseData.errorReason());
    Serial.println("------------------------------------");
    Serial.println();
  }
  delay(500);
}

void connectWifi() {
  // Let us connect to WiFi
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println(".......");
  Serial.println("WiFi Connected....IP Address:");
  Serial.println(WiFi.localIP());

}

 

 

WeMos (e1) 温度の送信

Published by:

IoT Study Kit 2からFirebaseへ温度データの送信。

 

IoT Sensor

UbiSense Ver2を利用。

結線

プログラム1

3連ベースで、ESP8266, LED Matrix, SHT30を装着。温度と湿度を計測。

WEMOS_SHT3x_Arduino_Libraryを使用。

https://github.com/wemos/WEMOS_SHT3x_Arduino_Library

ただの温度と湿度の表示サンプル。

#include <WEMOS_SHT3X.h>

SHT3X sht30(0x45);

void setup() {

  Serial.begin(115200);

}

void loop() {

  if(sht30.get()==0){
    Serial.print("Temperature in Celsius : ");
    Serial.println(sht30.cTemp);
    Serial.print("Temperature in Fahrenheit : ");
    Serial.println(sht30.fTemp);
    Serial.print("Relative Humidity : ");
    Serial.println(sht30.humidity);
    Serial.println();
  }
  else
  {
    Serial.println("Error!");
  }
  delay(1000);

}

参考

  1. http://stigern.net/blog/using-wemos-d1-mini-sht30-sensor-shield/

プログラム2

検出した温度をFirebaseに送信。

#include "Firebase_ESP_Client.h"
#include  <ESP8266WiFi.h>

#define FIREBASE_HOST "test2-***.firebaseio.com"                    // Enter the Firebase Database URL Without Https and backslash
#define API_KEY "AIzaSyDfl-s-**** "

FirebaseData fbdo;

FirebaseAuth auth;
FirebaseConfig config;

FirebaseJson json;

#define WIFI_SSID "SSID003"                     // Change the name of your WIFI
#define WIFI_PASSWORD "12345"                        // Change the password of your WIFI

#define USER_EMAIL "xxx@yyy.net"
#define USER_PASSWORD "12345"

#include <WEMOS_SHT3X.h>
SHT3X sht30(0x45);

void setup() 
{
  Serial.begin(115200);
  WiFi.begin (WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) 
  {
   delay(500);
   Serial.print(".");
  }
  Serial.println ("");
  Serial.println ("WiFi Connected!");

  /* Assign the project host and api key (required) */
  config.host = FIREBASE_HOST;
  config.api_key = API_KEY;

  /* Assign the user sign in credentials */
  auth.user.email = USER_EMAIL;
  auth.user.password = USER_PASSWORD;

  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);
}

void loop() 
{
 float h =0;
 float t = 0;         // Reading temperature as Celsius (the default)

  if(sht30.get()==0){
    t = sht30.cTemp;
    h = sht30.humidity;
    Serial.print("Temperature in Celsius : ");
    Serial.println(sht30.cTemp);
    Serial.print("Temperature in Fahrenheit : ");
    Serial.println(sht30.fTemp);
    Serial.print("Relative Humidity : ");
    Serial.println(sht30.humidity);
    Serial.println();
  }
  else
  {
    Serial.println("SHT30 Error!");
  }

  
  Firebase.RTDB.setFloat (&fbdo, "Temperature",t);
  Serial.println(t);
  Firebase.RTDB.setFloat (&fbdo, "Humidity",h);
  Serial.println(h);
  delay(200);
}

 

BSidesケープタウン2019バッジ

Published by:

ハードウェア

これからはすべてがこれに基づいているので、これはおそらく開始するのに最も簡単な場所です。

コンポーネントは

  • ESP32プロセッサ。
    • これは、デュアルコア240MHz、380kbメモリ、4MBROMプロセッサです。超高速で、BluetoothとWifiが組み込まれています!浮動小数点ユニットはありませんが、これらのタイプの計算はツールチェーンとArduinoライブラリを介して実行できます。それ以外の場合は、パフォーマンス上の理由から、固定小数点演算を実行できます。

  • 1.3インチ240x240IPSディスプレイ
    • このディスプレイは実際の発見でした。価格と解像度を手に入れるのは簡単ではありません。プロジェクトの課題の1つは、実際にこれらすべてのピクセルを押し出すことでした。画面がサポートするフル16ビットカラーを実際に実行することはできませんでした。それが必要としたであろうフレームバッファの。256色のパレットには魅力があると思います。

  • カスタムPCB
    • PCBは、すべてのコンポーネント(充電回路、USB、バッテリー電源)とタッチボタンに適合するように設計されています

  • 18650バッテリー
    • これは世界で最も標準的なバッテリーと見なされており、テスラで使用されているものと同じです!だから、未来の一部のように感じることができます。これらの1つを持っているだけで、2800mahのバッテリーだと思いますが、文字通りその日に時間がわかります:)

  • 3Dプリントケース
    • 私はいつも、人々がバッジに触れたり、実際にバッジに手を入れたり、遊んだりすることをためらうことがあることに気づきました。ケースを持っていることで、うまくいけばそれに対処し、バッジにはるかに完成した製品の感触を与えることができます。

BSidesケープタウン2016バッジ

Published by:

ハッカー・コンでIRを搭載したバッジ を使用

》》》

BSides Cape Town 2016 Badge Walkthrough

昨年12月に開催されたBSidesケープタウンでは、  IRを搭載したバッジ を使用して、参加者がチャットしながらゲームに没頭しました。

[AndrewMacPherson]と[MikeDavis]が率いるグループは、8つのボタン、IRレシーバーとトランスミッター、5つの「レベル」LED、RGB LED、600mAhを備えたESP8266と128×64OLEDディスプレイ、USB経由で充電したLiPoを含まれたバッジをデザインしました。

ハードウェアは、主催者がバッジ間の相互作用をリアルタイムで監視できるように、有機的なゲームをプレイするために特別に設計されました。各バッジは、赤、青、または緑の派閥にランダムに分類されました。これは、バッジ上で光るRGBLEDによって識別できます。ゲームのレベルを示す一連の5つのLEDもありました。2つ以上のバッジが互いに近づき、IRがリンクするのに十分な場合、最低レベルのバッジが勝者の派閥に転換されました。

もちろん、バッジには出席者のハンドルが表示され、コンベンションプログラミングのリストが含まれていました。また、参加者に一連の課題を提示しました。これらの課題は、ロックを解除してポンまたはじゃんけん/トカゲ/スポックを再生したり、ワイヤレスネットワークをスキャンしたり、アニメーションを実行したりできます。

 

バッジハードウェアは次のとおりです

  • – ESP8266
  • –128× 64OLED SPIディスプレイ
  • –8つのUIボタン// 1つのリセットボタンと1つのプログラムボタン(バッジの背面)
  • – IRレシーバーとトランスミッター
  • –5 ‘レベル’ LED + 1 ‘派閥のRGB LED
  • – 600mah LIPO + USB経由で充電する充電回路

M5Stack Thermal Camera

Published by:

AMG8833を利用したThermal Camera を 試作しました。

AMG8833:赤外線アレイセンサ Grid-EYE

説明
1. パナソニックのセンサーです。
2. 8 x 8赤外線グリッドアレイ(64ピクセル)。
3. 0℃〜80℃ の 範囲の温度を+ 2.5℃ の精度で測定します。
4. 最大7メートル の距離から人間を検出することができます。
5. 最大フレームレート10Hzで、独自の人感センサーやミニサーマルカメラ作成に最適です。
6. センサーはI2Cを介して通信します。
7. 人の活動を検知して、エアコンや照明を制御。 自動ドアやエレベータで人を検知に最適です。

 

M5Stack

M5Stackは、320 x 240 TFTカラーディスプレイ、microSDカードスロット、スピーカーを備えたコンパクトで便利な開発モジュールです。ESP32を搭載しているため、Wi-FiおよびBluetooth通信を扱え、Arduino環境での開発が可能です。

ソースコード

最初のソースコードはhkoffer / M5Stack-Thermal-Camera-:AMG8833 8×8 を補完し 24×24 で実現。こちらすべて収める3Dケースのデータがあるので、いつかプリントしたい。

実際利用したのは、m600x の機能アップ版 :  https://github.com/m600x/M5Stack-Thermal-Camera

参考記事:

M5Stack Thermal Camera Part 2

ESP32-CAMをテスト

Published by:

Aliexpressで昨年8月購入した5ドル+送料の激安 ESP32-CAMは放置したまま、冬休み期間テストしてみることに。

配線

ESP32-CAM自体シリアルーUSB通信機能がないので、プログラムを書き込んだりするためにはUSB/TTLシリアルコンバーターが必要になる。300円でAmazonから購入した、Raspberry Pi ラズベリーパイ用の USB-TTLシリアルコンソールのUSB変換COMケーブルモジュールのケーブル を使用した。黒い台はDonkeyCar 車台の不良品を利用。黄色テープも地面にDonkeyCarのトラックを作る際用意したもの。

IMG_3272

配線部分を拡大した写真です。青い線は、書き込み時には、ESP32-CAMのIO0とGNDをショートして行う。

USB-TTL ESP32-CAM
TXD ( 緑 ) UOR
RXD ( 白 ) UOT
( IO0 – GND )
5V 5V
GND GND

 

IMG_3266

プログラム

ボードマネージャーを使用してESP32ボードを追加する必要があります。

これを完了すると、Arduino IDEボードマネージャーにESP32ボードのリストが表示されます。このリストからA-Thinker ESP32-CAMボードを選択します。

使用するサンプルスケッチは、CameraWebServerスケッチです。次のようにロードできます。

  • Arduino IDEを開きます
  • トップメニューバーの[ファイル ]メニュー項目をクリックします。
  • 下にスクロールして、[  ]をクリックします。サブメニューが開きます。
  • サブメニューを下にスクロールして、Example for A-Thinker ESP32-CAMを探します。
  • この下には、ESP32のエントリが表示されます。それをクリックすると、別のサブメニューが開きます。
  • このサブメニューからカメラを選択します。
  • CameraWebServerを選択します

このスケッチはESPO32-CAMをフル機能のオンラインカメラに変え、顔検出機能と豊富なコントロールを完備しています。これは、ESP32-CAM機能の非常に印象的なデモです。

スケッチを使用する前に、ネットワークに合わせてスケッチを修正し、正しいESP32モジュールを選択する必要があります。

  • 「カメラモデルの選択」という行の下で、ボードの正しいエントリを選択する必要があります。私が使用したもの(そして最も人気のあるもの)はCAMERA_MODEL_AI_THINKERです
  • その下に、SSIDの行が表示されます。ここにネットワークのSSIDを入力します。
  • SSIDの下の行にネットワークアクセスパスワードを入力します。

ESP32-CAMは2.4 GHz WiFiネットワークでのみ機能することに注意してください。

スケッチのコンパイルには時間がかかる場合がありますが、これは正常です。完了したら、USBケーブルを取り外し、ジャンパー線を取り外してから、USBケーブルを再接続して、ボードの電源を再びオンにします。

シリアルモニターを開き、ボーレートが115,200 bpsに設定されていることを確認します。次に、ESP32-CAMモジュールのリセットスイッチを押します。

初期化情報に続いて、ボードがネットワークに接続し、IPアドレスを取得したことを示すメッセージが表示されます。IPアドレスは、http://192.168.0.180などのURLの形式になります。

このアドレスをコピーして、Webブラウザーのアドレスバーに貼り付けます。Webブラウザーは、ESP32-CAMが接続されているのと同じネットワーク上にある必要があります。

操作

ブラウザで、いろいろ操作できそう。

これで、カメラのWebページが表示され、いくつかのコントロールが表示されます。 

[ストリームの開始]ボタンをクリックして、ビデオをストリーミングします。画面上部のドロップダウンを使用して、ビデオのサイズとフレームレートを変更できます。

一応、顔の登録と認識までできたが、後日また補足する。

電源

ESP32は非常に低いスタンバイ電流で動作できますが、無線の動作時に大量の電流を消費するため、WiFiとBluetoothの両方のパフォーマンスに影響を与える可能性があります。

電源の問題があるかどうかを判断する1つの方法は、ESP32-CAMの起動時にシリアルモニターを観察することです。「ブラウンアウト状態」が検出されたというメッセージが表示された場合は、ESP32-CAMが供給できる電流よりも多くの電流を引き込もうとしている可能性があります。

参考

ESP32-CAM Video Streaming and Face Recognition with Arduino IDE