酒と薔薇の日々(その2)

好きなことだけ求めて生きるアスペ気味のINTJ人

DHT11温度をOLEDとシリアルLEDへ表示(Arduino)

2023年10月21日 23時19分06秒 | マイコン(ESP32・Arduino等)

久々の長い自作プログラム
タイマー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);
}

この記事についてブログを書く
« OLED(SSD1306)+ DHT11で温... | トップ | ホンダ・ステップワゴンのシ... »