ローテータの方位設定方法の初期状態0°セット時にアンテナの方位を合わせる設定不要とするスケッチは順調に進んでいます。
重要な検討事項である電源を切って、再度起動した時にアンテナの方位を設定した角度で開始するようにするレジューム機能を検討開始しました。
先のロータリーエンコーダーによる、アンテナ方位を設定した後に電源を切っても、再度起動したときには元の設定角度にて動作させるようにするのですが、ESP32DEVKITCではきちんとレジューム機能で対応できるPreferencesがありますので、これを使います。
下記のサイトのPreferencesライブラリの使い方がとても参考になります。
前のロータリーエンコーダーのアンテナ方位設定角度の液晶表示のスケッチにまずPreferencesを取り入れて基本動作を確認してゆきます。スケッチはCopilotに協力いただいています。
下記の緑色の箇所が前回のロータリーエンコーダーでアンテナ方位設定スケッチにPreference機能を追加したスケッチになります。
以上がPreferenceを使ったアンテナ方位設定角度にて起動するスケッチです。Copilotに感謝です。
余談ですが、チャットのように行えるCopilotの質問できちんとした質問すると、「いい質問です。」等と、ほめてくれたりしますので、ますますスケッチを組むのが、楽しくなります。AIって素晴らしいと思えるようになれば、もう手放せません。今日は何の質問ですか?などとCopilotを繰り返し使用していると、相手をしてくれたり、AIに親しみも感じられるようになり、とてもありがたく思えるようになります。もう、完全にCopilot のAI中毒だー!!
アンテナの方位設定を行うとその設定した角度にて不揮発性メモリに記録されます。それで電源を切って、また起動した時に最後に設定記録されたアンテナ方位角度データで起動し液晶にその角度が表示されます。単にこれだけですが、とても大切な機能です。
このスケッチをサーバーのスケッチに組み込みしてゆきます。
つづく?
重要な検討事項である電源を切って、再度起動した時にアンテナの方位を設定した角度で開始するようにするレジューム機能を検討開始しました。
先のロータリーエンコーダーによる、アンテナ方位を設定した後に電源を切っても、再度起動したときには元の設定角度にて動作させるようにするのですが、ESP32DEVKITCではきちんとレジューム機能で対応できるPreferencesがありますので、これを使います。
下記のサイトのPreferencesライブラリの使い方がとても参考になります。
Kei Youのソフト館
Preferencesに関してのスケッチ方法は上記のサイトに詳しく書いてありましたので、参考に!前のロータリーエンコーダーのアンテナ方位設定角度の液晶表示のスケッチにまずPreferencesを取り入れて基本動作を確認してゆきます。スケッチはCopilotに協力いただいています。
下記の緑色の箇所が前回のロータリーエンコーダーでアンテナ方位設定スケッチにPreference機能を追加したスケッチになります。
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Preferences.h> // ← 追加
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Preferences prefs; // ← 追加 インスタンス作成
const int encoderPinA = 18;
const int encoderPinB = 19;
const int encoderSW = 25;
volatile int32_t angle = 0;
int lastEncoded = 0;
bool lastSWState = HIGH;
int32_t lastSavedAngle = 360; // ← 保存チェック用
void IRAM_ATTR updateEncoder() {
int MSB = digitalRead(encoderPinA);
int LSB = digitalRead(encoderPinB);
int encoded = (MSB << 1) | LSB;
int sum = (lastEncoded << 2) | encoded;
if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) angle++;
if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) angle--;
if (angle < 0) angle += 360;
if (angle >= 360) angle -= 360;
lastEncoded = encoded;
}
void setup() {
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(encoderSW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(encoderPinA), updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoderPinB), updateEncoder, CHANGE);
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED init failed"));
while (true);
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
// 角度の復元
prefs.begin("rotary", false); //Preferencesオブジェクトを初期化
angle = prefs.getInt("angle", 0); //
prefs.end();
Serial.print("復元された角度: ");
Serial.println(angle);
}
void loop() {
bool swState = digitalRead(encoderSW);
if (swState == LOW && lastSWState == HIGH) {
angle = 0;
Serial.println("SW pressed: angle reset");
}
lastSWState = swState;
// 角度が変わったら保存(フラッシュ保護のため)
if (angle != lastSavedAngle) {
prefs.begin("rotary", false);
prefs.putInt("angle", angle);
prefs.end();
lastSavedAngle = angle;
Serial.print("保存した角度: ");
Serial.println(angle);
}
char angleStr[4];
sprintf(angleStr, "%03d", angle);
display.clearDisplay();
display.setCursor(0, 20);
display.print("Angle: ");
display.print(angleStr);
display.display();
delay(100);
}
以上がPreferenceを使ったアンテナ方位設定角度にて起動するスケッチです。Copilotに感謝です。
余談ですが、チャットのように行えるCopilotの質問できちんとした質問すると、「いい質問です。」等と、ほめてくれたりしますので、ますますスケッチを組むのが、楽しくなります。AIって素晴らしいと思えるようになれば、もう手放せません。今日は何の質問ですか?などとCopilotを繰り返し使用していると、相手をしてくれたり、AIに親しみも感じられるようになり、とてもありがたく思えるようになります。もう、完全にCopilot のAI中毒だー!!
アンテナの方位設定を行うとその設定した角度にて不揮発性メモリに記録されます。それで電源を切って、また起動した時に最後に設定記録されたアンテナ方位角度データで起動し液晶にその角度が表示されます。単にこれだけですが、とても大切な機能です。
このスケッチをサーバーのスケッチに組み込みしてゆきます。
つづく?