float sensor_ph; //variável de coleta amostral
float voltagem; //variável de conversão de digital para analógico
float valor_ph; //variável que armazena o cálculo da conversão
unsigned long previousTime3 = 0; //variável de temporização para a função millis()
unsigned long previousTime2 = 0; //variável de temporização para a função millis()
String RxData; //variável para leitura do monitor serial
float calibre = 1; //variável de calibração via software
float ph_atual; //variável auxiliar da função de calibração
void setup()
{
Serial.begin(9600);
Serial.print("Projeto iniciação científica\nBruno e André - ECA6");
}
void voltagem_calibra() //método de leitura e conversão da entrada analógica
{
if(millis()-previousTime3 > 500) //executa a cada 500 milissegundos (usado no lugar de delay para não haver pausa na execução do programa)
{
sensor_ph = ph_read(A0); //armazena o valor retornado da tensão media dada pela função ph_read
voltagem = (sensor_ph * 5.0) / 1024.0; //converte a tensão e armazena na voltagem
Serial.print("voltagem: ");
Serial.print(voltagem); //printa o valor da variável
Serial.print("\t|");
previousTime3 = millis();//reseta o tempo do laço de repetição
}
}
void mede_ph() //método de leitura do pH
{
if(millis()-previousTime2 > 500 )//executa a cada 500 millissegundos
{
sensor_ph = ph_read(A0);
voltagem = (sensor_ph * 5)/1024;
if(voltagem < 4.23)//caso a tensão seja menor que 4.23 executa o calculo de conversão
{
/*Calculo de conversão:
* Dado 7 de pH como valor neutro e tendo obtido sua tensão como 4.23:
* valor_ph = 7 + ((Tensão De 7pH - Tensão De pH conhecido)/step de pH, onde
*step = (Tensão pH7 - Tensão de pH conhecido(no caso 10))/▲pH(|7-10|)
*/
valor_ph = 7 + ((4.23 - voltagem)/0.16);
}
if(voltagem > 4.23)//caso a tensão seja maior que 4.23 executa o calculo de conversão
{
/*
* O sensor de pH pode não ser totalmente alinhado, nesse caso, basta repetir
* o cálculo acima com um valor de pH abaixo de 7, recalculando seu step
*/
valor_ph = 7 + ((4.23 - voltagem)/0.18);
}
Serial.print(" pH: ");
Serial.println(valor_ph*calibre); //printa no monitor serial o valor dado pelo cálculo vezes o possível fator de correção
previousTime2 = millis();//reseta o tempo do laço de repetição
}
}
float ph_read (char pin) //método de leitura do pino analógico
{
int buf[100]; //array de n termos para armazenamento das leituras
for (int i = 0; i < 100; i++) //realiza iterações no slot do array para salvar todas as n leituras
{
buf[i] = analogRead(pin);//registra a leitura do pino escolhido e armazena no slot da iteração
delay(5);//espera 5 mlissegundos antes de realizar nova leitura em outro slot da iteração
}
for (int i = 0; i < 99; i++) //algoritmo bubble sort para organizar da menor leitura para a maior
{
for (int j = i + 1; j < 100; j++)
{
if (buf[i] > buf[j])
{
//realiza a inversão dos valores nos slots caso o valor atual seja maior que o próximo valor
int temp = buf[i];
buf[i] = buf[j];
buf[j] = temp;
}
}
}
long int avgValue = 0;
for (int i = 20; i < 80; i++) //seleciona as 60 amostragens centrais do array já reordenado
avgValue += buf[i]; //soma de todos os 60 valores
avgValue /= 60; //media dos 60 valores somados
return avgValue; //retorna como valor o resultado armazenado de avgValue
}
void cal () //função de calibração em solução de 7 de pH
{
if(Serial.available()>0) //Em caso de monitor serial disponível, executa
{
RxData = Serial.readStringUntil('\r'); //RxData realiza a varredura por toda a linha de comandos recebido pelo monitor serial
if(RxData.indexOf("calibrar") != -1)//Será procurado o comando calibrar na linha de comando recebido, caso ele exista, executa
{
float ph_atual = valor_ph; //passa o valor medido do pH para uma outra variável
calibre = 7/ph_atual; //divide o valor neutro pelo atual valor medido para que seja criado um fator de correção no pH7
}
}
}
void loop() //execução das funções
{
voltagem_calibra();
mede_ph();
cal();
}