/* File: sonometro com formato de smile
* Autor: Joo Pereira
* Email: joaodper@gmail.com
* Data: 2019
*/
#define COMMON_ANODE // Define os Leds como anodo comum
const int redPin = 13; // Leds vermelhos do contorno
const int greenPin = 9; // Leds verdes do contorno
const int sadPin = 4; // 2 Leds de baixo da boca vermelha
const int happyredPin = 5; // Leds verdes da boca
const int happygreenPin = 3; // Leds vermelhos da boca
const int sensorPIN = A0;
const int sampleWindow = 300; // Janela de medioa en mS (50 mS = 20Hz)
int r = 0;
int g = 0;
int b = 0;
int cor_anterior = 0; //0 - Verde; 1 - Laranja; 2 - Vermelho
void setup()
{
Serial.begin(9600);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(happyredPin, OUTPUT);
pinMode(happygreenPin, OUTPUT);
pinMode(sadPin, OUTPUT);
}
void loop()
{
unsigned long startMillis = millis();
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
// Mede durante a janela
unsigned int sample;
while (millis() - startMillis < sampleWindow)
{
sample = analogRead(sensorPIN);
if (sample < 1024)
{
if (sample > signalMax)
{
signalMax = sample; // Actualizar mximo
}
else if (sample < signalMin)
{
signalMin = sample; // Actualizar mnimo
}
}
}
unsigned int peakToPeak = signalMax - signalMin; // Amplitude do som
//double volts = (peakToPeak * 5.0) / 1024; // Converter para tenso
//Serial.println(peakToPeak);
if(peakToPeak<180){
// verde
setColor(0, 255); // Ligar green
setColorBoca(0, 255); // Ligar green
analogWrite(sadPin, 255); // Apaga o vermelho da boca
cor_anterior = 0;
}
if(peakToPeak>179 && peakToPeak<350){
// amarelo
setColor(255, 255); // yellow
setColorBoca(255, 255); // yellow na boca
analogWrite(sadPin, 255); // Apaga o vermelho da boca
cor_anterior = 1;
delay(100);
}
if(peakToPeak>349){
if (cor_anterior == 0) { //Se anterior era verde
// amarelo
setColor(255, 255); // yellow
setColorBoca(255, 255); // yellow
analogWrite(sadPin, 0); // Vermelho da boca
delay(100);
// vermelho
setColor(255, 0); // Acende vermelho
setColorBoca(0, 0); // Apaga amarelo na boca
analogWrite(sadPin, 0); // Acende o vermelho da boca
delay(100);
}
else{
// vermelho
setColor(255, 0); // Acende vermelho
setColorBoca(0, 0); // Apaga amarelo na boca
analogWrite(sadPin, 0); // Acende o vermelho da boca
delay(100);
}
cor_anterior = 2;
}
peakToPeak = 0;
delay(10);
}
void setColor(int red, int green)
{
#ifdef COMMON_ANODE
red = 255 - red;
green = 255 - green;
#endif
analogWrite(redPin, red);
analogWrite(greenPin, green);
}
void setColorBoca(int red, int green)
{
#ifdef COMMON_ANODE
red = 255 - red;
green = 255 - green;
#endif
analogWrite(happyredPin, red);
analogWrite(happygreenPin, green);
}
Comments
Please log in or sign up to comment.