Arduino勉強会/0T-ESP8266でI2Cを試す
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[Arduino勉強会]]
#contents
2016/01/03からのアクセス回数 &counter;
** LM73 [#qc8149fe]
I2Cの動作確認は、いつも使っている温度センサーLM73でテスト...
((このLM73は、エレキジャックNo.8「一冊まるごとマイコン入...
LM73は入手が難しいとのご指摘がありますので、後ほど秋月で...
プログラムの動作確認は自分が一番経験のある部品でするのが...
*** ピン接続 [#ua183185]
ピンの配置1番ピンから反時計回りに採番
| ピン番号 | 機能 | Arduinoのピン |h
| 1 | 未使用 | - |
| 2 | GND | GND |
| 3 | 3.3V | 3.3V |
| 4 | SCL | A5 |
| 5 | 未使用 | - |
| 6 | SDA | A4 |
Arduinoとの接続は以下の様になります。
&ref(Arduino_LM73.png);
*** スケッチ [#wf781ebb]
今回は、
[[初心者の電子の館>http://fromgoldenwells.blog.so-net.ne....
のスケッチを使わせて頂きました。
Wireライブラリは古いバージョンだったので、少し修正しまし...
#pre{{
#include "Wire.h"
#define LM73_ADDR 0x4c // 2進数なら 1 0 0 1 1 ...
int ret;
void setup() // run once, when the ske...
{
Wire.begin();
Serial.begin(9600);
delay(1000); // デバック用
Wire.beginTransmission(LM73_ADDR);
Wire.write((byte)0x04); // Control/Status Registerを選択
Wire.write(0x60); // 14 bits modeにセットする
ret=Wire.endTransmission();
Wire.beginTransmission(LM73_ADDR);
Wire.write(0x00); // 次の通信のため温度レジスタ...
ret=Wire.endTransmission();
delay(100); // 次の読み取りまで念のため0.1秒間をあける
}
void loop() // run over and over again
{
int data=0 ;
Wire.beginTransmission(LM73_ADDR);
ret=Wire.requestFrom(LM73_ADDR, 2);
data = 0;
if (Wire.available()) {
data = Wire.read();
} else {
Serial.println("Wire not available.");
}
if (Wire.available()) {
data = (data << 8 )| Wire.read() ;
}
ret=Wire.endTransmission();
printdata(data); // シリアルへ温度データを送る
delay(2000);
}
void printdata(int data){
int data2;
int data3;
float data_f;
boolean negative=false;
if (data < 0 ) { // マイナスならbooleanにtrueをセット...
negative=true;
data = -data;
}
data2 = data >> 7; // 小数値切り捨て
data_f = (float)(data >> 2 ) / 32;
data_f = data_f - data2 ;
data3 = data_f * 100 ;
Serial.print ("Current temperature is ");
if (negative) {
Serial.print("-");
}
Serial.print(data2);
Serial.print(".");
Serial.print(data3/10);
Serial.print(data3 % 10);
Serial.println(" C. ");
}
}}
どういうわけか、シリアルモニターは9600ボーの半分4800ボー...
文字化けしました。
&ref(9600baud.png);
不思議なことに4800ボーにセットすると正しく読み取れます。
&ref(4800baud.png);
** ESP8266でLM73を使う [#l150ee96]
ArduinoでのLM73の動作が確認できたので、LM73をESP8266に接...
*** I2C用のピンについて [#u33c3cc6]
ネットで調べるとESP8266のI2C用のピンが色々変わっていて混...
macsbugさんの
[[ESP8266 と I2C>https://macsbug.wordpress.com/2015/10/23...
によると、0,2,4,5,12,13,14のすべてのピンの組み合わせでI2C...
今回は、SCL=IO14、SDA=IO4を使用することにしました。
| ピン番号 | 機能 | ESP8266のピンNo |h
| 1 | 未使用 | - |
| 2 | GND | 9 (GND) |
| 3 | 3.3V | 1 (3.3V) |
| 4 | SCL | 3(IO14) |
| 5 | 未使用 | - |
| 6 | SDA | 10(IO4) |
ESP8266のWireを使う場合、最初にI2Cに使用するピンをsetupで...
#pre{{
void setup() {
Wire.begin(4, 14); // begin(SDA, SCL);のように指定
}}
** ESP8266でLBEDを使ってみる [#j38fae6b]
Arduino版LBEDは、I2CのWire関連をライブラリの外に出すこと...
ESP8266版Arduino IDEでも使うことができるようになりました。
*** 秋月で購入できる温度センサーADT7410を使う [#d58f373c]
ADT7410とESP8266との接続には、ESP8266版lbeDuinoのD8(SDA...
ADT7410のSDA、SCLをそれぞれ接続します。
ADT7410にモジュール内にプルアップの抵抗が付いていますが、...
&ref(ESP8266_ADT7410.png);
ADT7410のライブラリには、
Tom Kreycheさんがmbed用に公開されている
[[ADT7410ライブラリ>https://developer.mbed.org/users/tkre...
を使わせてもらいます。
ADT7410ライブラリの修正箇所は、ADT7410.hのmbed.hのインク...
#pre{{
// #include "mbed.h"
#include "lbed.h"
}}
スケッチは、以下の様にします。たったこれだけでADT7410温度...
#pre{{
#include "Wire.h"
#include "lbed.h"
#include "ADT7410.h"
ADT7410 healthThemometer(D8, D9, 0x90, 400000);
void setup() {
Wire.begin(4, 14); // Wire.begin();
Serial.begin(9600);
healthThemometer.setConfig(ONE_SPS_MODE);
}
void loop() {
float temp = healthThemometer.getTemp();
Serial.print("Current temperature is ");
Serial.print(temp, 2);
Serial.println(" C. ");
wait_ms(1000);
}
}}
*** I2CLcdシールド [#ef840150]
ESP8266版lbeDuinoは、使えるピンが少ないので、Arduinoピン...
D2をD12に、D3をD5に付け替えて実行します。
&ref(I2CLcd.png);
スケッチは、以下のとおりです。
#pre{{
#include "Wire.h"
#include "lbed.h"
#include "AQCM0802.h"
// D13番ピンにLEDを接続
DigitalOut led(D13);
// D8番ピンSDA, D9番ピンSCL. ArduinoではハードI2Cを使用し...
AQCM0802 lcd(D8, D9);
// タクトスイッチ
DigitalIn sw1(D5);
DigitalIn sw2(D12);
void setup() {
// ESP8266では、D8に4(SDA), D9に14(SCL)が接続さ...
Wire.begin(4, 14); // Wire.begin(); sw1.mode(...
sw2.mode(PullUp);
lcd.setup();
lcd.print("I2C LCD");
}
void loop() {
led = !led;
lcd.locate(0, 1);
if (!sw1) {
lcd.print("SW1 On ");
}
else if (!sw2) {
lcd.print("SW2 On ");
}
else {
lcd.print("All Off");
}
wait_ms(1000);
}
}}
*** BME280温度・湿度・気圧センサ [#m3d9bfae]
I2CLcdが動けば、その他のI2Cセンサも動くはずです。
&ref(BME820.png);
#pre{{
#include "Wire.h"
#include "lbed.h"
#include "AQCM0802.h"
#include "BME280.h"
// D13番ピンにLEDを接続
DigitalOutled(D13);
// D8番ピンSDA, D9番ピンSCL
AQCM0802lcd(D8, D9);
BME280sensor(D8, D9);
// タクトスイッチ
DigitalIn sw1(D5);
DigitalIn sw2(D12);
intlast_mode = 0;
chardegree = 0xdf;
void setup() {
// ESP8266では、D8に4(SDA), D9に14(SCL)が接続さ...
Wire.begin(4, 14); // Wire.begin();
sw1.mode(PullUp);
sw2.mode(PullUp);
lcd.setup();
sensor.setup();
lcd.locate(0, 0); lcd.print("BME280");
lcd.locate(0, 1); lcd.print("Demo");
wait_ms(2000);
}
void loop() {
led = ! led;
if (sw1 == 1) {
if (last_mode == 0)
lcd.cls();
lcd.locate(0, 0);
lcd.print(sensor.getTemperature(), 2);
lcd.print(degree); lcd.print("C");
lcd.locate(0, 1);
lcd.print(sensor.getHumidity(), 2); lcd.print("%");
last_mode = 1;
}
else {
if (last_mode == 1)
lcd.cls();
lcd.locate(0, 0);
lcd.print(sensor.getTemperature(), 2);
lcd.print(degree); lcd.print("C");
lcd.locate(0, 1);
lcd.print(sensor.getPressure(), 2); lcd.print("hP...
last_mode = 0;
}
wait_ms(1000);
}
}}
** ESP8266版LBEDソース [#u8fa0b69]
ESP8266版で使ったlbedライブラリのソースを添付します。
ユーザのArduino用ディレクトリ/librariesに以下を展開して、
lbeDuino, lbeDuinoUserをコピーしてください。
- &ref(Arduino_lbed.zip);
** まだ途中ですが公開します。 [#n5d14668]
#vote(おもしろかった[5],そうでもない[0],わかりずらい[0])
皆様のご意見、ご希望をお待ちしております。勉強会で分から...
スパム防止に画像の文字列も入力してください。
#comment_kcaptcha
終了行:
[[Arduino勉強会]]
#contents
2016/01/03からのアクセス回数 &counter;
** LM73 [#qc8149fe]
I2Cの動作確認は、いつも使っている温度センサーLM73でテスト...
((このLM73は、エレキジャックNo.8「一冊まるごとマイコン入...
LM73は入手が難しいとのご指摘がありますので、後ほど秋月で...
プログラムの動作確認は自分が一番経験のある部品でするのが...
*** ピン接続 [#ua183185]
ピンの配置1番ピンから反時計回りに採番
| ピン番号 | 機能 | Arduinoのピン |h
| 1 | 未使用 | - |
| 2 | GND | GND |
| 3 | 3.3V | 3.3V |
| 4 | SCL | A5 |
| 5 | 未使用 | - |
| 6 | SDA | A4 |
Arduinoとの接続は以下の様になります。
&ref(Arduino_LM73.png);
*** スケッチ [#wf781ebb]
今回は、
[[初心者の電子の館>http://fromgoldenwells.blog.so-net.ne....
のスケッチを使わせて頂きました。
Wireライブラリは古いバージョンだったので、少し修正しまし...
#pre{{
#include "Wire.h"
#define LM73_ADDR 0x4c // 2進数なら 1 0 0 1 1 ...
int ret;
void setup() // run once, when the ske...
{
Wire.begin();
Serial.begin(9600);
delay(1000); // デバック用
Wire.beginTransmission(LM73_ADDR);
Wire.write((byte)0x04); // Control/Status Registerを選択
Wire.write(0x60); // 14 bits modeにセットする
ret=Wire.endTransmission();
Wire.beginTransmission(LM73_ADDR);
Wire.write(0x00); // 次の通信のため温度レジスタ...
ret=Wire.endTransmission();
delay(100); // 次の読み取りまで念のため0.1秒間をあける
}
void loop() // run over and over again
{
int data=0 ;
Wire.beginTransmission(LM73_ADDR);
ret=Wire.requestFrom(LM73_ADDR, 2);
data = 0;
if (Wire.available()) {
data = Wire.read();
} else {
Serial.println("Wire not available.");
}
if (Wire.available()) {
data = (data << 8 )| Wire.read() ;
}
ret=Wire.endTransmission();
printdata(data); // シリアルへ温度データを送る
delay(2000);
}
void printdata(int data){
int data2;
int data3;
float data_f;
boolean negative=false;
if (data < 0 ) { // マイナスならbooleanにtrueをセット...
negative=true;
data = -data;
}
data2 = data >> 7; // 小数値切り捨て
data_f = (float)(data >> 2 ) / 32;
data_f = data_f - data2 ;
data3 = data_f * 100 ;
Serial.print ("Current temperature is ");
if (negative) {
Serial.print("-");
}
Serial.print(data2);
Serial.print(".");
Serial.print(data3/10);
Serial.print(data3 % 10);
Serial.println(" C. ");
}
}}
どういうわけか、シリアルモニターは9600ボーの半分4800ボー...
文字化けしました。
&ref(9600baud.png);
不思議なことに4800ボーにセットすると正しく読み取れます。
&ref(4800baud.png);
** ESP8266でLM73を使う [#l150ee96]
ArduinoでのLM73の動作が確認できたので、LM73をESP8266に接...
*** I2C用のピンについて [#u33c3cc6]
ネットで調べるとESP8266のI2C用のピンが色々変わっていて混...
macsbugさんの
[[ESP8266 と I2C>https://macsbug.wordpress.com/2015/10/23...
によると、0,2,4,5,12,13,14のすべてのピンの組み合わせでI2C...
今回は、SCL=IO14、SDA=IO4を使用することにしました。
| ピン番号 | 機能 | ESP8266のピンNo |h
| 1 | 未使用 | - |
| 2 | GND | 9 (GND) |
| 3 | 3.3V | 1 (3.3V) |
| 4 | SCL | 3(IO14) |
| 5 | 未使用 | - |
| 6 | SDA | 10(IO4) |
ESP8266のWireを使う場合、最初にI2Cに使用するピンをsetupで...
#pre{{
void setup() {
Wire.begin(4, 14); // begin(SDA, SCL);のように指定
}}
** ESP8266でLBEDを使ってみる [#j38fae6b]
Arduino版LBEDは、I2CのWire関連をライブラリの外に出すこと...
ESP8266版Arduino IDEでも使うことができるようになりました。
*** 秋月で購入できる温度センサーADT7410を使う [#d58f373c]
ADT7410とESP8266との接続には、ESP8266版lbeDuinoのD8(SDA...
ADT7410のSDA、SCLをそれぞれ接続します。
ADT7410にモジュール内にプルアップの抵抗が付いていますが、...
&ref(ESP8266_ADT7410.png);
ADT7410のライブラリには、
Tom Kreycheさんがmbed用に公開されている
[[ADT7410ライブラリ>https://developer.mbed.org/users/tkre...
を使わせてもらいます。
ADT7410ライブラリの修正箇所は、ADT7410.hのmbed.hのインク...
#pre{{
// #include "mbed.h"
#include "lbed.h"
}}
スケッチは、以下の様にします。たったこれだけでADT7410温度...
#pre{{
#include "Wire.h"
#include "lbed.h"
#include "ADT7410.h"
ADT7410 healthThemometer(D8, D9, 0x90, 400000);
void setup() {
Wire.begin(4, 14); // Wire.begin();
Serial.begin(9600);
healthThemometer.setConfig(ONE_SPS_MODE);
}
void loop() {
float temp = healthThemometer.getTemp();
Serial.print("Current temperature is ");
Serial.print(temp, 2);
Serial.println(" C. ");
wait_ms(1000);
}
}}
*** I2CLcdシールド [#ef840150]
ESP8266版lbeDuinoは、使えるピンが少ないので、Arduinoピン...
D2をD12に、D3をD5に付け替えて実行します。
&ref(I2CLcd.png);
スケッチは、以下のとおりです。
#pre{{
#include "Wire.h"
#include "lbed.h"
#include "AQCM0802.h"
// D13番ピンにLEDを接続
DigitalOut led(D13);
// D8番ピンSDA, D9番ピンSCL. ArduinoではハードI2Cを使用し...
AQCM0802 lcd(D8, D9);
// タクトスイッチ
DigitalIn sw1(D5);
DigitalIn sw2(D12);
void setup() {
// ESP8266では、D8に4(SDA), D9に14(SCL)が接続さ...
Wire.begin(4, 14); // Wire.begin(); sw1.mode(...
sw2.mode(PullUp);
lcd.setup();
lcd.print("I2C LCD");
}
void loop() {
led = !led;
lcd.locate(0, 1);
if (!sw1) {
lcd.print("SW1 On ");
}
else if (!sw2) {
lcd.print("SW2 On ");
}
else {
lcd.print("All Off");
}
wait_ms(1000);
}
}}
*** BME280温度・湿度・気圧センサ [#m3d9bfae]
I2CLcdが動けば、その他のI2Cセンサも動くはずです。
&ref(BME820.png);
#pre{{
#include "Wire.h"
#include "lbed.h"
#include "AQCM0802.h"
#include "BME280.h"
// D13番ピンにLEDを接続
DigitalOutled(D13);
// D8番ピンSDA, D9番ピンSCL
AQCM0802lcd(D8, D9);
BME280sensor(D8, D9);
// タクトスイッチ
DigitalIn sw1(D5);
DigitalIn sw2(D12);
intlast_mode = 0;
chardegree = 0xdf;
void setup() {
// ESP8266では、D8に4(SDA), D9に14(SCL)が接続さ...
Wire.begin(4, 14); // Wire.begin();
sw1.mode(PullUp);
sw2.mode(PullUp);
lcd.setup();
sensor.setup();
lcd.locate(0, 0); lcd.print("BME280");
lcd.locate(0, 1); lcd.print("Demo");
wait_ms(2000);
}
void loop() {
led = ! led;
if (sw1 == 1) {
if (last_mode == 0)
lcd.cls();
lcd.locate(0, 0);
lcd.print(sensor.getTemperature(), 2);
lcd.print(degree); lcd.print("C");
lcd.locate(0, 1);
lcd.print(sensor.getHumidity(), 2); lcd.print("%");
last_mode = 1;
}
else {
if (last_mode == 1)
lcd.cls();
lcd.locate(0, 0);
lcd.print(sensor.getTemperature(), 2);
lcd.print(degree); lcd.print("C");
lcd.locate(0, 1);
lcd.print(sensor.getPressure(), 2); lcd.print("hP...
last_mode = 0;
}
wait_ms(1000);
}
}}
** ESP8266版LBEDソース [#u8fa0b69]
ESP8266版で使ったlbedライブラリのソースを添付します。
ユーザのArduino用ディレクトリ/librariesに以下を展開して、
lbeDuino, lbeDuinoUserをコピーしてください。
- &ref(Arduino_lbed.zip);
** まだ途中ですが公開します。 [#n5d14668]
#vote(おもしろかった[5],そうでもない[0],わかりずらい[0])
皆様のご意見、ご希望をお待ちしております。勉強会で分から...
スパム防止に画像の文字列も入力してください。
#comment_kcaptcha
ページ名:
SmartDoc