久々の長い自作プログラム
タイマー2割り込みを利用してLEDの点滅を行ってる。(参考)
現在の気温の位置のLEDが点滅する。左から2個めが現在気温で消灯中
このDHT11何時間立っても気温1度以下にならん。
果たしてこれで正しいのか・・・
/*
温度計から得たデータが示す位置のLEDを1秒おきに点滅させるプログラム
割り込みを使い1秒毎に変数 dspOff を切り替える
dspOff = trueの時、 temp2pos の位置のLEDを消す(1秒割り込みで点滅)
DHT11の結線
5VとGND 信号線(緑)は12Pinに
OLED SSD1306の結線
3.3V,GND、SDAはA4ピン、SCK(SCL)はA5ピンへ。
(SCLとSCKは同じ意味でクロック線を意味する。)
2023/10/21
*/
#include "MsTimer2.h" // タイマ2割り込み(AD変換pwmは注意のこと)
//---------温湿度計----------------------
#include "dht11.h" // 温湿度計ライブラリ
dht11 DHT11; // 温湿度計
float hum; // 湿度保存
float tmp; // 温度保存
String humS; // 表示整形用文字列
String tmpS; // 同上
//--------OLED SSD1306制御----------------
#include "SPI.h"
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//---------LEDバー制御----------------------
#include "Adafruit_NeoPixel.h" // LEDバー制御
const int DIN_PIN = 11; // D1
const int LED_COUNT = 8; // LEDの数
Adafruit_NeoPixel pixels(LED_COUNT, DIN_PIN, NEO_GRB + NEO_KHZ800); // LEDバーの定義
//----カラーテーブル------
uint32_t red = pixels.Color(128, 0, 0); uint32_t orange = pixels.Color(128, 82, 0);
uint32_t yellow = pixels.Color(128, 128, 0); uint32_t green = pixels.Color(0, 128, 0);
uint32_t cyan = pixels.Color(0, 64,64); uint32_t blue = pixels.Color(0, 0, 128);
uint32_t purple = pixels.Color(128, 0, 128); uint32_t Lgreen = pixels.Color(0, 32, 0);
uint32_t Lblue = pixels.Color(0, 0, 255); uint32_t Hred = pixels.Color(255, 0, 0);
//----カラーバーの表示色------
uint32_t barColor[] = {Lblue, cyan, Lgreen, green, yellow, purple, red, Hred};
//-----OLED運用開始--------------
void startLcd(){
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
return;
//for(;;); // Don't proceed, loop forever
}else Serial.println("Start SSD1306");
display.clearDisplay();
display.display(); // 画面クリア
delay(500);
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(10, 10); // Start at top-left corner
display.cp437(true); // Use full 256 char 'Code Page 437' font
display.println("SSD1306 + DHT11");
display.display(); // buffer => Display
delay(1);
}
//----OLEDデータ表示---------------
void dspData(){
display.clearDisplay();
// display.display(); // buffer => Display
display.setTextSize(2); // Normal 1:1 pixel scale
display.setCursor(0, 0); // Start at top-left corner
display.print("hum: ");
display.print(humS);
display.println("%");
display.print("tmp: ");
display.print(tmpS);
display.display(); // buffer => Display
delay(1);
}
//------- 温度から点滅箇所を計算---------------
int temp2pos(float inTemp){
return map( int(inTemp), -10,60, 0,7);
}
//-------タイマ割り込みでLED表示を1秒毎にON/OFF切り替え--------------
bool dspOff = true; // LEDを消すかどうかのフラグ
//----- 割り込みでdspOffを切り替える
void intrUp(){
dspOff = ! dspOff;
}
void setup() {
Serial.begin(9600);
Serial.println("Start Program");
//----OLCD---------
startLcd();
//----温湿度計---------
DHT11.attach(12); // 温湿度センサーを12ピンにセット
//---LEDバー-------
pixels.begin(); // LED利用開始宣言
pixels.setBrightness(20); // 明るさセット
//---割り込み-------
MsTimer2::set(1000, intrUp); // 1000ms毎にintrUp( )割込み関数を呼び出す
MsTimer2::start(); // タイマー割り込み開始
}
//-----LEDバーに既定全色をセット--------
void setColorBar(){
for (int i=0; i<8; i++){
pixels.setPixelColor(i, barColor [i]);
}
}
void loop() {
//---温湿度データ取得-----
if (dspOff)
int chk = DHT11.read(); // 2秒に一回読み込み
hum = DHT11.humidity; // 湿度
tmp = DHT11.temperature; // 温度
humS = String(hum, 0); // 表示用に整形
tmpS = String(tmp, 1); // 同上
Serial.print("hum:"); Serial.print(humS);
Serial.print(" temp:"); Serial.println(tmpS);
dspData(); // 液晶へ温湿度を表示
int pos = temp2pos(tmp); // 温度から点滅するLEDの位置を取得する
Serial.println(pos);
pixels.clear(); // LEDバーバッファのクリア
setColorBar(); // LEDバー全色セット
if (dspOff) pixels.setPixelColor(pos, 0); // ブリンクで色を消すタイミングの場合、該当LEDの色を黒にする
pixels.show(); // LEDバー表示
delay(1000);
}