ヘッドフォンをかけていたり、大きめの音で音楽を聴いていると玄関のお客さんに気がつかないことがありますね。WiFiサウンドセンサーは離れた場所の物音や振動をマイクで検知して、LEDの光で知らせてくれます。
主な部品
「Board1 ver.1.0」ESP-WROOM-02搭載モジュール:2個
マイコン内蔵RGB 5mmLED:2個
SPW2430搭載 シリコンMEMSマイクモジュール:1個
受信側のスケッチ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#include <ESP8266WiFi.h> #include <WiFiUdp.h> #include <Adafruit_NeoPixel.h> #define PIN 13 #define NUMPIXELS 1 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); WiFiUDP Udp; char packetBuffer[255]; unsigned int localPort = 9999; const char *ssid = "ListenToMe"; const char *password = "Hello0101"; IPAddress ipServer(192, 168, 12, 1); IPAddress ipClient(192, 168, 12, 3); IPAddress Subnet(255, 255, 255, 0); const int LED = 16; int glow=0; int glowTimes=0; void setup() { Serial.begin(115200); Serial.println("setup"); WiFi.begin(ssid, password); Serial.println("wifi begin"); WiFi.mode(WIFI_STA); // STA important !!! WiFi.config(ipClient, ipServer, Subnet); Udp.begin(localPort); delay(200); pixels.begin(); } void loop() { int data; int packetSize = Udp.parsePacket(); if (packetSize) { int len = Udp.read(packetBuffer, 255); if (len > 0) { glowTimes=0; packetBuffer[len-1] = 0; data=atoi(packetBuffer); glow=data; } } if(glowTimes<40){ glowTimes++; } else{ glow=0; } if(glow==0) pixels.setPixelColor(0, pixels.Color(12,0,0)); else pixels.setPixelColor(0, pixels.Color(0,glow,0)); pixels.show(); analogWrite(LED, glow); Serial.println(glow); delay(50); } |
送信側のスケッチ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
#include <ESP8266WiFi.h> #include <WiFiUdp.h> extern "C" { #include "user_interface.h" } #include <Adafruit_NeoPixel.h> #define PIN 13 #define NUMPIXELS 1 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); WiFiUDP Udp; char packetBuffer[128]; unsigned int localPort = 9999; const char *ssid = "ListenToMe"; const char *password = "Hello0101"; IPAddress ipServer(192,168,12,1); IPAddress ipGateway(0,0,0,0); IPAddress Subnet(255,255,255,0); IPAddress ipBroadcast(192,168,12,255); const int LED = 16; const int arraySize = 225; //about 75msec duration for 0.11msec interval int data[arraySize]; float loudness=0; int soundValue; void setup() { Serial.begin(115200); WiFi.softAPConfig(ipServer, ipGateway, Subnet); WiFi.softAP(ssid, password); Udp.begin(localPort); pixels.begin(); } void loop() { readMic();//225data:75msec loudness = proc_sound()*200; soundValue = constrain ((int)loudness,0,255); Serial.println(soundValue); if(soundValue > 100){ analogWrite(LED, soundValue); pixels.setPixelColor(0, pixels.Color(0,soundValue,0));pixels.show(); sendUDP(soundValue); } analogWrite(LED, 0); pixels.setPixelColor(0, pixels.Color(12,0,0));pixels.show(); } void sendUDP(int data){ //int data; Udp.beginPacket(ipBroadcast,9999); char sbuf[128]; unsigned long testID = millis();//sampleData //sprintf(sbuf, "%lu", testID); sprintf(sbuf, "%d", data); Udp.write(sbuf); Udp.write("\r\n"); Udp.endPacket(); //Serial.print("S : ");Serial.println(sbuf); delay(50);//100~OK,50NG } //********MicSNR********** void readMic() { for (int i = 0; i < arraySize; i++) { //data[i] = system_adc_read(); data[i] = kill_noise(); } } int kill_noise(){ int s0,s1,s2,smin=0,smax=1023; s0=system_adc_read(); s1=system_adc_read(); s2=system_adc_read(); if(s0==s1) return s0; if(s1==s2) return s1; if(s2==s0) return s2; if (s0<s1) smin = s0; else smin = s1; if (s2<smin) smin = s2; if (s0>s1) smax = s0; else smax = s1; if (s2>smax) smax = s2; if(s0>smin && s0<smax) return s0; if(s1>smin && s1<smax) return s1; if(s2>smin && s2<smax) return s2; } float proc_sound() { //global variable:data[], offset //float loudness = 0; //float offset_cnd = 0; int soundMin=1023,soundMax=0; float mean=0,std=0; for(int i = 0; i < arraySize; i++) mean = mean + (float)data[i]; mean = mean / arraySize; for(int i = 0; i < arraySize; i++) std = std + sq((float)data[i]-mean); std = sqrt(std/(arraySize-1)); for (int i = 0; i < arraySize; i++) { if(data[i]>soundMax) soundMax=data[i]; if(data[i]<soundMin) soundMin=data[i]; } /* Serial.print("mean : ");Serial.print(mean); Serial.print(" /std : ");Serial.print(std); Serial.print(" /Max : ");Serial.print(soundMax); Serial.print(" /Min : ");Serial.print(soundMin); Serial.print(" /Max-Min : ");Serial.println(soundMax-soundMin); */ delay(50); return std; } |