無線ブログ集
メイン | 簡易ヘッドライン |
MODEL 1200FXローテーターその29 (2022/11/8 4:54:34)
ESP32DevKitCのサーバー、クライアントでのUDP双方向通信で1200FXのローテーターの現在角度の情報送出で、クライアント側にてデコードして表示のみでしたが、現在のローテーター角度だけでは、処理上不足ということで、設定角度の合わせて2つの情報をサーバー側から送出するようにしてみました。
その25の追加したルーチンへの追加処理で行ないました。サーバー側では設定角度情報は常時TFT液晶に表示されていますので、表示用のkakudo変数を単にUDPデータ送出用として設定角度を変換し送るルーチンの追加だけで済みます。
//**********************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,44);
tft.print("SET :");
char cc[6];
sprintf(cc,"%3d",kakudo);
tft.print(cc);
//**********************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,44);
tft.print("SET :");
char cc[6];
sprintf(cc,"%3d",kakudo);
tft.print(cc);
//**********************************************
//************************************************************************
// UDP data Send to client (STA mode) add 2022oct24
//************************************************************************
udp.beginPacket(client_address,localPort);
//Sending Readkakudo to Client Devided data byte High and byte Low add 2022oct25
// kakudo setting data
// int32_t kakudo = 0; //presetting orijin degree
uint8_t kakudoHH = (uint8_t)((kakudo & 0x0000FF00) >> 8); // set kakudoHH
uint8_t kakudoHL = (uint8_t)((kakudo & 0x000000FF) >> 0); // set kakudoHL
uint8_t ReadkakudoLH = (uint8_t)((Readkakudo & 0x0000FF00) >> 8); //set readkakudo HL
uint8_t ReadkakudoLL = (uint8_t)((Readkakudo & 0x000000FF) >> 0);
udp.write(kakudoHH); // send byte HH data by UDP
udp.write(kakudoHL); // send byte HL data by UDP
udp.write(ReadkakudoLH); //send byte LH data by UDP
udp.write(ReadkakudoLL); //send byte LL data by UDP
udp.endPacket();
//************************************************************************
// UDP data Send to client (STA mode) add 2022oct24
//************************************************************************
udp.beginPacket(client_address,localPort);
//Sending Readkakudo to Client Devided data byte High and byte Low add 2022oct25
// kakudo setting data
// int32_t kakudo = 0; //presetting orijin degree
uint8_t kakudoHH = (uint8_t)((kakudo & 0x0000FF00) >> 8); // set kakudoHH
uint8_t kakudoHL = (uint8_t)((kakudo & 0x000000FF) >> 0); // set kakudoHL
uint8_t ReadkakudoLH = (uint8_t)((Readkakudo & 0x0000FF00) >> 8); //set readkakudo HL
uint8_t ReadkakudoLL = (uint8_t)((Readkakudo & 0x000000FF) >> 0);
udp.write(kakudoHH); // send byte HH data by UDP
udp.write(kakudoHL); // send byte HL data by UDP
udp.write(ReadkakudoLH); //send byte LH data by UDP
udp.write(ReadkakudoLL); //send byte LL data by UDP
udp.endPacket();
//************************************************************************
クライアントでは、追加されたUDP通信データ(設定角度)のデコード処理の追加が必要となります。
以下UDP設定角度データデコード、TFT液晶表示する設定角度は同じ角度情報なので現在角度と同じ様に桁処理を追加設定します。
■void loop()ルーチンへの追加
void loop() {
uint8_t dataHH; // NOV02 add
uint8_t dataHL; // NOV02 add
uint8_t dataLH;
uint8_t dataLL;
int32_t rv_data1;
int32_t rv_data2;
uint8_t dataHH; // NOV02 add
uint8_t dataHL; // NOV02 add
uint8_t dataLH;
uint8_t dataLL;
int32_t rv_data1;
int32_t rv_data2;
// データ受信
if (rec_size = udp.parsePacket()) {
counter_100msec = RE_CONNECT; // re connect counter resets.
uint8_t dataHH = (uint8_t)udp.read(); // kakudoHH
uint8_t dataHL = (uint8_t)udp.read(); // kakudoHL
uint8_t dataLH = (uint8_t)udp.read(); // ReadkakudoLH
uint8_t dataLL = (uint8_t)udp.read(); // ReadkakudoLL
int32_t rv_data1 = (int32_t)(
(((uint8_t)dataHH << 8) & 0x0000FF00)
| (((uint8_t)dataHL << 0) & 0x000000FF)
);
int32_t rv_data2 = (int32_t)(
(((uint8_t)dataLH << 8) & 0x0000FF00)
| (((uint8_t)dataLL << 0) & 0x000000FF)
);
crv_data1 = rv_data1; //add 2022NOV02 setting kakudo value but now nouse
crv_data2 = rv_data2;//add 2022NOV02 setting Readkakudo value but now nouse
//**********************************************************************
// ADD 2022NOV02
// TFT display Now Readkakudo value
//**********************************************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,0);
tft.print("Now :");
// rv_data2 value change add blunk for set digit right location
if(rv_data2 < 10){
tft.print(" ");
tft.print(rv_data2);
}
else
if(rv_data2 < 100){
tft.print(" ");
tft.print(rv_data2);
}
else
if(rv_data2 >= 100){
tft.print(rv_data2);
}
//*********************************************************************
// ADD 2022NOV02
// TFT display Setting kakudo value
//*********************************************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,44);
tft.print("SET :");
// rv_data1 value change add blunk for set digit right location
if(rv_data1 < 10){
tft.print(" ");
tft.print(rv_data1);
}
else
if(rv_data1 < 100){
tft.print(" ");
tft.print(rv_data1);
}
else
if(rv_data1 >= 100){
tft.print(rv_data1);
}
}
if (rec_size = udp.parsePacket()) {
counter_100msec = RE_CONNECT; // re connect counter resets.
uint8_t dataHH = (uint8_t)udp.read(); // kakudoHH
uint8_t dataHL = (uint8_t)udp.read(); // kakudoHL
uint8_t dataLH = (uint8_t)udp.read(); // ReadkakudoLH
uint8_t dataLL = (uint8_t)udp.read(); // ReadkakudoLL
int32_t rv_data1 = (int32_t)(
(((uint8_t)dataHH << 8) & 0x0000FF00)
| (((uint8_t)dataHL << 0) & 0x000000FF)
);
int32_t rv_data2 = (int32_t)(
(((uint8_t)dataLH << 8) & 0x0000FF00)
| (((uint8_t)dataLL << 0) & 0x000000FF)
);
crv_data1 = rv_data1; //add 2022NOV02 setting kakudo value but now nouse
crv_data2 = rv_data2;//add 2022NOV02 setting Readkakudo value but now nouse
//**********************************************************************
// ADD 2022NOV02
// TFT display Now Readkakudo value
//**********************************************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,0);
tft.print("Now :");
// rv_data2 value change add blunk for set digit right location
if(rv_data2 < 10){
tft.print(" ");
tft.print(rv_data2);
}
else
if(rv_data2 < 100){
tft.print(" ");
tft.print(rv_data2);
}
else
if(rv_data2 >= 100){
tft.print(rv_data2);
}
//*********************************************************************
// ADD 2022NOV02
// TFT display Setting kakudo value
//*********************************************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,44);
tft.print("SET :");
// rv_data1 value change add blunk for set digit right location
if(rv_data1 < 10){
tft.print(" ");
tft.print(rv_data1);
}
else
if(rv_data1 < 100){
tft.print(" ");
tft.print(rv_data1);
}
else
if(rv_data1 >= 100){
tft.print(rv_data1);
}
}
上記のルーチン追加でクライアントのTFT液晶にサーバーと同じ位置に現在角度(NOW:***)と設定角度(SET:***)がリアルタイムでサーバー側とシンクロして表示されるようになります。
目標としていましたサーバーと同じ現在角度と設定角度表示、クライアントからサーバーへの角度設定がUDP双方向通信処理で出来る様になりました。
実際のローテーターでの確認も必要と思い、シャックのローテーターに繫いで動作確認も行なってみました。先ずはESP32どうしでの確認で、ローテーターコントローラの指針のさす角度とクライアントのボタンが同じ事を確認します。スマフォとESP32サーバーでもどちらでも確認はOK!
(ローテーターはESP32サーバー側につながっています)
ESP32どうし(ESP32クライアント、ESP32サーバー)とスマフォとESP32サーバー組み合わせ。
スマフォもESP32サーバー化したアドレスを設定する事で家庭内のWiFiルーター使用時と同じ様に使えます。全く問題はありませんでした。
特に便利なのは携帯スマフォでアンテナを見ながら角度設定出来る事です。
ローテータコントロールしてるシャックへ行って角度設定してまわしてから、それから外へ位置確認しに行ってとかの面倒が皆無となります。私の家は2Fにベランダがあるのでアンテナとシャックのローテーターコントローラーの両方が見れるので、さほど面倒ではありませんが!
ESP32DevKitCのサーバー側とクライアントのESP32またはスマフォがWiFiで繋がる範囲で動作します。スマフォでは、実際家のまわりでも十分使えました。タワーの下でも問題なく使えました。通販でWiFiアンテナが外付けのESP32が注文した物と間違えて送られてきたトラブルがありましたが、アンテナ付きのESP32より、アンテナ外付けのESP32のWiFiのほうが繋がる距離が延びるのではないかと少し期待しています。まだわかりませんが、WiFiのUDP通信距離については、アンテナ外付けESP32で返ってよかったのかもしれません。ESP32のサーバーもアンテナ外付けに交換し、コンパイル書き込みして、どれくらいの距離まで使えるかをいつか確認してみたいと思います。
デバッグは継続してゆきます。
つづく?
execution time : 0.021 sec