Category Archives: NodeMcu

NodeMcu (4) ADS1115 & OLED

経緯

アナログ信号を取り込み、TinyWebDBへ送るプログラムを作る予定。サンプリングレートは秒に100回。

WeMos miniは使いやすいから愛用しているが、2月から、WeMos miniの開発中も頻繁にリブートしています。デバイストライバのバージョンを変えたり、OSを変えたりしても改善しない。結局原因がわからず、仕方なく開発中書き込み直前にUSBケーブル接続、書き込み終わったらすぐUSBケーブ抜く方法で運がよければリブート回避する状態が続て、悩んでいます。

DS1115プログラムを作るため、安定したNodeMcuできることならこちらで凌ぎ。

DS1115とは

DS1115 は、16-Bit ADC – 4 Channel with Programmable Gain Amplifier
特徴:広い電源電圧範囲:2.0V ~ 5.5V。低消費電流: 連続モード:150μA。
_ プログラマブルゲインアンプ内蔵。プログラミング可能なコンパレータ。
_ 4本のシングルエンド入力。2本の差動入力。I2Cインターフェイス。
_ 最小±256mVから電源電圧までの入力範囲に対応。

ライブラリーでは コマンド送信し 8msec 後に データーの読み込みを行う、サンプリングレートは秒に100回するため、Adafruit_ADS1X15/Adafruit_ADS1015.hのADS1115_CONVERSIONDELAYを8から9に変更する。

結線

普通のI2Cでつなぐだけ。

スケッチ

最初のプログラムは、アナログ読む度に表示してるが、表示できるのは秒に十回未満。そしてOLEDには、1秒間読み取れたデータの個数と、最新のアナログ値を表示すると変更して110回程度読み込みできるようになり。

ADS1115_CONVERSIONDELAYを8から9に変更して、表示の通り、秒に101回って、概ね要求に満たした。

#include <Wire.h>
#include <Adafruit_ADS1015.h>               // ADS1015,1115
Adafruit_ADS1115 ads(0x48);                 // 16-bit version
#include <Adafruit_GFX.h>                   // OLED
#include <Adafruit_SSD1306.h>           // OLED 
Adafruit_SSD1306 display(0);                // OLED Reset
 
void setup(void) {
  //Serial.begin(115200);
//  Wire.begin(4,5);                          // OLED:SDA,SCL
  display.begin(SSD1306_SWITCHCAPVCC,0x3c); // I2C ADDRESS=3c
  display.clearDisplay();                   // Clear the buffer
  display.setTextSize(2);                   // font size 4
  display.setTextColor(WHITE);              //
  display.setCursor(0,0);                   //
  ads.setGain(GAIN_TWOTHIRDS);              // 2/3x gain +/-6.144V
  ads.begin();                              // 1 bit=0.1875mV
}
 
void loop(void) {
  int i=0;
  float v0;
  // // Count and Store data during 1,000 msec
  for(int time = millis(); millis()-time < 1000; i++) {
    v0 = (ads.readADC_SingleEnded(0) * 0.1875/1000); // A0 Read
  }
  display.clearDisplay(); 
  display.setCursor(0,0);
  display.print(i);
  display.setCursor(0,16);
  display.println(v0,3);
  display.display(); 
}

 

参考

  1. https://macsbug.wordpress.com/2016/02/04/i2c-adc-ads1115-in-esp8266/

NodeMcu (3) Weather Station

この一週間WeMos miniのWiFi関連の開発中も頻繁にリブートしています。あまりにも回数が多いから、いつの間にchromeのたくさんの開いたタブも消えて復帰不能になりました。Macbook, Win10どちらも頻繁に発生。

原因がわからず、仕方なく開発中書き込み直前にUSBケーブル接続、書き込み終わったらすぐUSBケーブ抜く方法で運がよければリブート回避する状態が続て、悩んでいます。

気分転換に、IoT-Cloud-Mobile Kitに、Weather Station機能を組み入れると考えて、これも苦労の連続。

もともとWeather Station Kitは、NodeMcu V2とOLED, DHT11のセットになっている。IoT-Cloud-Mobile Kitは、Wemos MiniとOLED, BMP280のセットになっている。

IoT-Cloud-Mobile Kit Weather Station Kit
MPU Wemos Mini NodeMcu V2
OLED 128X64 OLED 128X64 OLED
Sensor BMP280  DHT11

最初は、WemosらしいのWeather Station ソースコードを改造して、IoT-Cloud-Mobile Kitで動くを考えたが、理由不明のリブートでやる気を無くされ、もうWeather Station Kitのまま部品を用意して、まず動かしてみることに。

I2CのOLED端子配列2種類があり:

  1. VCC,GND,SCL,SDA (Wemos, BMP180, BMP280バス直結可能)
  2. GND,VCC,SCL,SDA (NodeMcu直結可能)

IoT-Cloud-Mobile Kitでは、BMP280バス直結のため、1番目のOLED端子配列が欲しくて、商品写真見てこれだと、高めのOLED物を購入したが、結局送ってきたのは2番目のOLED物。

今度繋がってみたらわかった、2番目のOLED端子配列なら、嬉しいことに、NodeMcu直結可能。

つまり、1番目のOLED端子配列はWemos向き、2番目のOLED端子配列はNodeMcu向きと言える。

接線 (Wiring) NodeMCU –> OLED

  1. NodeMCU GND –> OLED GND
  2. NodeMCU 3.3V —> OLED Vcc
  3. NodeMCU D4 —-> OLED SCL
  4. NodeMCU D3 —-> OLED SDA

手元に余ってるはDHT22、それで試すことに。OLEDが邪魔で、D8に繋いで見た。

しかし上手くプログラム書き込めないので、DHT22を外したら、プログラム書き込めて、動いた。

また下記のセッティングは、自分の環境に合わせて設定。

* Begin Settings
const char* WIFI_SSID = "xxxx"; // your ssid
const char* WIFI_PWD = "xxxx"; // your password
const int I2C_DISPLAY_ADDRESS = 0x3c; // OLED I2C address
const int SDA_PIN = 13; // I2C OLED SDA
const int SDC_PIN = 14; // I2C OLED SCL
const float UTC_OFFSET = 9; // JST = +9
const String WUNDERGRROUND_API_KEY = "xxxxx"; // WUNDERGROUND API KEY
const String WUNDERGROUND_COUNTRY = "JP"; // japan
const String WUNDERGROUND_CITY = "Tokyo"; // tokyo
const String THINGSPEAK_CHANNEL_ID = "xxxxx"; // ThingSpeak CHANNEL
const String THINGSPEAK_API_READ_KEY = "xxxxx"; // ThingSpaek API KEY

OLEDの表示を上下逆にするには、void setup() の display.clear(); と ui.init(); の次にdisplay.flipScreenVertically(); を入れる。

NodeMcu (2) LED Light Strips

クリスマスと新年の気分を出すため、LED Light Stripsを買った。しかし固定のパターンの点滅しかできないから厭きるね。

Raspberry Pi またはArduinoでコントルートできれば、何かいい物作れるではないからと考えた。

Arduinoできるなら安上がりなので、まず試す。LED Light Stripsは12V駆動なので、USB給電のWemosではなく、手元にあるNodeMcu V3 (電源拡張ボード付き)を活用することにした。

LED Light Stripsの電流が大きいので、GPIOの負荷能力を超え、直結できない。

Googleして、OmegaのLED lightstripsに繋ぐ回路があったので、それを真似してArduinoのつくる。

LED Probe2.png

手元に2N3904がないんで、ネットで購入。届くまで時間がかかるので、届いた頃も他の件で時間が取られ、半年以上棚上げ。

クリスマスも目の前だから、ハードウェアの回路を完成した。

プログラムの方は、簡単。

#define LEDR D7
#define LEDG D6
#define LEDB D8

void setup() 
{
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
}

void loop() 
{
  digitalWrite(LEDR, HIGH);
  delay(1000);
  digitalWrite(LEDG, HIGH);
  delay(1000);
  digitalWrite(LEDB, HIGH);
  delay(1000);
  digitalWrite(LEDR, LOW);
  delay(1000);
  digitalWrite(LEDG, LOW);
  delay(1000);
  digitalWrite(LEDB, LOW);
  delay(1000);
}

閃っている様子

 

 

NodeMcu (1) install & blink

NodeMCUとは

NodeMCUは、WeMosと同じコンセプトの開発ボードだ が、メインチップは ESP-12Eが使われている。

NodeMCUの種類

主に「LoLin NodeMCU」 「Amica NodeMCU」などがある。

WeMos、Lolin、Amica比較

WeMosD1 mini, AmicaのNodeMCUは小さいので、ブレッドボード1枚で使うことができ、Lolinは2枚ブレッドボードまたは専用のアダプターが必要。

WeMos
D1 mini
NodeMCU
Lolin Amica
MCU ESP-12 ESP-12E ESP-12E
ディジタルIO 11ピン 11ピン 12ピン
アナログIO 1ピン 1ピン 1ピン
3.3V出力 1ピン 3ピン 3ピン
5V入力(*3) 1ピン 1ピン 1ピン
USB出力(*5) 1ピン 1ピン なし
GNDピン 1ピン 4ピン 3ピン
SPI専用ピン なし あり あり
オンボードLED なし なし あり

 

Setup Arduino IDE

Arduino IDEがまたインストールしてないの場合、つかうPCにより、下記の何れを参考にArduino IDEのインストールする。

NodeMCUの種類により、USBシリアル変換チップに対応するドライバのインストールが必要。

「LoLin NodeMCU」

USBシリアル変換チップ:CH340 (WeMosと同じ)

UNO互換機を使っている方は、特に何も必要ないが、今まで互換機を使ったことが無い方はWeMosのホームページからCH340のドライバー(CH341SER_MAC.ZIP)をインストールする必要がある。

http://www.wch.cn/download/CH341SER_ZIP.html

「Amica NodeMCU」

USBシリアル変換チップ:CP210x

シリアル変換:CP2102のため、ドライバーのインストールが必要。

Silicon Labsの以下のURLから「Windows 7/8/8.1/10用」ドライバをダウンロード
USB – UART ブリッジ VCP ドライバ|Silicon Labs
ダウンロードしたZIP(CP210x_Windows_Drivers.zip)を展開し、CP210xVCPInstaller_x64.exeを実行し、ドライバインストールを開始する。

Blink