見出し画像

【arduino/ESP32/加速度センサ】で【電子サイコロ】を作りたいnote

yuya工房です。連休いかがお過ごしでしょーか?

私は趣味にどっぷりの連休となっております。

電子工作に取り組んでおりました。

作りたいのは電子サイコロ。

ESP32という手のひらサイズのマイコンに3軸加速度センサをのっけて手作りIoTツールを作りたいと考えています。

出た目の数字が上を向いている時間をカウントした数値をデータとしてクラウド上(ambient)に飛ばして記録したいのです。

Do IoT yourself !!

未完ではありますが、こんなのできました。

6面全てに数値を割り振ることはまだできていません。

3軸のセンシングのうち、XとYの面はアナログ入力の値を読めるのですが、wifiのライブラリをインクルードすると3つ目のピンが読めなくなってしまいます。

analogread()が完全に死んじゃうんです・・・(涙目)

wifi無しの時には問題なく6面に数値を振ることができるのですが・・・

arduino とかラズパイとかの電子工作に詳しい方、ご教授いただけ無いでしょうか?

#include <WiFi.h>
#include <Ambient.h>

//IoTサービスambientのチャネルIDとライトキー
unsigned int channelId = 〇〇;
const char* writeKey = "〇〇";

Ambient ambient;

//Wifi設定
WiFiClient client;
const char ssid[] = "〇〇";
const char passwd[] = "〇〇";

void setup()
{

// シリアルモニターの初期化をする
Serial.begin(115200) ;

//Wifi設定
 WiFi.begin(ssid, passwd); 

 if ( WiFi.status() != WL_CONNECTED ) {
    Serial.print("WiFi connecting...");
   while(WiFi.status() != WL_CONNECTED) {
       Serial.print(".");
       delay(600);
   }
   Serial.print(" connected. ");
   Serial.println(WiFi.localIP());
   
//IoTサービスambientに接続
ambient.begin(channelId, writeKey, &client);

 }
}  


void loop()
{
//変数
int numberA=0;
int numberB=0;
int Start;
int Stop;
int Time; int i ;
long x,y,z;

//1回目のアナログセンシング値取得

do{
//50回センサ値を読み込んで平均を算出
x=y=z=0;

delay(3000);
for (i=0 ; i < 50 ; i++) {
x = x + analogRead(A4) ; // X軸平均値
y = y + analogRead(A5) ; // Y軸平均値
z = z + analogRead(A7) ; // Z軸平均値

}
x = x / 50 ;
y = y / 50 ;
Z = z / 50 ;

// 出た目の判別。Z軸は読めなかったので判別していません

 if(1500>x&&y>2300&&y<2800){
   numberA=2;
 } if(x>3500&&y>2300&&y<2800){
   numberA=4;
 } if(y>3500&&x>2300&&x<2800){
   numberA=3;
 } if(y<1400&&x>2300&&x<2800){
   numberA=1;
 } if(x>2300&&x<2800&&y<2800&&y>2300){
   numberA=5;
 }
 
delay(1000);
Serial.print("X:") ;
Serial.println(x) ;
Serial.print(" Y:") ;
Serial.println(y) ;
Serial.print(" z:") ;
Serial.println(z) ;
Serial.print(" numberA:") ;
Serial.println(numberA) ;

//目が1以上にならなければループを抜けない
}while(numberA<1);

Serial.println(" numberA:OK") ;
delay(1000);
Serial.print("X:") ;
Serial.println(x) ;
Serial.print(" Y:") ;
Serial.println(y) ;
Serial.print(" z:") ;
Serial.println(z) ;
Serial.print(" numberA:") ;
Serial.println(numberA) ;
delay(3000) ;

//ここまでで1回目の目をnumberAに代入するのを完了

//1回目の目を読んだ時間Startを取得する
Start=millis();

//ここから2回目の目を判別する。すなわち1回目の目から変化が起こるかどうかを感知する。

do{
 delay(3000);
//50回センサ値を読み込んで平均を算出
x=y=z=0;
for (i=0 ; i < 50 ; i++) {
x = x + analogRead(32) ; // X軸平均値
y = y + analogRead(33) ; // Y軸平均値
z = z + analogRead(A7) ; // Z軸平均値
}
x = x / 50 ;
y = y / 50 ;
Z = z / 50 ;

 if(1500>x&&y>2300&&y<2800){
   numberB=2;
 } if(x>3500&&y>2300&&y<2800){
   numberB=4;
 } if(y>3500&&x>2300&&x<2800){
   numberB=3;
 } if(y<1400&&x>2300&&x<2800){
   numberB=1;
 } if(x>2300&&x<2800&&y<2800&&y>2300){
   numberB=5;
 }

delay(1000);
Serial.print("X:") ;
Serial.println(x) ;
Serial.print(" Y:") ;
Serial.println(y) ;
Serial.print(" z:") ;
Serial.println(z) ;
Serial.print(" numberB:") ;
Serial.println(numberB) ;

//ここまでで2回目の目をnumberBに代入するのを完了

//numberAとnumberBがイコールの時には目が変わっていないのでもう一度numberBを読みにいく

}while(numberB==numberA);

//2回目の目を読んだ時間Stopを取得する
Stop=millis();

//時間timeを算出する
Time=(Stop-Start)/1000;

 Serial.print("number:  ");
 Serial.println(numberB);
 Serial.print("time:  ");
 Serial.print(Time);
 Serial.println("sec");
Serial.print("Time:") ;
Serial.println(Time) ;
Serial.println() ;
Serial.println() ;

//出た目numberBと前の目が上を向いていた時間Timeの数値をambientに投げる
ambient.set(1,numberB);              
 ambient.set(2,Time);  
 ambient.send();
   
}

====

ものづくりは楽しいけど、難しい。

苦あれば楽あり、山あり谷あり。

今、完全に谷です。

だから楽しいんだけどねぇ・・・。




この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

感シャリーン!(Edy風)
8
好きなものを、好きなときに、好きなだけ 電子工作、IoT、AI、読書、レザークラフト、株式投資、一人旅、写真、ブログ、毎日note更新・・・ 32歳しがない田舎の会社員、遅まきながら色々チャレンジしています! https://www.yuyakobo.net/
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。