1919
2020#include " Arduino_ScienceKitCarrier.h"
2121
22+ // static members must be initialized externally the class definition
23+ short ScienceKitCarrier::sampleBuffer[MICROPHONE_BUFFER_SIZE];
24+ volatile int ScienceKitCarrier::samplesRead;
25+
2226
2327ScienceKitCarrier::ScienceKitCarrier (){
2428 round_robin_index=0 ;
@@ -77,7 +81,10 @@ ScienceKitCarrier::ScienceKitCarrier(){
7781 external_temperature=EXTERNAL_TEMPERATURE_DISABLED;
7882 external_temperature_is_connected=false ;
7983
80- round_robin_index = 0 ;
84+ microphone_rms=0 ;
85+ rms=0 ;
86+
87+ round_robin_index=0 ;
8188
8289 thread_activity_led = new rtos::Thread ();
8390 thread_update_bme = new rtos::Thread ();
@@ -140,6 +147,10 @@ int ScienceKitCarrier::begin(const uint8_t auxiliary_threads){
140147 return ERR_BEGIN_ULTRASONIC;
141148 }
142149
150+ // let's start microphone (PDM on Arduino Nano RP2040 Connect)
151+ if (beginMicrophone ()!=0 ){
152+ return ERR_BEGIN_MICROPHONE;
153+ }
143154
144155 // let's start bme688 and external ds18b20 probe
145156 startAuxiliaryThreads (auxiliary_threads);
@@ -154,6 +165,7 @@ int ScienceKitCarrier::begin(const uint8_t auxiliary_threads){
154165/* *******************************************************************/
155166
156167void ScienceKitCarrier::update (const bool roundrobin){
168+ updateMicrophone (); // about 1ms when MICROPHONE_BUFFER_SIZE is 512
157169 if (!roundrobin){
158170 updateAnalogInput ();
159171 updateAPDS ();
@@ -608,6 +620,8 @@ void ScienceKitCarrier::setActivityLed(const int led_state){
608620 activity_led_state=led_state;
609621}
610622
623+
624+
611625/* *******************************************************************/
612626/* Function Generator Controller */
613627/* *******************************************************************/
@@ -646,6 +660,8 @@ uint8_t ScienceKitCarrier::getRange2(){
646660 return range2;
647661}
648662
663+
664+
649665/* *******************************************************************/
650666/* Ultrasonic Sensor */
651667/* *******************************************************************/
@@ -678,6 +694,8 @@ bool ScienceKitCarrier::getUltrasonicIsConnected(){
678694 return ultrasonic_is_connected;
679695}
680696
697+
698+
681699/* *******************************************************************/
682700/* External Temperature Probe */
683701/* *******************************************************************/
@@ -691,13 +709,13 @@ int ScienceKitCarrier::beginExternalTemperature(){
691709void ScienceKitCarrier::updateExternalTemperature (){
692710 float temperature;
693711 pinMode (OW_PIN,INPUT);
712+
694713 DSTherm drv (ow);
695-
696- drv.convertTempAll (DSTherm::MAX_CONV_TIME, false );
714+ drv.convertTempAll (DSTherm::MAX_CONV_TIME, false );
697715
698716 static Placeholder<DSTherm::Scratchpad> scrpd;
699-
700717 OneWireNg::ErrorCode ec = drv.readScratchpadSingle (scrpd);
718+
701719 if (ec == OneWireNg::EC_SUCCESS) {
702720 if (scrpd->getAddr ()!=15 ){
703721 external_temperature_is_connected=false ;
@@ -717,7 +735,6 @@ void ScienceKitCarrier::updateExternalTemperature(){
717735 }
718736}
719737
720-
721738float ScienceKitCarrier::getExternalTemperature (){
722739 return external_temperature;
723740}
@@ -729,7 +746,6 @@ bool ScienceKitCarrier::getExternalTemperatureIsConnected(){
729746void ScienceKitCarrier::threadExternalTemperature (){
730747 beginExternalTemperature ();
731748 while (1 ){
732- // updateAnalogInput(UPDATE_INPUT_A);
733749 updateExternalTemperature ();
734750 updateAnalogInput (UPDATE_INPUT_A);
735751 rtos::ThisThread::sleep_for (1000 );
@@ -738,6 +754,43 @@ void ScienceKitCarrier::threadExternalTemperature(){
738754
739755
740756
757+ /* *******************************************************************/
758+ /* Microphone */
759+ /* *******************************************************************/
760+
761+ int ScienceKitCarrier::beginMicrophone (){
762+ PDM.setGain (50 );
763+ PDM.onReceive (updateMicrophoneDataBuffer);
764+ if (!PDM.begin (channels, frequency)){
765+ return ERR_BEGIN_MICROPHONE;
766+ }
767+ return 0 ;
768+ }
769+
770+ void ScienceKitCarrier::updateMicrophone (){
771+ if (samplesRead) {
772+ // Calculate the RMS of data buffer
773+ rms=0 ;
774+ for (int i=0 ; i<samplesRead; i++){
775+ rms=rms+(sampleBuffer[i]*sampleBuffer[i]);
776+ }
777+ rms=rms/samplesRead;
778+ microphone_rms=sqrt (rms);
779+ samplesRead = 0 ;
780+ }
781+ }
782+
783+ void ScienceKitCarrier::updateMicrophoneDataBuffer (){
784+ int bytesAvailable = PDM.available ();
785+ PDM.read (sampleBuffer, bytesAvailable);
786+ samplesRead = bytesAvailable / 2 ;
787+ }
788+
789+ uint ScienceKitCarrier::getMicrophoneRMS (){
790+ return microphone_rms;
791+ }
792+
793+
741794
742795
743796/* *******************************************************************/
0 commit comments