ESP32でBlynk(6)LED制御(その2)
前回の続きLED制御ですが、今回はBlynkでの制御を入れてみます。💪
点滅のOn/Offを制御するのもつまらないので、Sliderをいうガジェットを使って調光をしてみます。
まずプログラムから。
/* Comment this out to disable prints and save space */ #define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT #include <BlynkSimpleEsp32_BLE.h> #include <BLEDevice.h> #include <BLEServer.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "YOUR AUTH";
//**************************************************
class LED
{
private:
uint16_t brankTime = 0;
int port;
int hi=0;
int litCurve[16]={0,1,1,1,2,2,3,3,4,4,5,5,8,12,15,16};
public:
LED(int p)
{
port = p;
pinMode(port, OUTPUT);
};
void duty(int d)
{
hi =d;
};
void branking()
{
if(brankTime == 0) brankTime = 30/2;
if(brankTime >litCurve[hi]) digitalWrite(port, LOW);
else digitalWrite(port, HIGH);
brankTime --;
};
};
//**************************************************
//LED定義
LED PORT4(4);
//タイマー関連定義
volatile int timeCounter1;
hw_timer_t *timer1 = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
void IRAM_ATTR onTimer1(){
portENTER_CRITICAL_ISR(&timerMux);
timeCounter1++;
portEXIT_CRITICAL_ISR(&timerMux);
}
//**************************************************
void setup()
{
// Debug console
Serial.begin(115200);
Serial.println("Waiting for connections...");
Blynk.setDeviceName("ESP32");
Blynk.begin(auth);
//timer
timer1 = timerBegin(0, 80, true);
timerAttachInterrupt(timer1, &onTimer1, true);
timerAlarmWrite(timer1, 2000, true);
timerAlarmEnable(timer1);
}
//*************************************************
BLYNK_WRITE(V1)
{
Serial.printf("%s\n",param[0].asStr());
PORT4.duty(param[0].asInt());
}
//*************************************************
BLYNK_READ(V0)
{
}
//*************************************************
void loop()
{
while(1){
if (timeCounter1 > 0) {
portENTER_CRITICAL(&timerMux);
timeCounter1--;
portEXIT_CRITICAL(&timerMux);
Blynk.run();
PORT4.branking();
}
}
}
Sliderから送られてくる値はRaspberryPiのところで説明したように、BLYNK_WRITE(V1)に送られてきますので、PORT4.duty(param[0].asInt());で値をオブジェクトに格納します。
BLYNK_WRITE(V1)
{
Serial.printf("%s\n",param[0].asStr());
PORT4.duty(param[0].asInt());
}
LEDのクラスライブラリーも次のように改良しています。
//**************************************************
class LED
{
private:
uint16_t brankTime = 0;
int port;
int hi=0;
//調光カーブ
int litCurve[16]={0,1,1,1,2,2,3,3,4,4,5,5,8,12,15,16};
public:
LED(int p)
{
port = p;
pinMode(port, OUTPUT);
};
//ここでBlynkからの値を受信する。
void duty(int d)
{
hi =d;
};
void branking()
{
if(brankTime == 0) brankTime = 30/2;
if(brankTime >litCurve[hi]) digitalWrite(port, LOW);
else digitalWrite(port, HIGH);
brankTime --;
};
};
今回は30msの周期(brankTime = 30/2)を15分割して調光します。15分割のうち何回LEDをOnするかをコントロールすることよって光の強さが変わります。
専門的に言うとデューティー比を変えて調光します。
30msにしたのは一般的に30ms以下は人間の目には点滅に見えないと言われています。(ダイナミック点灯も30ms以下の周期で設計します。)
Sliderの設定は次のようにします。
ここでもうひとつ重要な処理があります。
int litCurve[16]={0,1,1,1,2,2,3,3,4,4,5,5,8,12,15,16};
これはSliderから0〜15のリニアな値が送られてくるのをあえてリニアじゃないものに変換しています。
これはリニアな値を入れて変化させてみれば分かるのですが、あくまでも見た目での操作性ですが、すごく調整しにくいです。音量調整のヴォリュームにAカーブが使われているのと同様である程度明るくなってしまうと、その変化が分かりにくいため、調整しやすいようにテーブルを使って値を変換しています。
デューティー比の調光は、チップのPWM機能を使えばもっと精度良く簡単にできますが、今回は敢えてソフトウェアPWMを作ってみました。😙
今回はLEDを制御しましたが、例えばこれをモータに接続すれば速度やトルクの調整、サーボにつなげば位置の調整など出来ます。💯
では🤚
この記事が気に入ったらサポートをしてみませんか?