Projeto HCSR04

Com esta programaçao o HCSRO4 me da leituras de distancia. Porém Criei uma função if que não age da maneira que deveria e esta na PARTE "//NÃO FUNCIONAL" dentro da programação. A criei para ler o nível de um tanque de maneira %, porém precisaria de uma medição de distancia contrária.
Gostaria apenas de ajuda para que a função if funcionasse me dando os valores observados na programação para assim eu dar continuidade e converter em valor %.

//INICIO FUNCIONANDO
#include <Ultrasonic.h>
#define echoPin 13
#define trigPin 12
int I;
Ultrasonic ultrasonic(12,13);

void setup()
{
Serial.begin(9600);
pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe)
pinMode(trigPin, OUTPUT); // define o pino 12 como saida (envia)
}

void loop()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

int distancia = (ultrasonic.Ranging(CM));
Serial.print("Distancia em CM: ");
Serial.println(distancia);
delay(1000); //espera 1 segundo para fazer a leitura novamente

//NÃO FUncional

//Nesta parte tento inverter os resultados onde, em um tanque pequeno de20cm.

//Quando tenho a leitura de 20cm de distancia uma diferente variavel(Neste caso I) me mosra o valor 4cm, quando 19cm esta mesma variavel me mostra o valor 5cm.

// E assim por diante
if (distancia = 20){
I = 4;
}
if (distancia = 19) {
I = 5;
}
if (distancia = 18) {
I = 6;
}
if (distancia = 17) {
I = 7;
}
if (distancia =16) {
I = 8;
}
if (distancia = 15) {
I = 9;
}
if (distancia = 14) {
I = 10;
}
if (distancia =13) {
I = 11;
}
if (distancia = 12) {
I = 12;
}
if (distancia =11) {
I = 13;
}
if (distancia = 10) {
I = 14;
}
if (distancia = 9) {
I = 15;
}
if (distancia = 8 ) {
I = 16;
}
if (distancia = 7) {
I = 17;
}
if (distancia = 6){
I = 18;
}
if (distancia = 5) {
I = 19;
}
if (distancia = 4) {
I = 20;
}

Serial.print("Distancia invertida");
Serial.println(I);
delay(1000); //espera 1 segundo para fazer a leitura novamente
}

A função não está me mostrando os valores equivalentes I corretos em relação a distancia. Gostaria de saber o porque.

OBS: SOU LEIGO NO ASSUNTO NEM MESMO SOU PROGRAMADOR, SE HOUVEREM MANEIRAS MAIS FÁCEIS DE FAZER ISSO AGRADECERIA A AJUDA. Uma ótima tarde para todos!

No if, em vez de "=" deve usar "==". Assim, esta linha:

 if (distancia = 20){

devia ser:

 if (distancia == 20){

No entanto, fazendo umas contas, poderia tornar o programa muito mais simples se substituísse os if's por uma formula que devolvesse o valor. Por isso, em vez do programa anterior devia fazer uma coisa como:

//INICIO FUNCIONANDO
#include <Ultrasonic.h>
#define echoPin 13
#define trigPin 12
int I;
Ultrasonic ultrasonic(12,13);

void setup()
{
  Serial.begin(9600);
  pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe)
  pinMode(trigPin, OUTPUT); // define o pino 12 como saida (envia)
}

void loop()
{
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  int distancia = (ultrasonic.Ranging(CM));
  Serial.print("Distancia em CM: ");
  Serial.println(distancia);
  delay(1000); //espera 1 segundo para fazer a leitura novamente

  //Nesta parte tento inverter os resultados onde, em um tanque pequeno de20cm.
  //Quando tenho a leitura de 20cm de distancia uma diferente variavel(Neste caso I) me mosra o valor 4cm, quando 19cm    
  //esta mesma variavel me mostra o valor 5cm.
  // E assim por diante

  I = 24 - distancia;

  Serial.print("Distancia invertida");
  Serial.println(I);
  delay(1000); //espera 1 segundo para fazer a leitura novamente
}

Aqui está a conclusão funcional.
Meio confusa devido minha falta de conhecimento em programação, mas para quem quiser ler nível com o sensor HCSR04 ai vai uma idéia. claro que a if e a fórmula terão de ser adaptadas para a altura de leitura de nível desejada, adaptada ao dimensionamento do tanque, mas para quem entender a lógica isso não será difícil.

#include <Ultrasonic.h>
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo

//VARIAVEL INVERSÃO IF PARA ALTURA
int I;
//VARIÁVEL DE LEITURA DE NÍVEL.
float Percentual;
//iniciando a função e passando os pinos
Ultrasonic ultrasonic(12,13);

void setup()
{
Serial.begin(9600); //inicia a porta serial
pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe)
pinMode(trigPin, OUTPUT); // define o pino 12 como saida (envia)
}

void loop()
{
//seta o pino 12 com um pulso baixo "LOW" ou desligado ou ainda 0
digitalWrite(trigPin, LOW);
// delay de 2 microssegundos
delayMicroseconds(2);
//seta o pino 12 com pulso alto "HIGH" ou ligado ou ainda 1
digitalWrite(trigPin, HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 12 com pulso baixo novamente
digitalWrite(trigPin, LOW);
// função Ranging, faz a conversão do tempo de
//resposta do echo em centimetros, e armazena
//na variavel distancia
int distancia = (ultrasonic.Ranging(CM));
Serial.print(distancia);
Serial.println("cm");

//TANQUE DE 21CM E 17CM DE LEITURA NÍVEL. ONDE 21 REPRESENTA 0% E 4 Representa 100% sendo uma leitura de 17cm de nível limite de água.
// 4 Representa 100% pois o sensor não deve entrar em contato com a água.

if (distancia >= 21){
I = 0;
}
if (distancia == 20){
I = 1;
}
if (distancia == 19) {
I = 2;
}
if (distancia == 18) {
I = 3;
}
if (distancia == 17) {
I = 4;
}
if (distancia ==16) {
I = 5;
}
if (distancia == 15) {
I = 6;
}
if (distancia == 14) {
I = 7;
}
if (distancia ==13) {
I = 8;
}
if (distancia == 12) {
I = 9;
}
if (distancia ==11) {
I = 10;
}
if (distancia == 10) {
I = 11;
}
if (distancia == 9) {
I = 12;
}
if (distancia == 8 ) {
I = 13;
}
if (distancia == 7) {
I = 14;
}
if (distancia == 6){
I = 15;
}
if (distancia == 5) {
I = 16;
}
if (distancia >= 4) {
I = 17;
}

//FORMULA PARA LEITURA PERCENTUAL DE NÍVEL EM RELAÇÃO A I.

Percentual = 100*I/17;

Serial.print(Percentual);
Serial.println("%");
delay(5000); //espera 1 segundo para fazer a leitura novamente
}

Obrigado pela ajuda!

Então, neste caso, poderia ficar da seguinte forma:

#include <Ultrasonic.h>
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo

//VARIAVEL INVERSÃO IF PARA ALTURA
int I;
//VARIÁVEL DE LEITURA DE NÍVEL.
float Percentual;
//iniciando a função e passando os pinos
Ultrasonic ultrasonic(12,13);

void setup()
{
  Serial.begin(9600); //inicia a porta serial
  pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe)
  pinMode(trigPin, OUTPUT); // define o pino 12 como saida (envia)
}

void loop()
{
  //seta o pino 12 com um pulso baixo "LOW" ou desligado ou ainda 0
  digitalWrite(trigPin, LOW);
  // delay de 2 microssegundos
  delayMicroseconds(2);
  //seta o pino 12 com pulso alto "HIGH" ou ligado ou ainda 1
  digitalWrite(trigPin, HIGH);
  //delay de 10 microssegundos
  delayMicroseconds(10);
  //seta o pino 12 com pulso baixo novamente
  digitalWrite(trigPin, LOW);
  // função Ranging, faz a conversão do tempo de
  //resposta do echo em centimetros, e armazena
  //na variavel distancia
  int distancia = (ultrasonic.Ranging(CM));
  Serial.print(distancia);
  Serial.println("cm");

  //TANQUE DE 21CM E 17CM DE LEITURA NÍVEL. ONDE 21 REPRESENTA 0% E 4 Representa 100% sendo uma leitura de 17cm de nível limite de água.
  // 4 Representa 100% pois o sensor não deve entrar em contato com a água.

  if (distancia > 21) {
    I = 0;
  }
  else if (distancia < 4) {
    I = 17;
  }
  else {
    I = 21 - distancia;
  }
  
  //FORMULA PARA LEITURA PERCENTUAL DE NÍVEL EM RELAÇÃO A I.

  Percentual = 100*I/17;

  Serial.print(Percentual);
  Serial.println("%");
  delay(5000); //espera 1 segundo para fazer a leitura novamente
}

Fico muito melhor mesmo! Obrigado! Ja testei e funciono perfeitamente simplificado assim.