Nota: Caso se pretenda fazer rodar o cooler sem o uso de energia elétrica (energia eólica, por exemplo) basta retirar a fonte externa do circuito. Este sistema pode ser usado para a construção de um anemómetro.
/*
Projeto 42 - Número de rotações por minuto de um cooler de 3 fios
Física na Lixa
https://fisicanalixa.blogspot.com/
https://sites.google.com/aelixa.pt/fisicaearduino
*/
int contagem = 0;
unsigned long tempo_i;
int rpm;
void setup()
{
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(2), contador, RISING); //Aciona a interrupção quando o estado do pino 2 for de LOW para HIGH
} //Nesse momento incrementa a "contagem"
void loop()
{
tempo_i = millis();
contagem = 0;
while((millis() - tempo_i) < 1000) //Mede o número de pulsos num segundo (1000 ms)
{
}
rpm = contagem*60/2; //Número de contagens num minuto (60 s) e divide pelo número de pulsos por volta (2)
Serial.print(rpm);
Serial.println(" rpm");
}
void contador()
{
contagem++;
}
Nota: O sensor de temperatura controla a frequência de rotação do cooler.
/*
Projeto 42 - Número de rotações por minuto de um cooler de 4 fios
A frequência de rotação do cooler é controlada pela temperatura (medida pelo "Módulo Sensor de Temperatura DS18B20")
Física na Lixa
https://fisicanalixa.blogspot.com/
https://sites.google.com/aelixa.pt/fisicaearduino
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#define pinSensor 7
#define pinControlVel 3 //Pino que controla a velocidade do cooler
OneWire meuWire(pinSensor);
DallasTemperature meuSensor(&meuWire);
float Celsius = 0;
int contagem = 0;
unsigned long tempo_i;
int rpm;
void setup()
{
Serial.begin(9600);
meuSensor.begin();
pinMode(pinControlVel, OUTPUT);
analogWrite(pinControlVel, 0);
attachInterrupt(digitalPinToInterrupt(2), contador, RISING); //Aciona a interrupção quando o estado do pino 2 for de LOW para HIGH
} //Nesse momento incrementa a "contagem"
void loop()
{
meuSensor.requestTemperatures();
Celsius = meuSensor.getTempCByIndex(0);
if (Celsius > 30)
{
analogWrite(pinControlVel, 255);
}
else if (Celsius > 20)
{
analogWrite(pinControlVel, 126);
}
else
{
analogWrite(pinControlVel, 0);
}
tempo_i = millis();
contagem = 0;
while((millis() - tempo_i) < 1000) //Mede o número de pulsos num segundo (1000 ms)
{
}
rpm = contagem*60/2; //Número de contagens num minuto (60 s) e divide pelo número de pulsos por volta (2)
Serial.print(rpm);
Serial.print(" rpm");
Serial.print("\t");
Serial.print(Celsius,1);
Serial.print(" \xC2\xB0"); //Código para o símbolo grau
Serial.println("C");
}
void contador()
{
contagem++;
}