実現したいこと
特定の物資の場所に誘導するためのアニメーションをM5stackとIRを使って行いたい。
前提
8つのM5stack(gray)を使用し、M5stackがリモコンから目的のものがある場所のIRコードを受信したら、
そこへM5stackのLCDで誘導するということをしたいのです。
1つのスケッチをすべてのM5stackに書き込んで動作するようにしたい。
手ごろな価格でやりたいので受信だけのモジュールを使っています。
発生している問題・エラーメッセージ
どのようなシステムを組めばいいか悩んでいます。
主に33行目の identifyM5stackです。
(自分がどのM5stackの場所でリモコンのIRコードを送信したかは重要で、
どのようなプログラムを書いたらいいか調べてみましたが見当がつきません。)
該当のソースコード
C++
1#include <M5Stack.h> 2#define LGFX_USE_V1 3#define LGFX_AUTODETECT 4#include <LovyanGFX.hpp> 5#include <LGFX_AUTODETECT.hpp> 6#include <IRremote.h> 7 8//M5stack判別用 9#define M5STACK_1_IR_CODE 0x68B47 10#define M5STACK_2_IR_CODE 0xA50 11#define M5STACK_3_IR_CODE 0xA90 12#define M5STACK_4_IR_CODE 0xA8B47 13#define M5STACK_5_IR_CODE 0x66B47 14#define M5STACK_6_IR_CODE 0xE6B47 15#define M5STACK_7_IR_CODE 0x16B47 16#define M5STACK_8_IR_CODE 0x96B47 17 18int RECV_PIN = 21; 19IRrecv irrecv(RECV_PIN); 20decode_results results; 21 22static LGFX lcd; // LGFXのインスタンス 23static LGFX_Sprite sprite(&lcd); // LGFX_Spriteのインスタンス 24 25int spriteX = 320; //アニメーション用X座標 26int spriteY = 240; //アニメーション用Y座標 27int framesB = 0; 28int framesR = 0; 29int framesL = 0; 30 31//自分がどのM5かをそれぞれと照らし合わせて探索する 32//int currentM5stack は現在地を特定 33int identifyM5Stack(unsigned long irCode, int currentM5stack) { 34 // 受信した信号をもとに、どのM5Stackからの信号かを判別 35 36} 37 38void codeNotFound() { 39 lcd.clear(); 40 lcd.setTextColor(WHITE); 41 lcd.setTextSize(3); 42 lcd.setCursor(30, 120); 43 lcd.println("code not found"); 44} 45 46//横向きの矢印 47void drawSpriteArrowX() { 48 sprite.clear(); 49 sprite.setColor(lcd.color332(255, 255, 255)); 50 sprite.fillTriangle(160,30, 160,210, 290,120, WHITE); //三角 3点 51 sprite.fillRect(30,90, 130, 60, WHITE); //四角 x, y, w, h, color 52} 53//縦向きの矢印 54void drawSpriteArrowY() { 55 sprite.clear(); 56 sprite.setColor(lcd.color332(255, 255, 255)); 57 sprite.fillTriangle(160,20, 91,130, 229,130, WHITE); //三角 3点 58 sprite.fillRect(130,120, 60, 110, WHITE); //四角 x, y, w, h, color 59} 60 61void moveR() { 62 if (framesR > 0) { 63 drawSpriteArrowX(); 64 sprite.setRotation(0); 65 sprite.pushSprite(spriteX, 0); 66 67 // スプライトを右に移動させる 68 spriteX += 5; // 移動距離 69 70 // スプライトが画面外に出たら初期位置に戻す 71 if (spriteX > 320) { 72 spriteX = -320; 73 } 74 framesR --; //フレームを移動 75 } 76} 77 78void moveL() { 79 if (framesL > 0) { 80 drawSpriteArrowX(); 81 sprite.setRotation(2); 82 sprite.pushSprite(spriteX, 0); 83 84 // スプライトを左に移動させる 85 spriteX -= 5; // 移動距離 86 87 // スプライトが画面外に出たら初期位置に戻す 88 if (spriteX < -320) { 89 spriteX = 320; 90 } 91 framesL --; //フレームを移動 92 } 93} 94 95void moveB() { 96 if (framesB > 0) { 97 drawSpriteArrowY(); 98 sprite.setRotation(4); 99 sprite.pushSprite(0, spriteY); 100 101 // スプライトを上から下に移動させる 102 spriteY += 5; // 移動距離 103 104 // スプライトが画面外に出たら初期位置に戻す 105 if (spriteY > 240) { 106 spriteY = -240; 107 } 108 framesB --; //フレームを移動 109 } 110} 111 112void setup(void) { 113 M5.begin(); 114 delay(100); 115 WiFi.begin(ssid, password); 116 Serial.begin(115200); 117 irrecv.enableIRIn(); 118 lcd.init(); 119 120 lcd.setBrightness(200); 121 122 sprite.setPsram(true); 123 sprite.setColorDepth(8); 124 sprite.createSprite(320, 240); 125 126 lcd.println("Successed"); 127 server.begin(); 128 lcd.clear(); 129} 130 131void loop(void) { 132 if (irrecv.decode(&results)) { 133 irCode = results.value; 134 if (currentM5stack == 1) { 135 switch (irCode) { 136 case M5STACK_1_IR_CODE: 137 /* 138 target時の動作 139 */ 140 break; 141 case M5STACK_2_IR_CODE: 142 case M5STACK_3_IR_CODE: 143 case M5STACK_4_IR_CODE: 144 framesR = 360; 145 break; 146 case M5STACK_5_IR_CODE: 147 case M5STACK_6_IR_CODE: 148 case M5STACK_7_IR_CODE: 149 case M5STACK_8_IR_CODE: 150 framesB == 240; 151 break; 152 default: 153 codeNotFound(); 154 } 155 } 156 if (currentM5stack == 2) { 157 switch (irCode) { 158 case M5STACK_2_IR_CODE: 159 /* 160 target 161 */ 162 break; 163 case M5STACK_1_IR_CODE: 164 framesL = 360; 165 break; 166 case M5STACK_3_IR_CODE: 167 case M5STACK_4_IR_CODE: 168 framesR = 360; 169 break; 170 case M5STACK_5_IR_CODE: 171 case M5STACK_6_IR_CODE: 172 case M5STACK_7_IR_CODE: 173 case M5STACK_8_IR_CODE: 174 framesB = 240; 175 break; 176 default: 177 codeNotFound(); 178 } 179 } 180 if (currentM5stack == 3) { 181 switch (irCode) { 182 case M5STACK_3_IR_CODE: 183 /* 184 target 185 */ 186 break; 187 case M5STACK_1_IR_CODE: 188 case M5STACK_2_IR_CODE: 189 framesL = 360; 190 break; 191 case M5STACK_4_IR_CODE: 192 framesR = 360; 193 break; 194 case M5STACK_5_IR_CODE: 195 case M5STACK_6_IR_CODE: 196 case M5STACK_7_IR_CODE: 197 case M5STACK_8_IR_CODE: 198 framesB = 240; 199 break; 200 default: 201 codeNotFound(); 202 } 203 } 204 if (currentM5stack == 4) { 205 switch (irCode) { 206 case M5STACK_4_IR_CODE: 207 /* 208 target 209 */ 210 break; 211 case M5STACK_1_IR_CODE: 212 case M5STACK_2_IR_CODE: 213 case M5STACK_3_IR_CODE: 214 framesL = 360; 215 break; 216 case M5STACK_5_IR_CODE: 217 case M5STACK_6_IR_CODE: 218 case M5STACK_7_IR_CODE: 219 case M5STACK_8_IR_CODE: 220 framesB = 240; 221 break; 222 default: 223 codeNotFound(); 224 } 225 } 226 if (currentM5stack == 5) { 227 switch (irCode) { 228 case M5STACK_5_IR_CODE: 229 /* 230 target時の動作 231 */ 232 break; 233 case M5STACK_1_IR_CODE: 234 case M5STACK_2_IR_CODE: 235 case M5STACK_3_IR_CODE: 236 case M5STACK_4_IR_CODE: 237 framesB = 240; 238 break; 239 case M5STACK_6_IR_CODE: 240 case M5STACK_7_IR_CODE: 241 case M5STACK_8_IR_CODE: 242 framesL == 360; 243 break; 244 default: 245 codeNotFound(); 246 } 247 } 248 if (currentM5stack == 6) { 249 switch (irCode) { 250 case M5STACK_6_IR_CODE: 251 /* 252 target時の動作 253 */ 254 break; 255 case M5STACK_1_IR_CODE: 256 case M5STACK_2_IR_CODE: 257 case M5STACK_3_IR_CODE: 258 case M5STACK_4_IR_CODE: 259 framesB = 240; 260 break; 261 case M5STACK_5_IR_CODE: 262 framesR = 360; 263 break; 264 case M5STACK_7_IR_CODE: 265 case M5STACK_8_IR_CODE: 266 framesL == 360; 267 break; 268 default: 269 codeNotFound(); 270 } 271 } 272 if (currentM5stack == 7) { 273 switch (irCode) { 274 case M5STACK_7_IR_CODE: 275 /* 276 target時の動作 277 */ 278 break; 279 case M5STACK_1_IR_CODE: 280 case M5STACK_2_IR_CODE: 281 case M5STACK_3_IR_CODE: 282 case M5STACK_4_IR_CODE: 283 framesB = 240; 284 break; 285 case M5STACK_5_IR_CODE: 286 case M5STACK_6_IR_CODE: 287 framesR = 360; 288 break; 289 case M5STACK_8_IR_CODE: 290 framesL == 360; 291 break; 292 default: 293 codeNotFound(); 294 } 295 } 296 if (currentM5stack == 8) { 297 switch (irCode) { 298 case M5STACK_8_IR_CODE: 299 /* 300 target時の動作 301 */ 302 break; 303 case M5STACK_1_IR_CODE: 304 case M5STACK_2_IR_CODE: 305 case M5STACK_3_IR_CODE: 306 case M5STACK_4_IR_CODE: 307 framesB = 240; 308 break; 309 case M5STACK_5_IR_CODE: 310 case M5STACK_6_IR_CODE: 311 case M5STACK_7_IR_CODE: 312 framesR = 360; 313 break; 314 default: 315 codeNotFound(); 316 } 317 } 318 irrecv.resume();//信号待機 319 } 320 //sprite移動 321 moveB(); 322 moveR(); 323 moveL(); 324}
補足情報
wifiや送受信モジュールを使用したほうがいいのでしょうか?
また、コードがおかしなところがあればご指摘お願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/12/07 13:45