430タイマーで使用していた0.96インチのOLEDですが、長期間使っていると劣化し画面の輝度が著しく低下するという問題があるということが分かってきました。
そこで画面をLCD1602Aと入替するべく、表示のテストを行いました。
I2Cの変換モジュールがはんだ付けされているタイプのものなのですが、
これがやたらバックライトが明るいのです。
夜間に走行するのにこんなにバックライトが明るいと運転の邪魔になりそうなのでバックライトの明るさを制御できないか、少し考えてみました。
可変抵抗を後付けするのは部品点数が増えるのであまりやりたくないので他の方法を考えます。
バックライトのLEDは100Ωの抵抗がデフォルトでついていて、VCCの電源が直接供給されてる感じです。
最初は、lcd.backlight()と、lcd.noBacklight()を高速に交互に呼び出してPWM制御っぽくしてたのですが、なんかうまくないので、LCDのバックライトにArduinoの機能で直接PWM制御した信号を入れるようにしてみました。
LCDのバックライトには100Ωの抵抗が既についてるので、
ArduinoのD6ピンと、1602A I2Cモジュールのバックライトスイッチ端子の片側を繋げるだけです。
あとは、pinMode(6,OUTPUT);でD6をアウトプットにして、
analogWrite(6, 20);みたいな感じでPWM制御してやればバックライトの明るさも自由自在です。
//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
int brightness = 0;
#define READ_INTERVAL 20//ms
#define SW_PIN 7
#define LED_PIN 6
unsigned long timer, old_timer;
bool states, value, old_value;
char str[32];
void setup()
{
lcd.init(); // initialize the lcd
lcd.init();
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("000Hello, world!");
lcd.setCursor(2,1);
lcd.print("Ywrobot Arduino!");
lcd.setCursor(0,2);
lcd.print("Arduino LCM IIC 2004");
lcd.setCursor(2,3);
lcd.print("Power By Ec-yuan!");
pinMode(SW_PIN, INPUT_PULLUP);//入力
pinMode(LED_PIN,OUTPUT);//LCDのLED
}
void loop()
{
//READ_INTERVAL[ms]毎にスイッチの読取り
timer = millis();
if ( (timer - old_timer) >= READ_INTERVAL) {
old_timer = timer;
value = !(digitalRead(SW_PIN));//SW (ON=1 / OFF=0)
}
//スイッチの状態を取得
int sw_states = 0;
if (value == HIGH && old_value == LOW) {
sw_states = 1;//スイッチが押された瞬間
} else if (value == LOW && old_value == HIGH) {
sw_states = 2;//スイッチを離した瞬間
} else if (value == HIGH && old_value == HIGH) {
sw_states = 3;//スイッチが押されている
} else {
sw_states = 0;//スイッチが押されていない
}
old_value = value;
//スイッチの状態に応じて動作を変更
switch (sw_states) {
case 0://スイッチが押されていない
//states = LOW;
break;
case 1://スイッチが押された瞬間
//states = !states;
BrightnessCHG();
sprintf(str, "%03dHello, world!", brightness);
lcd.setCursor(0,0);
lcd.print(str);
break;
case 2://スイッチを離した瞬間
//states = !states;
break;
case 3://スイッチが押されている
//states = HIGH;
break;
}
}
void BrightnessCHG(){
brightness += 17;
if (brightness > 255){
brightness = 0;
}
analogWrite(LED_PIN, brightness);
}
ブログ一覧 |
Arduino | 日記
Posted at
2022/11/29 00:16:10