/**
ESP32 + NTC temperature sensor + Potenciometer measurement
ALUNO: Lucas Torres Marques
MATRÍCULA: 20190091165
DATA: 13/10/2022
REFERÊNCIAS:
- https://rntlab.com/question/analogread-for-ntc-thermistor/
- https://www.youtube.com/watch?v=UXKu2Xtwj7c
- https://www.digikey.com/en/maker/projects/how-to-measure-temperature-with-an-ntc-thermistor/4a4b326095f144029df7f2eca589ca54
- https://docs.wokwi.com/pt-BR/parts/wokwi-ntc-temperature-sensor
- https://docs.wokwi.com/pt-BR/parts/wokwi-potentiometer
*/
//Define se está em debug mode ou não
#define DEBUG false
//Numero de amostras para calcular a media
#define SAMPLERATE 5
//Resistor em série (10kOhm do módulo NTC)
#define SERIESRESISTOR 10000
//Resistência nominal do Thermistor (10kOhm)
#define THERMISTORNOMINAL 10000
//Coeficiente Beta
#define BETA 3950
//Temperatural nominal do thermistor (em graus celsius)
#define TEMPERATURENOMINAL 25
//Define a precisão do print
#define PRECISION 100000
//Pinagem
#define THERMISTORPIN 34
#define POTENCIOMETERPIN 35
//Funções úteis
void printDouble(double val, unsigned int precision);
void printHeader();
double getTemp();
double getVoltage();
void setup() {
Serial.begin(115200);
}
void loop() {
printHeader();
//Coleta a temperatura medida pelo módulo NTC
double celsius = getTemp();
Serial.print("Temperatura: ");
Serial.print(celsius);
Serial.println(" ℃");
//Coleta a tensão dissipada no potenciômetro
double voltage = getVoltage();
Serial.print("Queda de tensão: ");
Serial.print(voltage);
Serial.println(" V");
printHeader();
//Repete a medição a cada 3 segundos
delay(3000);
}
//Função para medição da temperatura
double getTemp() {
double thermalSamples[SAMPLERATE];
double average, kelvin, resistance, celsius;
int i;
// Coleta SAMPLERATE (default 5) amostras
for (i=0; i<SAMPLERATE; i++) {
thermalSamples[i] = analogRead(THERMISTORPIN);
delay(10);
}
// Calcula a média das tensões
average = 0;
for (i=0; i<SAMPLERATE; i++) {
average += thermalSamples[i];
}
average /= SAMPLERATE;
resistance = 4095.0 / average - 1;
if(DEBUG) {
Serial.print("Resistance: ");
printDouble(resistance, PRECISION);
Serial.println("");
}
resistance = SERIESRESISTOR/resistance;
if(DEBUG) {
Serial.print("Resistance: ");
printDouble(resistance, PRECISION);
Serial.println("");
}
kelvin = resistance/THERMISTORNOMINAL;
if(DEBUG) {
Serial.print("R/R0: ");
printDouble(kelvin, PRECISION);
Serial.println("");
}
kelvin = log(kelvin);
if(DEBUG) {
Serial.print("ln(R/R0): ");
printDouble(kelvin, PRECISION);
Serial.println("");
}
kelvin = (1.0/BETA) * kelvin;
if(DEBUG) {
Serial.print("1/B * ln(R/R0): ");
printDouble(kelvin, PRECISION);
Serial.println("");
}
kelvin = (1.0/(TEMPERATURENOMINAL+273.15)) + kelvin;
if(DEBUG) {
Serial.print("1/To + 1/B * ln(R/Ro): ");
printDouble(kelvin, PRECISION);
Serial.println("");
}
kelvin = 1.0/kelvin;
if(DEBUG) {
Serial.print("1/(1/To + 1/B * ln(R/Ro)): ");
printDouble(kelvin, PRECISION);
Serial.println("");
}
// Converte de Kelvin para Celsius
celsius = kelvin - 273.15;
return celsius;
}
double getVoltage() {
double voltageSamples[SAMPLERATE];
double average, voltage;
int i;
// Coleta SAMPLERATE (default 5) amostras
for (i=0; i<SAMPLERATE; i++) {
voltageSamples[i] = analogRead(POTENCIOMETERPIN);
delay(10);
}
// Calcula a média das tensões
average = 0.0;
for (i=0; i<SAMPLERATE; i++) {
average += voltageSamples[i];
}
average /= SAMPLERATE;
if(DEBUG) {
Serial.print("Potência média: ");
printDouble(average, PRECISION);
Serial.println("");
}
voltage = (3.3/4095.0) * average;
return voltage;
}
//Função para impressão dos doubles
void printDouble(double val, unsigned int precision){
// Imprime val com o núimero de casas decimais determinadas por precision
// NOTE: precision é 1 seguido do número de zeros que desejar para o número de casas decimais
// exemplo: printDouble(3.1415, 100); // imprime 3.14 (duas casas decimais)
Serial.print (int(val));
Serial.print(".");
unsigned int frac;
if(val >= 0)
frac = (val - int(val)) * precision;
else
frac = (int(val)- val ) * precision;
Serial.print(frac,DEC);
}
void printHeader() {
Serial.println("==================================================");
}