// Sistema de Controle para bomba de Water Cooler
// Modificado por: Alessandro Silva
//
// Versão: v1.2
// * Implementando leitura de RPM
// * Implementando Sensor Termistor de temperatura
// --------------------------------------------------------
#include "DHT.h"
#include <U8g2lib.h>
#include <Thermistor.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // Todas as placas sem reset do display
const byte OC1A_PIN = 9;
const word PWM_FREQ_HZ = 25000; //Ajuste este valor para ajustar a frequência a 25khz
const word TCNT1_TOP = 16000000/(2*PWM_FREQ_HZ);
int fan = 20;
double pulso=0;
double frequencia = 0;
int rpm = 0;
// DHT
#define DHTPIN 3 // DHT pino
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
Thermistor temp(2); // Variável do tipo Thermistor, indicando o pino analógico (A2) em que o termistor está conectadoO
void setup() {
Serial.begin(9600);
u8g2.begin();
dht.begin();
pinMode(OC1A_PIN, OUTPUT);
// Limpe o controle do Timer1 e defina os registros para 25 khz pwm
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
TCCR1A |= (1 << COM1A1) | (1 << WGM11);
TCCR1B |= (1 << WGM13) | (1 << CS10);
ICR1 = TCNT1_TOP;
// Tela de Inícialização
Serial.println("Iniciando e testando...");
delay(1000);
u8g2.clearBuffer();
/*
u8g2.setFont(u8g2_font_fur11_tf);
u8g2.drawUTF8(0,12,"Water Cooler");
u8g2.drawUTF8(0,28,"by Alessandro");
u8g2.drawUTF8(0,60,"Start test...");
u8g2.sendBuffer();
//Aumenta a velocidade dos ventiladores de 20 a 100% como teste de inicio
setPwmDuty(20);
delay(2000);
setPwmDuty(60);
delay(5000);
setPwmDuty(100);
delay(3000);
*/
}
void loop() {
float umid_DHT = dht.readHumidity(); // Lê a umidade do DHT22
float temp_DHT = dht.readTemperature(); // Lê a temperatura em Celsius do DHT22
float temp_NTC = temp.getTemp(); // Variável do tipo Ponto flutuante que recebe o valor de temperatura calculado pela biblioteca Thermistor
medirRPM();
// Avaliar a velocidade do ventilador pela temperatura do NTC
if(round(temp_NTC) > 40){ // acima desta temperatura a fan ficará sempre em 100%(rotação máxima)
fan = 100;
} else if(round(temp_NTC) < 25){ // abaixo desta temperatura a fan ficara sempre em 20%(rotação mínima)
fan = 20;
} else {
fan = map(round(temp_NTC), 25, 40, 20, 100); // map(round(t), TEMPERATURA MINIMA, TEMP MAXIMA, PORC MINIMA, PORC MAXIMA)
}
// Imprime no Monitor Serial
Serial.print("Temperatura DHT: "); //Imprime os textos no Monitor Serial
Serial.print(temp_DHT);
Serial.println(" *C ");
Serial.print(" %\t");
Serial.print("Umidade DHT: ");
Serial.print(umid_DHT);
Serial.print(" %\t");
Serial.print("Temperatura NTC: ");
Serial.print(temp_NTC);
Serial.println("*C");
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_fur35_tn);
u8g2.setCursor(20,37);
u8g2.print(temp_NTC, 1); // Imprime a temperatura do NTC em fonte Extra grande
u8g2.setFont(u8g2_font_unifont_tf);
u8g2.setCursor(65,64);
u8g2.drawUTF8(112,37,"°C");
u8g2.setCursor(15,50);
u8g2.print(rpm, 1); // Imprime a rotação da fan
u8g2.drawUTF8(50,50,"Rpm");
u8g2.setCursor(15,64);
u8g2.print(fan, 1); // Imprime a porcentagem da fan
u8g2.drawUTF8(40,64,"%");
u8g2.setCursor(85,50);
u8g2.print(temp_DHT, 1); // Imprime a temperatura DHT
u8g2.drawUTF8(114,50,"°");
u8g2.drawUTF8(120,50,"C");
u8g2.setCursor(85,64);
u8g2.print(umid_DHT, 1); // Imprime a umidade DHT
u8g2.drawUTF8(120,64,"%");
u8g2.drawFrame(0,0,10,128);
u8g2.drawBox(0,map(fan, 0, 100, 60, 0),10,128); // Imprime a barra bargraph esquerda de porcentagem da rotação
u8g2.sendBuffer();
setPwmDuty(fan);
delay(1000);
}
void setPwmDuty(byte duty) {
OCR1A = (word) (duty*TCNT1_TOP)/100;
}
void medirRPM() {
pulso=pulseIn(2,HIGH);
frequencia=1000000/(2*pulso);
Serial.print("Frequencia :");
Serial.println((frequencia*60)/2);
rpm = ((frequencia*60)/2);
}