« June 2019 | Main | August 2019 »

July 2019

07/09/2019

Arduino NANO を使って BME280 で計測し LCD(16x2) に表示する

Img_20190709_121953 Img_20190709_122102
Arduino NANO を使って BME280 で、温度・湿度・気圧を計測し、結果を LCD(16x2) に表示する。
当初、LCD(16x2)の使い方が分からないので、ブログの簡単な事例でトライアルしてみたが、正しいはずの Sketch で、エラー無くコンパイルされたのに、画面は真っ白のまま・・・何故なのだろうと調べた挙句、LCD裏面の可変抵抗を調整して画面の明るさを加減しないと、表示された文字が見えないという事が分かった。わかってしまえば簡単な事なのに・・・、それで表示問題は解決。

BME280 と LCD どちらも I2C で接続するにはどうすれば良いのか・・・と悩んでいたが、BME280 は SPI 接続し、LCD は I2C 接続する方法で試したら上手くできた。Arduino NANO との接続方法は、下記の Sketch の中に書き入れた。

LCD は2行表示なので、温度、湿度、気圧を同時に表示することは出来ない。 2行を使い3行分のデータを順にまわして表示するか・・・とも考えたが、Sketchが面倒なので、温度表示は固定し、湿度と気圧を 3秒毎に上書き表示するようにしてみた。1行分のデータを、それぞれめいっぱい使えば、上書き時に完全に置き換えが出来る。

シリアルモニターにも表示できるようにしておいた。

という事で、スケッチは下記のようにすれば、完成!

【注記】表示されている温度と湿度に関していえば、温度は2℃ほど高めに表示されるし、湿度は10%ほど低めに表示されるようだ。
 気圧に関しても正確な値を表示していないかもしれない。それぞれ補正出来れば良いのですが・・・

《Sketch》
// Even though the sketch is correct,
// the text can not be seen without adjusting the LCD contrast.
// BME280 --- Arduino NANO (SPI connection)
//      CSB --- D10
//      SDA --- D11
//      SDO --- D12
//      SCL --- D13
// LCD(16x2) --- Arduino NANO (I2C connection)
//         GND --- GND
//         VCC --- 5V
//         SDA --- A4
//         SCL --- A5

#include <Wire.h>
#include "SparkFunBME280.h"
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR  0x3F
LiquidCrystal_I2C lcd(I2C_ADDR, 16, 2);  // I2C: 0x3F, 16x2 LCD
const int SPI_CS_PIN = 10;
BME280 sensor;

void setup() {
lcd.init();
lcd.backlight();
Serial.begin(115200);
Wire.begin();
sensor.beginSPI(SPI_CS_PIN);
}

void loop() {
Serial.print("Temp: ");
Serial.print(sensor.readTempC(), 2);
Serial.print(" °C, Humidity: ");
Serial.print(sensor.readFloatHumidity(), 2);
Serial.print(" %, Pressure: ");
Serial.print(sensor.readFloatPressure() / 100.0, 1);
Serial.println(" hPa");

lcd.setCursor(0, 0);
lcd.print("Temp. " + String(sensor.readTempC()) + " deg");
lcd.setCursor(0, 1);
lcd.print("Humid. " + String(sensor.readFloatHumidity()) + " % ");
delay(3000);
lcd.setCursor(0, 1);
lcd.print("Prs. " + String(sensor.readFloatPressure()/ 100.0) + " hPa");
delay(3000);
}

07/07/2019

玄関先にある郵便受けが開いた回数を表示する

Img_20190707_163620 Img_20190707_163717  
前回作成したタクトスイッチを押した回数を表示する装置を利用して、玄関先に設置の郵便受けが開いた回数を表示するようにした。
郵便受けが開いたことを知らせる装置は、「ポストに郵便物が入ったらLEDを点灯するには・・・3(2016/12/6)」の記事などを参考に見て戴きたい。
右側装置の時計表示の上側にある部分は、郵便受けが開いたという信号を受けるもので、受信した信号を、フォトカプラを使って左側の装置に2本の線(水色・白色)で信号を送り、回数を8x8ドットマトリックスLEDで表示する。

Tact buttonを押した回数をLED Matrix display 8×8 dots (MAX7219) に表示する

Tact-sw-counter-with-8x8-dot-matrix-dispImg_20190707_125127Img_20190707_132210 タクトボタンを押した回数を、LED Matrix display 8×8 dots に表示させたいと思い作ってみた。
表示器は、8×8 dotsが1つなので、数値は「9」迄しか表示できない。ただし、表示させてみたところ、DOSのマニュアルにあるコードページ437 が使われているので、タクトスイッチを47クリックしてようやく「0」になる。それでカウンターに初期値「48(=0)」を入れ、タクトスイッチが押される毎に、コードを進めて、カウント文字を表示することにした。
int icount = 48;
となっているのは、このためであり、Matrix display に「0」と表示させるための小技である。
従って、タクトボタンを押す回数が進めば、表示は数字ではなく、コード表にある文字に変わってゆく。
いまのところ、これを使う表示では、数値が2桁になることは無いだろうと思っているが、カウント数が増えれば、表示方法も考える必要がある。

部品は下記のとおり。
① LED Matrix display 8×8 dots ・・・ amazon で 購入 @257
② Arduino NANO ・・・ amazon で 購入
③ tact button
④ 単線cable

1)LED Matrix display 8×8 dots は、私がブレッドボードに取り付けたい方向にピン差し込み部分が無いので、
ピンの曲がりをラジオペンチで直して、半田ごてを使ってピンの半田を溶かしながら、素早くスライドさせて、ブレッドボードに差し込めるようにした。
ブレッドボード上の配線は、ブレッドボードに這わせるように引いたので、線の繋がりが見えにくいかもしれない。

Matrix display の各端子とArduinoのピンとの接続は下記のように行った。

Matrix Display    Arduino NANO
VCC ・・・・・・・・・ 5V
GND ・・・・・・・・・ GND
DIN ・・・・・・・・・ D11
CS  ・・・・・・・・・ D10
CLK ・・・・・・・・・ D13

Tact Switch
左下pin ・・・・・・・ D7
左上pin ・・・・・・・ GND

2)タクトボタンを押すと、チャタリングが入ってしまい、数値が順に表示されなくなるので、
 gazettelabo「●arduino(アルディーノ) 押しボタンスイッチ」を参考にさせて戴き、チャタリング対策を行った。

3) 表示をリセットするには、Arduino NANO の中央部にある「RESET」を押せば、再起動して、表示もゼロからカウントするので、それで良しとした。

その他、ディスプレイ表示では、データが文字(character)でないとダメなので、カウントしている数値(numeric)を文字に変換する方法で手間取った。ようやく文字に変えたつもりが、表示された文字は、ASCIIのIBMコードになっている! それで、数値を示すコードに変更するために、カウント値に 48を加える必要があった。


《sketch》


// http://euc.jp/i18n/charcode.ja.html for character code
// http://gazettelabo.seesaa.net/article/447403643.html
// Reset should be push on reset button on Arduino NANO
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
const int numberOfHorizontalDisplays = 1;
const int numberOfVerticalDisplays = 1;
const int pinCS = 10; // Cs - SS (Pin 10)
// Din - Mosi (Pin 11)
// Clk - Sck (Pin 13)
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
const int wait = 50;
const int count = 7;
int icount = 48;
char c;

void setup() {
matrix.setIntensity( 1 ) ; // Adjust the brightness between 0 and 15
matrix.setPosition( 0, 3, 0) ;
matrix.setRotation( 0, 3) ; // rotation position
Serial.begin(9600);
pinMode(count, INPUT_PULLUP);
matrix.fillScreen(LOW);
c = char(icount);
matrix.drawChar( 2, 1, c, HIGH, LOW, 1);
matrix.write();
}

void loop() {
if ( digitalRead ( count ) == 1)
icount = icount + 1 ;
while ( digitalRead ( count ) == 1) {
delay (wait);
}
c = char(icount);
Serial.print("icount ");
Serial.print(icount);
Serial.print(" = ");
Serial.println(c);

matrix.drawChar( 2, 1, c, HIGH, LOW, 1);
matrix.write(); // Send bitmap to display
delay(wait);
}



« June 2019 | Main | August 2019 »

August 2019
Sun Mon Tue Wed Thu Fri Sat
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Recent Trackbacks

無料ブログはココログ