[Arduino]ESP-WROOM-32 で相互通信

ここが詳しいです。
https://www.mgo-tec.com/arduino-core-esp32-install

秋月電子さんのボードはちょっと幅をとるので、
こちらを使ってみました。

技適はついてますが、本物かどうかは不明(確認する方法を知りたい。)。普通のブレッドボードにさして余裕があります。

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

void loop() {
  digitalWrite(4, HIGH);
  delay(1000);
  digitalWrite(4, LOW);
  delay(1000);
}

Lチカしました。回路図は、この商品だと説明画像があります。

 

 

 

[Arduino] ESP-WROOM-02でLチカ

ESP-WROOM-02は、WiFi接続できます。

セットアップは、ここが詳しいです。

ESPr Developer ( ESP-WROOM-02 開発ボード )の使い方をザッと紹介

Lチカと同じように接続し、
次のプログラムを書くと、LEDが点滅するはずです。

int pin = 13;
void setup() {
  pinMode(pin, OUTPUT);
}
void loop() {
  digitalWrite(pin, HIGH); 
  delay(1000); 
  digitalWrite(pin, LOW);  
  delay(1000); 
}

 

[Arduino] OLEDで「在室」表示(2)

OLEDで「在室」表示(1)で、ちょっと残念な在室表示になりました。スクロールも挙動がおかしいです。
そこで、まずは、改良版です。

「在」、「室」、「不」の文字を48×48 2色のbitmap形式で保存し、コンバーターで変換しておきます。格好悪いですが、とりあえず、それぞれ、zai, situ,huとしておきます。

これを、コンパイルして書き込むと、上部にWelcomeと下部に在室が表示されます。

次に、ブレッドボードにタクトスイッチをつけます。
以下のような配線になります。

setupの前に次を書きます。

int SWITCH_PIN = 2;
int mode=0;
int x=0;

setupの中に次を書きます。

pinMode( SWITCH_PIN, INPUT );

loopに次のように書きます。

if( digitalRead( SWITCH_PIN ) == 1 && mode==0) {
mode=1;
delay(1000);
}
if( digitalRead( SWITCH_PIN ) == 1 && mode==1) {
mode=0;
delay(1000);
}
if(x<-128) {x=128;}
if (mode==0) {
不在の命令
}
if (mode==1) {
在室の命令}
}

 

[Arduino] OLEDで「在室」表示(1)

OLEDで表示するで、OLEDにAdafruitのデモ画面を表示しました。
今回は、タクトスイッチを使って、「在室」「不在」を表示する、プログラムを作ります。(研究室にほしいから)

在室、不在は、日本語ですので、日本語フォントが必要です。しかし、メモリ領域が小さいArduinoに日本語表示させるのは酷です。Adafruitのデモですでに、メモリが少ないと警告が出ているはずです。
そこで、在室、不在の4文字ならば、画像として表示させようというのが今回の意図です。

こちらも参考
https://learn.adafruit.com/monochrome-oled-breakouts/arduino-library-and-examples

http://lcd-assistant.software.informer.com/

からlcdassistant.zipをダウンロードします。

テキストエディタなどで「在室」と入力し、コピーしてirfanviewなどの画像編集ソフトに貼り付けます。
BITMAP形式で、128×64以下、2色になるように調整して、bmp形式で保存します。
lcdassistant.exeを起動し、保存したbmpファイルを開き、適当なファイル名でiruyo.cppで保存します。

OLEDで表示するで、接続がきちんとされていて、OLEDにAdafruitのデモ画面が表示されていることを確認しましょう。

デモファイルから余分なのを消して、ここに貼り付けるに、先ほどできたファイルをテキストエディタで開き、コードを貼り付けます。

省略
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
const unsigned char PROGMEM iruyo [] = {
ここに貼り付ける
};
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
int x = 0;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
display.clearDisplay();
}
void loop() {
if (x < -128) {x=128;}
display.drawBitmap(x,0, iruyo, 128,64, WHITE);
display.display();
display.clearDisplay();
x=x-2;
}

コンパイルして書き込めば表示されるはずです。ちなみに、OLEDはその特性上、ずっと表示していると焼き付くので、このようにスクロールさせるか、スクリーンセーバーを起動する。画面を消すなどの処置が必要です。

あと、2色の画面を購入するとこんなふうに残念なことになります。

上部の黄色の部分を電波の強度や時刻を表示して、下部の青い部分に文字を表示するとよいかもしれませんね。

[Arduino] 温度、湿度、気圧を測る

温度、湿度、気圧を測ってみましょう。
本当は、

http://akizukidenshi.com/catalog/g/gK-09421

https://www.switch-science.com/catalog/2236/

だと間違いないのですが、取り合えず、以下の商品を使いました。

は、温度、湿度、気圧をはかることができます。似た商品で、温度のみの商品があるので、注意しましょう。
https://ht-deko.com/arduino/i2c_bme280.html

3.3V専用です。
I2Cの場合
BME-UNO
——-
VCC-3.3V
GND-GND
SCL-SCL
SDA-SDA
CSB-未接続
SD0-GND

SPIの場合
BME-UNO
VCC-5V
GND-GND
SCK SCL-13 SCK
MOSI SDA- 11 MOSI
SS CSB -10 SS
MISO SD0 -12 MISO

アドレスは0X76になります。IC2の場合は、コードのアドレスの変更が必要です。

SpeakFan のBME280をインクルードして
I2C and SPI multisensor のサンプルファイルをコンパイルして書込。
シリアルモニタを59600にすると、温度、湿度、気圧が表示されます。

[Arduino] I2Cのアドレスの調べ方

I2C機器は接続が非常に便利です。PCのIPアドレスのように、アドレスが用意されていて機器を区別することができます。

I2Cのアドレスが分からない場合は、次のようにして調べます。
https://playground.arduino.cc/Main/I2cScannerへ行き、書いてあるプログラムを

新規ファイルので貼り付けて、
IC2_scannerというファイル名で保存します。
I2C機器とArduinoを接続してコンパイル、書込で実行し
シリアルモニタを開き、9600bpsを選ぶと、
I2Cのアドレスが表示されます。

[Arduino] OLEDで表示する

液晶ディスプレイは、16×2で、非常に古風な上、配線が面倒でした。
そこで、OLED(有機液晶)を使っていきたいと思います。
最近では、家電やスマホでも普及してきましたが、自発光型で、見やすいのが特徴です。

などの商品ですね。I2C通信の方を選んでください。
接続はシンプルです。
OLED-UNO
SCL -SCL
SDA -SDA
VCC -5V
GND -GND

次に、ライブラリを入れます。
[スケッチ]-[ライブラリのインクルード]-[ライブラリの管理]を開き
検索に「Adafruit」と入力し、
「Adafruit SSD1306」と「Adafruit GFX Library」をインストールします。

こちらの商品は、互換品なので、そのままでは動かないと思います。
裏面を見て、I2Cのアドレスがあります。アドレスの調べ方はこちら

0x3cならば、

Adafruit_SSD1306.hを開いて、以下を変更します。

#define SSD1306_I2C_ADDRESS 0x3C // 011110+SA0+RW - 0x3C or 0x3D

サンプルファイルを開きます。
[スケッチ例]-[Adafruit SSD1306]-[ssd1306_128x64_i2c]
こちらもアドレスを変更します。

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)

コンパイルして、書き込むと、Adafruitのロゴやデモが出るかと思います。

このOLEDは上部と下部とで色が違うバージョンです。同一でも、上部と下部の間に若干隙間があります。

SPIの場合

https://ht-deko.com/arduino/oled_spi.html

より、
OLED – UNO
GND – GND
VCC – 3V3
D0 – 10
D1 – 9
RST – 13
DC – 11
CS – 12

で接続すればうまくいくはずです。

[Arduino] 自作時計を作ろう

第7回で、自作Arduinoを作り、時刻の取得をして、液晶の表示ができました。
これを一つにまとめて、時計を作ってみましょう。

まず、自作Arduinoを準備します。ただし、ブレッドボードは大きめを使ってください。なぜならば、端子が足りないからです。

以下のように作成し、ブートローダーまで書込んでください。

次にtinyRTC(DS1306)を接続しましょう。

マイコンのアドレスはこの通りです。ところが、SCL, SDAがありません。
SCLをA5, SDAをA4とすることで対応できます。

従って次のように配線しましょう。

最後に液晶ディスプレイですです。

次にプログラムです。
サンプルプログラムを元に書くとこうなるでしょう。

#include
#include
#include "RTClib.h"
RTC_DS1307 rtc;
const int rs = 12, rx = 11, en = 10, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, rx, en, d4, d5, d6, d7);
void setup() {
Wire.begin();
rtc.begin();
lcd.begin( 16, 2 ); // 16文字×2行
lcd.clear();
// put your setup code here, to run once:
if (! rtc.isrunning()) {
// following line sets the RTC to the date &amp; time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
char buffer[20];
sprintf(buffer, "%4d/%02d/%02d", now.year(), now.month(), now.day());
lcd.setCursor(0,0);
lcd.print(buffer);
sprintf(buffer, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
lcd.setCursor(4,1);
lcd.print(buffer);
}

 

 

コンパイルして書き込むと、液晶に時計が表示されます。

写真では固いジャンパーワイヤーをまとめたり、液晶の裏に配線を回したりしていています。電源はUSBケーブルでとっています。

[Arduino] 液晶ディスプレイに表示

毎回、結果をシリアルモニタで見るのは面倒です。
そこで、液晶モニタに結果を表示してみましょう。
今回は、液晶モニタ SD1602を使います。
http://akizukidenshi.com/catalog/g/gP-02985/

液晶の裏面のピンの番号を確認しましょう。私のは、裏面から見ると
15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14
です。順番になっていないので注意が必要です。
裏返すと反対になるので気をつけてください。

次に配線の対応です。
LCD Arduino
1 VSS GND
2 VDD 5V
3 Voコントラスト調整
4 RS 12
5 R/W 11
6 Enable 10
11 DB4 5
12 DB5 4
13 DB6 3
14 DB7 2
15 バックライト+
16 バックライト-

バックライトLEDを光らせるためには、抵抗(100-200Ω)が必要です。抵抗を挟まないと、LEDが吹っ飛びます。(吹っ飛ばしてしまいました。)
Voは半固定抵抗につなげます。
http://akizukidenshi.com/catalog/g/gP-08012/

これを元に
配線してみましょう。

次にスケッチ例のLiquidCrystalのHelloWorldを選択します。
48行目あたり、修正します。

// 修正前 const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
// LiquidCrystal lcd(rs, en, 10, d4, d5, d6, d7);
//修正後
// 修正前 const int rs = 12, rw = 11, en = 10, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
// LiquidCrystal lcd(rs, rw, en, d4, d5, d6, d7);

これで表示されるはずです。しかし配線が多いですね。。。