1. Selection of Whistle

The most important part of the project is the whistle. Unlike BLE, WIFI or other remote control parts, the whistle do no need any power to keep it alive. You may think they are different, but to users, it is the same. Therefore, using passive sound wave-generator like whistle is one of the key features in this project.

It would be reasonable to propose super-sonic  sound wave as controller to avoid disturbance. While, the performance of hardware limit the acceptable resolution  in Cortex-M0 core MCU, even M4-core MCU can do much better. And audible sound can give appropriate feedback to person who control the whistle.

In this project, the mass productive cheap plastic whistle is used.

In fact, better choice is to build one whistle by yourself. This would be easy and unable to be duplicated with unique sound-track performance.


2. Analysis of the sound wave

Then, Record the sound and analysis the wave in frequency spectrum as follows,

Repeat the sound wave catch.

It is easily to be found out that above two diagram is for same whistle in peak 2735Hz despite of different volume, -50dB via -57dB.

And the spectrum is similar. Be noted, it is not the same, since there is always difference in angle of blow, air pressure or temperature. It is obviously, the section marked in red circle is similar but not same. This give another feature in my design, there is no way Getting-Same-Blow even from same whistle. The meaning is Every recorded sound is fake.

To sum up, the whistle-blow-as-controller is always battery-free and impossible to fake. Only problem is how to balance the complexity of encryption  and optimization of performance.


3. Introduction to ISD1820

As to the sound front end, ISD1820 module is used. It features analogue signal amplify, sound record and replay. The ISD1820 can drive speaker or earphone directly. Saving me from blowing each time when debugging.

4. Catch the sound in by MKR1000 board,

The analogue sound wave can transformed into digital signal by ADC function of MKR1000 board in simple arduino code.

  for (int  readIndex= 0; readIndex < numReadings; readIndex++){
    delay(CYCLETIME); // delay fpr cycle
    readings[readIndex] = analogRead(inputPin); 

The analogue readings can be stored in one-dimension array in preset sample frequency  by



Now, it is ready to move to next steps for sound encode.