#include <Arduino.h>
#ifdef ARDUINO_M5STACK_Core2
#include <M5Core2.h>
#include <driver/i2s.h>
#else
#include <M5Stack.h>
#endif
#include "AudioFileSourceSD.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorWAV.h"
#include "AudioOutputI2S.h"
AudioGeneratorWAV *wav;
AudioFileSourceSD *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;
bool playing = false;
#define OUTPUT_GAIN 40
//////sound file////
void playWAV (char effect, int volume)
{
Serial.println("Entered playWAV");
switch (effect)
{
case 'a':
file = new AudioFileSourceSD("/wav/alarm.wav");
break;
case 'b':
file = new AudioFileSourceSD("/wav/alarmhigh.wav");
break;
case 'c':
file = new AudioFileSourceSD("/wav/alarmlow.wav");
break;
case 'd':
file = new AudioFileSourceSD("/wav/error.wav");
break;
case 'e':
file = new AudioFileSourceSD("/wav/error1.wav");
break;
case 'f':
file = new AudioFileSourceSD("/wav/noread.wav");
break;
case 'g':
file = new AudioFileSourceSD("/wav/noreadings.wav");
break;
case 'h':
file = new AudioFileSourceSD("/wav/normalrange.wav");
break;
case 'i':
file = new AudioFileSourceSD("/wav/warning.wav");
break;
case 'j':
file = new AudioFileSourceSD("/wav/warninghigh.wav");
break;
case 'k':
file = new AudioFileSourceSD("/wav/warninglow.wav");
break;
case 'l':
file = new AudioFileSourceSD("/wav/startup.wav");
break;
case 'm':
file = new AudioFileSourceSD("/wav/startup.wav");
break;
case 'n':
file = new AudioFileSourceSD("/wav/update.wav");
break;
}
////conditions////
//////////////////////CONFIG STATE///////////////////////
void handleAlarmsInfoLine(struct NSinfo *ns) {
struct tm timeinfo;
// calculate sensor time difference
// calculate last alarm time difference
int sensorDifSec=24*60*60; // too much
int alarmDifSec=24*60*60; // too much
int snoozeRemaining = 0;
bool timeOK = getLocalTime(&timeinfo);
if(timeOK){
sensorDifSec=difftime(mktime(&timeinfo), ns->sensTime);
alarmDifSec=difftime(mktime(&timeinfo), lastAlarmTime);
if(timeOK) {
snoozeRemaining = difftime(snoozeUntil, mktime(&timeinfo));
if(snoozeRemaining < 0)
snoozeRemaining = 0;
}
}
unsigned int sensorDifMin = (sensorDifSec+30)/60;
Serial.print("Alarm time difference = "); Serial.print(alarmDifSec); Serial.println(" sec");
Serial.print("Snooze time remaining = "); Serial.print(snoozeRemaining); Serial.print(" sec, Snooze until "); Serial.println(snoozeUntil);
char tmpStr[10];
M5.Lcd.setTextDatum(TL_DATUM);
if( snoozeRemaining>0 ) {
sprintf(tmpStr, "%i", (snoozeRemaining+59)/60);
if(dispPage<maxPage)
drawIcon(icon_xpos[1], icon_ypos[1], (uint8_t*)clock_icon16x16, TFT_RED);
} else {
strcpy(tmpStr, "Snooze");
if(dispPage<maxPage)
M5.Lcd.fillRect(icon_xpos[1], icon_ypos[1], 16, 16, BLACK);
}
M5.Lcd.setTextSize(1);
M5.Lcd.setFreeFont(FSSB12);
// prapare intensity variables for LED strip brightness
int maxint = 255;
maxint *= cfg.LED_strip_brightness;
maxint /= 100;
int lessint = 192;
lessint *= cfg.LED_strip_brightness;
lessint /= 100;
// Serial.print("sensSgv="); Serial.print(sensSgv); Serial.print(", cfg.snd_alarm="); Serial.println(cfg.snd_alarm);
if((ns->sensSgv<=cfg.snd_alarm) && (ns->sensSgv>=0.1)) {
// red alarm state
// M5.Lcd.fillRect(110, 220, 100, 20, TFT_RED);
Serial.println("ALARM LOW");
M5.Lcd.fillRect(0, 220, 320, 20, TFT_RED);
M5.Lcd.setTextColor(TFT_BLACK, TFT_RED);
int stw=M5.Lcd.textWidth(tmpStr);
M5.Lcd.drawString(tmpStr, 159-stw/2, 220, GFXFF);
if( (alarmDifSec>cfg.alarm_repeat*60) && (snoozeRemaining<=0) ) {
sndAlarm();
alarm_low = true;
lastAlarmTime = mktime(&timeinfo);
red();
}
} else {
if((ns->sensSgv<=cfg.snd_warning) && (ns->sensSgv>=0.1)) {
// yellow warning state
// M5.Lcd.fillRect(110, 220, 100, 20, TFT_YELLOW);
Serial.println("WARNING LOW");
M5.Lcd.fillRect(0, 220, 320, 20, TFT_YELLOW);
M5.Lcd.setTextColor(TFT_BLACK, TFT_YELLOW);
int stw=M5.Lcd.textWidth(tmpStr);
M5.Lcd.drawString(tmpStr, 159-stw/2, 220, GFXFF);
if( (alarmDifSec>cfg.alarm_repeat*60) && (snoozeRemaining<=0) ) {
sndWarning();
warn_low = true;
lastAlarmTime = mktime(&timeinfo);
yellow();
}
} else {
if( ns->sensSgv>=cfg.snd_alarm_high ) {
// red alarm state
// M5.Lcd.fillRect(110, 220, 100, 20, TFT_RED);
Serial.println("ALARM HIGH");
M5.Lcd.fillRect(0, 220, 320, 20, TFT_RED);
M5.Lcd.setTextColor(TFT_BLACK, TFT_RED);
int stw=M5.Lcd.textWidth(tmpStr);
M5.Lcd.drawString(tmpStr, 159-stw/2, 220, GFXFF);
if( (alarmDifSec>cfg.alarm_repeat*60) && (snoozeRemaining<=0) ) {
sndAlarm();
alarm_high = true;
lastAlarmTime = mktime(&timeinfo);
red();}
} else {
if( ns->sensSgv>=cfg.snd_warning_high ) {
// yellow warning state
// M5.Lcd.fillRect(110, 220, 100, 20, TFT_YELLOW);
Serial.println("WARNING HIGH");
M5.Lcd.fillRect(0, 220, 320, 20, TFT_YELLOW);
M5.Lcd.setTextColor(TFT_BLACK, TFT_YELLOW);
int stw=M5.Lcd.textWidth(tmpStr);
M5.Lcd.drawString(tmpStr, 159-stw/2, 220, GFXFF);
if( (alarmDifSec>cfg.alarm_repeat*60) && (snoozeRemaining<=0) ) {
sndWarning();
warn_high = true;
lastAlarmTime = mktime(&timeinfo);
yellow();
}
} else {
if( sensorDifMin>=cfg.snd_no_readings ) {
// LONG TIME NO READINGS -> yellow warning state
// M5.Lcd.fillRect(110, 220, 100, 20, TFT_YELLOW);
Serial.println("WARNING NO READINGS");
M5.Lcd.fillRect(0, 220, 320, 20, TFT_CYAN);
M5.Lcd.setTextColor(TFT_BLACK, TFT_CYAN);
int stw=M5.Lcd.textWidth(tmpStr);
M5.Lcd.drawString(tmpStr, 159-stw/2, 220, GFXFF);
if( (alarmDifSec>cfg.alarm_repeat*60) && (snoozeRemaining<=0) ) {
no_readings = true;
sndnoreadings();
lastAlarmTime = mktime(&timeinfo);
cyan();
}
} else {
if( strstr(ns->loop_display_label,"Err" )>0 ) {
// LOOP ERROR -> red alarm state
// M5.Lcd.fillRect(110, 220, 100, 20, TFT_RED);
Serial.println("LOOP ERROR");
M5.Lcd.fillRect(0, 220, 320, 20, TFT_RED);
M5.Lcd.setTextColor(TFT_BLACK, TFT_RED);
int stw=M5.Lcd.textWidth(tmpStr);
M5.Lcd.drawString(tmpStr, 159-stw/2, 220, GFXFF);
M5.Lcd.drawString("LOOP", 2, 220, GFXFF);
M5.Lcd.drawString("ERR", 267, 220, GFXFF);
if( (alarmDifSec>cfg.alarm_repeat*60) && (snoozeRemaining<=0) ) {
sndAlarm();
lastAlarmTime = mktime(&timeinfo);
}
if(cfg.LED_strip_mode>=2) {
pixels.fill(pixels.Color(maxint, 0, 0));
pixels.show();
} else {
if(cfg.LED_strip_mode==1) {
pixels.clear();
pixels.show();
}
}
} else {
// normal glycemia state
M5.Lcd.fillRect(0, 220, 320, 20, TFT_BLACK);
M5.Lcd.setTextColor(TFT_LIGHTGREY, TFT_BLACK);
playWAV('h', 3.0);
green();
//volume/100*35
//float volumeGain = (float)OUTPUT_GAIN / (volume * 100.0);
float volumeGain = ((float)volume / 100.0) * 39.0;
Serial.print("volumeGain:");
Serial.println(volumeGain);
id3 = new AudioFileSourceID3(file);
out = new AudioOutputI2S(0, 0); // Output to builtInDAC
out->SetPinout(12, 0, 2);
out->SetOutputModeMono(true);
out->SetGain(volumeGain);
wav = new AudioGeneratorWAV();
wav->begin(id3, out);
void loop()
void alarm_high1(){
if (alarm_high){
(playWAV('b', 3.0);}
}
void alarm_low1(){
if (alarm_low){
(playWAV('c', 3.0);
}
void error1(){
if (error){
(playWAV('e', 3.0);
void no_readings1(){
if (no_readings){
(playWAV('g', 3.0));
}
}
void normal_range1(){
if (normal_range){
(playWAV('h', 3.0);
}
void update1(){
(playWAV('n', 3.0);
}
Its a quick sketch, but should give you an idea, i have the conditions, the loop for detecting if there is a true statement. and the sound cases