Ir ao conteúdo
  • Cadastre-se

Nível dágua usando Arduíno e sensor capacitivo caseiro


Posts recomendados

Acabo de finalizar o teste usando um balde para teste e uma ripa como suporte da sonda. A bobina foi fixada sobre 2 parafusos envoltos com veda rosca para evitar riscos no esmalte. Na foto da sonda é possível ver a bobina de 10 voltas 29AWG e um arame de alumínio nu. A variação de leitura com 60 cm de fio torcido foi de 0,3mm pico a pico. Sem torcer o fio pula para 5mm. No programa é feita uma média das últimas 16 leituras para atenuação dos ruídos. Em breve pretendo fazer testes com fios longos entre o Arduino e a sonda utilizando par trançado de telefonia.

Ajustes: P1 deve ser ajustado para o limite do modo comum do comparador. No caso do LM239 são 10,5V para 12V de alimentação.

P2 deve ser ajustado para se ter uma contagem de no máximo 60 mil com a sonda a 100%. Lembre-se que o contador vai até 65535. Isso resultará em 4ms de tempo máximo de aquisição de dado.

 

Tentei na elaboração do código usar a variável ponteiro para a escrita na matriz mas não tive êxito. A saída foi utilizar a estrutura switch. Alguém sabe como informar como se escreve na matriz com índice?

// O projeto abaixo tem por objetivo a medição de nível dágua por sensor capacitivo. Utiliza um
// circuito RC onde R é fixo e C o sensor de nível. Pelo tempo que leva para atingir a referência
// do comparador se tem a medição utilizando o CAPTURE do timer 1. Medindo o tempo que se tem no 
// início da sonda e no final tem-se uma equação de reta que é usada para converter a medição em 
// centímetros de coluna dágua. è importante que o fio que vai do Arduíno para a sonda esteja torcido.
// No teste com 60cm de fio sem torcer a variação era de 5mm pico a pico. Depois de torcido baixou
// para 0,3 mm. Numa instalação maior o par torcido de telefonia é uma boa opção. 
// Pela delicadeza do sinal foi montada uma média dos últimos 16 valores para se ter uma leitura mais estável.
// Na leitura do serial monitor a primeira coluna é o nível em cm, a segunda o valor médio das 
// últimas 16 leituras, a terceira o valor da última leitura, a quarta a posição do ponteiro da
// matriz e na quinta a soma das últimas 16 leituras. Só nos interessa o valor em cm mas estes outros
// valores nos ajudam a compreender o projeto. 
// Para se ter a leitura de todas as medições comentar as linhas 114 e 125. Na montagem inicial sugiro
// colocar um capacitor entre 50nF e 100nF no lugar da sonda. 
// Sonda constituida por 10 voltas de fio esmaltado 29AWG.
//      Sérgio de Azevedo Lembo

# include <stdio.h>
# define transistor 7
// pino 8 é a entrada do CAPTURE do TIMER 1.
unsigned int valor; // valor de cada medição
float valor1; // média dos últimos 16 valores
unsigned long media;  // soma dos últimos 16 valores
int ponteiro = 16; // índice da matriz
unsigned long valores[16]; // matriz
float cm; // tempo convertido em cm de coluna dágua
char tempo = 36; // ajusta intervalo do display
void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
pinMode (8, INPUT_PULLUP);  // digital 8 como entrada com pull up resistor, entrada do comparador externo
pinMode (transistor, OUTPUT);
digitalWrite (transistor, HIGH);

TCCR1A = TCCR1C = TCNT1 = TCCR2A = TIMSK2 = 0; // setup dos timers
TCCR1B = 0X80;  // habilita captura timer1  0X80 = TIMER PARADO E 0X81 = TIMER CORRENDO COM CLOCK / 1
TCCR2B = TIFR2 = 0X7; // setup timer 2

}

void loop() {
  // put your main code here, to run repeatedly:
TIFR1 = 0X27; // reseta flags do timer 1
TCNT1 = 0; // reseta contagem timer 1
ICR1 = 0; // reseta Capture do timer 1
TCCR1B = 0X81; // dispara timer
digitalWrite (transistor, LOW); // libera o transistor de descarga do sensor capacitivo
while (TIFR1 == 0) { // aguarda flag do capture ou do overflow do timer 1
}
TCCR1B = 0X80; // paraliza timer 1
digitalWrite (transistor, HIGH); // descarrega o sensor capacitivo
valor = ICR1; // lê o valor capturado
ponteiro --; // administra o indice da matriz
switch (ponteiro) {
  case 0:
  valores[0] = valor;
  break;
  case 1:
  valores[1] = valor;
  break;
  case 2:
  valores[2] = valor;
  break;
  case 3:
  valores[3] = valor;
  break;
  case 4:
  valores[4] = valor;
  break;
  case 5:
  valores[5] = valor;
  break;
  case 6:
  valores[6] = valor;
  break;
  case 7:
  valores[7] = valor;
  break;
  case 8:
  valores[8] = valor;
  break;
  case 9:
  valores[9] = valor;
  break;
  case 10:
  valores[10] = valor;
  break;
  case 11:
  valores[11] = valor;
  break;
  case 12:
  valores[12] = valor;
  break;
  case 13:
  valores[13] = valor;
  break;
  case 14:
  valores[14] = valor;
  break;
  case 15:
  valores[15] = valor;
  break;
}
if(!ponteiro){
  ponteiro = 16;
} // abaixo soma os últimos 16 valores
media = valores[0]+valores[1]+valores[2]+valores[3]+valores[4]+valores[5]+valores[6]+valores[7]+valores[8]+valores[9]+valores[10]+valores[11]+valores[12]+valores[13]+valores[14]+valores[15];
valor1 = media/16; // média dos últimos 16 valores
cm = valor1/596,33+0.169+0.005; // converte o valor médio em cm
if (TIFR2){ // administra a atualização do display
tempo --;
TIFR2 = 7;
}
if (!tempo){
tempo = 36;
Serial.print(cm, 2);
Serial.print("   ");
Serial.print(valor1, 0);
Serial.print("   ");
Serial.print(valor);
Serial.print("   ");
Serial.print(ponteiro);
Serial.print("   ");
Serial.println(media);
}
}

20211206_233742.png

20211206_233831.png

20211206_235045.png

  • Curtir 3
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Alguns refinamentos ainda devem ser feitos. Entre eles:

- tratar a alteração das flags do timer 1. Se tiver sido disparada pelo overflow indica que o aparelho está com a fiação da sonda em curto ou que o esmalte da sonda foi danificado. No momento a preocupação é verificar a viabilidade da ideia.

- acionamento de bomba d'água

- HMI para parâmetros da bomba d'água, possivelmente um ESP01, é barato e atualmente até faxineira tem smartphone.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

IMPORTANTE: Na linha em que faço a conversão do valor médio para cm aquilo é uma equação de reta. Fiz a medição de valor médio com 2 cm na escala e depois com 25cm (nível máximo do meu balde) para puxar a equação ax + b. A última constante é de arredondamento. Terá que repetir o procedimento para ter a sua equação.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1ªmente projeto bacana e duas palavras.. para béns.😁

 

Agora me explique o princípio de sua sonda. Minha suposição que é capacitiva: quanto + fundo = capacitância maior. Medindo o tempo de carga deste "capacitor" acha-se a profundidade da água. Aliás uma ideia conceitual similar que tive (sem prática) era a mesma pra uma "célula de carga" que teorizei pra pesar o peso de um botijão de gás pra avisar quando no fim.. ideia ainda em banho maria: um "capacitor" em baixo do botijão: diminui peso=diminui capacitância. No meu (meu) caso, tal capacitor faria parte de um oscilador que variava a freq. 🙃

 

Voltando pra você...

Para indexar o valor de sua tabela com o resultado é relativamente simples... de fato tal algoritmo já foi por mim usado e é 100% de próprio punho. Era pra para linearizar uma conversão de termopar tipo j. Vejamos:

Digamos o valor da captura vá mesmo de 0 a 60000 (o que penso ser pouco provável na prática). Neste caso:

#define vmax 60000
char const tabela_cm[16]={1,3,6,15,37,58,101,140,199,204,208,210,217,240,253};//chutes
char nivel //em cm
int sonda //da captura

para achar o valor correspondente ao nível na matriz tabela basta

nivel=tabela_cm[sonda/(vmax/16)];//60000/16=3750

 

Com o tempo talvez haja alguma variação causada por alguma calcificação das sondas ... só o tempo vai lhe dizer. Além do + há muito risco do esmalte se quebrar. Mesmo que mínimo já deve zoar pois vai haver contato com a água. Teste com fio encapado e de capa quase grossa.

 

Ah e me esqueci. Alguns mc têm comparador. Neste caso você nem precisa do externo. O algoritmo:

-torne o pino saída digital e nível 0 pra descarregar o cap

-zere um timer

-torne-o entrada e conectado na entrada [+] do comparador

-a entrada [-] pode ser programada pra alguns valores internos

-aguarde a saída do comparador ir a 1 enquanto conta o timer

-pare o timer

-capture

 

6 horas atrás, Sérgio Lembo disse:

No momento a preocupação é verificar a viabilidade da ideia.

Dica: faça teste com um capacímetro pra ter certeza que a água altera a capacitância. Dica2: faça teste com ohmímetro e fio nu na água: penso que a resistência esta sim deve variar mensuravelmente ... obviamente outro projeto.

...

 

😁

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Belo trabalho!

Fiz um leitor de nível d`água na minha caixa d'água.

Algumas considerações.

1 - Com tantos valores possíveis, seu projeto é muito bom para medir o volume de um recipiente, como tanques grandes. Nestes casos os sensores capacitivos seriam industriais.

2 - A condução do sinal desde o sensor até o hardware é realmente um problema. Dependendo do caso, um cabo blindado é necessário.

3 - No meu caso, a umidade no interior do telhado impediu a colocação de um transmissor do sinal, o que evitaria um fio grande entre o sensor e o hardware.

Parabéns!

MOR_AL

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@.if Um fio com isolação mais grossa? Tá de brincadeira? Quanto mais fina maior a capacitância por centímetro. Distância entre placas, a água é a segunda placa. Fazendo 10 voltas estou com aproximadamente 1nF/cm. Sobre a degradação do esmalte estou usando o esmalte 180ºC.

Fiquei tentado ao esmalte soldável 155ºC mas resisti. Existem trabalhos sobre o uso dessa sonda. Aceita desde água destilada a água marinha e variação de temperatura sem oscilação de valor. Também resistiu ao tempo em testes de 180 dias sem variação. Minha dúvida era quanto ao método. Por frequência ou por RC em tese ambos serão sensíveis a interferência. O RC é o mais simples e barato. Pensei no comparador do atmega328p mas mantive o externo por acreditar que quanto maior a tensão e por consequência maior a energia acumulada no capacitor (é relação quadrática) mais difícil a influência das interferências. Também acredito que o comparador de transistor bipolar seja mais robusto a picos de interferência que o delicado comparador CMOS do processador.

@MOR O legal do sensor industrial é o tubo em inox, roscas e terminais padronizados. Caro pra dedéu. No momento a fiação está exposta mas dando certo a intenção é colocar num tubo de PVC (dá um trabalhão) ou uma estrutura com tampa lateral para facilitar a montagem. Comprei a minutos rolo de 100m de par trançado de telefonia. Com cabo curto de 60cm trançado na mão sem capricho deu certo. Com cabo paralelo de 2m foi um desastre. Com o cabo telefônico vou fazer testes de 15m ou mais. No momento a variação de leitura está sendo de 0,3mm pico a pico desde nível alto ao baixo, lembrando que tenho 25cm de coluna no balde. Detalhe da montagem: uni as duas pontas da bobina da sonda, o circuito está em protoboard cheia de fios que são antenas em potencial.

Tinha dúvidas se um transistor NPN daria uma boa saturação ou se necessitaria de um mosfet. Com 10k na resistência de base consegui 5 mV para uma carga de 50k a 12V usando o BC239. Desisti do mosfet. Troquei o resistor de base de 10k por 1k para ter mais performance de descarga. Quando inicio o tratamento do sinal primeiro saturo o transistor para depois tratar. Ganho tempo para garantir a descarga. No momento estou usando cálculo com ponto flutuante, muito mais lerdo. A intenção futura é passar para um STM32F030. Mais barato que o atmel e a estrutura de 32bits vai me permitir o cálculo sem ponto flutuante. Isso irá aumentar o desempenho de leituras por segundo para 250.

 

@.if sobre a instrução na tabela, tentei essa de fazer escrita na tabela sem sucesso:

unsigned int ponteiro // índice da tabela

unsigned int valores [16] // matriz

int valor // valor capturado

.....

valores [ponteiro] = valor; // não consegui escrever na tabela desta forma, apelei para o switch

 

Notei que você não só colocou variável na chave como também se deu ao luxo de colocar uma expressão.

IDE utilizada: Arduino.

 

 

Sobre usar a leitura do timer, prefiro a do capture do timer 1. É preciso.

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Zoou com a minha ideia do fio capa grossa (casca grossa!) mas vai colocar fio encapado o que no fundo tem o mesmo objetivo de eternizar o sistema. Teorizo que algumas dezenas de pF/cm tal fio são mensuráveis talvez não pelo seu método mas algo como oscilador de alguns MHz

 

Não entendi o porquê valores [ponteiro] = valor; não teres conseguido. Tenta ambos de mesmo tipo

unsigned long valores[16],valor; //se o mc e seus registros forem  8 bits pode ser int mesmo

 

Sua ideia do switch é ligeiramente pobre mas se ficou feliz com ela.. então tá. Se bem que agora entendi que não queres linearizar mas apenas guardar os valores pra depois tirar a a média. Portanto não há necessidade de colocar a variável na chave.

No entanto ativando o tradicional modo minimalista, nem precisa de armazenar valores (a não ser que vá usá-los). Basta algo como (semi completo):

unsigned char ponteiro;
unsigned int valor;

valor=0;
ponteiro=16;
while(ponteiro--)
{
digitalWrite (transistor, LOW); // libera o transistor de descarga do sensor capacitivo
while (TIFR1 == 0);  // aguarda flag do capture ou do overflow do timer 1
TCCR1B = 0X80; // paraliza timer 1
digitalWrite (transistor, HIGH); // descarrega o sensor capacitivo
valor+= ICR1; // lê o valor capturado
}
valor/=16;

Já sai com a média 🤪.

 

Ah e quase ia esquecendo.. desculpa... De nada!

Não sei se sinto vontade + opinar sobre casca grossa 😠

😁

 

 

 

Permita-me dar + uma opinadinha. 😜 Tudo a ver o lance do V + alta pro sistema ficar otimizado. Também sugiro fazer o uso de acopladores óticos tanto pra descarga do cap como pra captura. Acho que nem preciso desenhar né? 🙃

  • Curtir 2
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@.if Grato pela resposta.

O sistema prevê 4ms de carga do capacitor para nível máximo (60 mil contagens). Da forma atual tenho a média a cada leitura, na sua proposta a cada 16 leituras. Pelo fim a que se destina essa queda é aceitável e simplifica e muito o programa além de evitar os lentos cálculos de float. Vai ficar tão rápida a sequência que até tenho receio de que o transistor não consiga efetuar a descarga da sonda mas para isso existem os testes.

O switch foi desespero de causa, não conseguia fazer de forma indexada. De qualquer forma quando o projeto estiver concluso migrarei para o ARM, fazer contas com 32bits num clock é irado, o AVR tem que dar voltas para fazer o mesmo. Para informação: com o programa enviando dados para o serial monitor em 115200 baud eu estava tendo umas 10 leituras por segundo. Pela simplificação, sem float, creio que deva aumentar, mesmo sendo a cada 16 leituras.

Link para o comentário
Compartilhar em outros sites

@Sérgio Lembo

Se você já tem a equação da reta y = Ax + B, tem um macete para fugir do ponto flutuante e usar apenas uma variável com 32 bits e outras com 16 bits.

Imagine que você tem a seguinte equação da reta, que você calculou. No meu caso os coeficientes A e B valem:

A = 1,5471 e B = 212,3445

A equação da reta, considerando a variável "x" como o resultado do CAD (CAD_Result), fica...

 

Y = (1,5471 * CAD_Result - 212,3445) 

 

... Mas tem valores decimais. Se você usar apenas valores inteiros, vai perder muita precisão. Só no coeficiente A, vai perder 55% do valor. 

O que fazer?

Uma equação não altera o seu valor, se multiplicar e dividir pelo mesmo valor, certo?

Então eu multiplico os coeficientes A e B por 10.000 e divido a equação por 10.000 também.

 

Observo, que cada parcela da minha equação não ultrapasse o valor máximo da variável usada no programa. 

 

CAD_Result pode alcançar 1023, que multiplicado por 15471 dão 15,827... milhões, menor que um inteiro representado por 32 bits. Então "Y" terá que ter 32 bits.

 

Y = (15471 * CAD_Result - 2123445) / 10000

 

Como no meu caso, "Y" é Temperatura e sei que o valor máximo é 1370ºC, logo posso truncar "Y" de 32 bits para  "Y1" de 16 bits. Faço...

 

Y1 = Y truncado com 16bits.

 

Posso até aproximar o valor dos décimos para a unidade mais próxima. Não vou mostrar porque dá algum trabalho, mas a ideia é a seguinte...

 

Imagine que o resultado parcial da expressão Y = (15471 * CAD_Result - 2123445) daria Y = 13.703.248.

Sabemos que o valor correto é dividir por 10000, então daria 1370,3248.

Para aproximar o valor, eu somo 5.555 antes de dividir por 10.000 (caso de divisão por 10.000). O novo resultado seria ..

13.703.248 + 5.555 = 13.708.803, que dividido por 10.000 e como é uma variável inteira, dá...

1370. Caso a primeiro dígito decimal fosse 6, por exemplo, teríamos 13.711.803, que divididos por 10.000, dá 1371.

Com isso, você pode aproximar o valor inteiro.

Usei este procedimento para pedir a temperatura de um termopar do tipo K e deu certo.

Não precisei usar ponto flutuante. Ficou mais rápido e com menos memória de programa.

MOR_AL

 

  • Curtir 1
  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@MOR grato pela resposta e pela dica do CAD.

Não conheço essa biblioteca e como usá-la, nem sabia da existência. Havia pensado em sistema semelhante com o seguinte raciocínio: Os valores originais atingem um máximo de 60mil contagens = 16 bits. A soma dos últimos 16 valores ocupa 20 bits. Com um shift left de 12 posições tenho a média * 65536 = 32 bits. Aplico o fator de divisão x 65536 e me livro do float. No AVR ele dá voltas para fazer isso, a ALU é de 8 bits. Vou migrar para o ARM M0+ que além de mais barato possui ALU de 32 bits, registradores idem. No momento estou usando o Arduíno por haver mais suporte na internet. Acredite se quiser, mas ainda apanho em detalhes de sintaxe. O que me salva é que primeiro faço o algoritmo para depois realizar a programação, não vou direto.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Por algum motivo desconhecido ainda insisto em participar deste seu desafio. Vejamos

2 horas atrás, MOR disse:

multiplico os coeficientes A e B por 10.000 e divido a equação por 10.000 também

Pra vcs humanos fazer contas com multiplos de 10 é moleza: acrescenta ou tira zero. Já pro mc nem tanto. Ele gosta mesmo é de trabalhar com base 2. Assim sendo analogamente multiplicar/dividir por p.ex. 8192 ele faz simples deslocamentos de bits pra esquerda ou direita. Isso reduz a necessidade de um processador fodástico que o amigo menciona. De fato pra este projeto/desafio o de 8 bits é bem suficiente .. segundo meus insights superficiais

 

2 horas atrás, MOR disse:

a equação da reta y = Ax + B

Sobre isso. Era uma vez uma necessidade de um conversor ad pra um 8051 que não tinha ad e a ideia foi quase a mesma da do autor... 

Sabendo que a carga de um capacitor é logaritimica ia dar leitura irregular... a inserção de um circuito de carga com corrente constante torna um gerador de rampa o que por si é uma reta e já linearizava o resultado por hw

art0698_02.jpg

https://www.newtoncbraga.com.br/index.php/eletronica/52-artigos-diversos/5308-art698

Também pode ajudar no quesito imunidade a ruídos.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
20 horas atrás, Sérgio Lembo disse:

20211206_233742.png

 

Eu não consigo prontamente distinguir o que está na foto.

 

Pelo que li na postagem...

 

20 horas atrás, Sérgio Lembo disse:

A variação de leitura com 60 cm de fio torcido foi de 0,3 mm pico a pico.

 

Top!

 

Se fosse em outros tempos eu me ofereceria para lhe entregar gratuitamente um repositório com o projeto no GitHub.

 

Ótima doação para a comunidade. Valeu!

Link para o comentário
Compartilhar em outros sites

10 horas atrás, .if disse:

Pra vcs humanos fazer contas com multiplos de 10 é moleza: acrescenta ou tira zero. Já pro mc nem tanto. Ele gosta mesmo é de trabalhar com base 2. Assim sendo analogamente multiplicar/dividir por p.ex. 8192 ele faz simples deslocamentos de bits pra esquerda ou direita. Isso reduz a necessidade de um processador fodástico que o amigo menciona.

Na época que fiz o projeto, até considerei a multiplicação e a divisão por fator de 2, mas algum detalhe, que não me lembro mais, impediu este procedimento.

12 horas atrás, Sérgio Lembo disse:

Não conheço essa biblioteca e como usá-la, nem sabia da existência.

Não é uma biblioteca. É um desenvolvimento. Mas como você já resolveu de outra forma, então tudo bem.

MOR_AL

Link para o comentário
Compartilhar em outros sites

@alexandre.mbm O fio torcido não aparece nas fotos. Se refere ao par de fios que vai da sonda ao circuito. No circuito a sonda é representada como um capacitor com o nome DUT (Device Under Test). O que dá para ver no detalhe de foto que postaste são os 2 terminais da bobina saindo do parafuso encapado com veda rosca que sobem para acima da foto, são unidos por solda entre si e a um dos fios do par. O outro fio do par é o fio cinza claro que está amarrado num fio grosso de alumínio nu.

 

A variação de 0,3mm pico a pico se refere ao resultado final das medições, os 60 cm são o comprimento do cabo que liga a sonda ao circuito e a descrição de par torcido, fios soltos e cabo paralelo foram os 3 testes de configuração de cabos que utilizei para medir o efeito das interferências externas (sinais de rádio, TV, Wifi, celular, etc) no sistema. Lembre-se que todo pedaço de fio é uma antena e que quanto mais longo for mais energia capta. O par torcido é método antigo e eficaz, ainda hoje utilizado nos cabos de rede e de telefonia.

 

@.ifA ideia de fonte de corrente foi pensada e descartada pela seguinte razão: a variação térmica sobre a Vbe. É tão grande que alguns projetos escolares a usam para medição de temperatura. Circuitos prontos de referência com grande precisão e estabilidade térmica são mais caros que o processador. Resistor de precisão 1% custa 0,001USD, de 0,1% sai por 0,025USD. A diferença relativa é alta mas o valor absoluto aceitável. O uso de resistores de metal filme é muito mais estável a variação térmica. Os trimpots de 25 voltas P1 e P2 devem ser substituidos por resistores fixos de metal filme. Para produção seriada a recomendação é de 0,1%. Lembre-se que 1% representa 1cm numa sonda de 1m. Na verdade o que temos é um capacímetro e uma regra de 3 para converter em coluna d'água.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
2 horas atrás, MOR disse:

a multiplicação e a divisão por fator de 2, mas algum detalhe, que não me lembro mais, impediu este procedimento.

Foi antes da invenção do assembly? Seria porque você programava direto em hexa decimal?  😁

 

2 horas atrás, Sérgio Lembo disse:

a variação térmica sobre a Vbe.

O Vbe não entra na parada.. sabendo-se que o tr da descarga não interfere e a corrente de carga do cap é movida e controlada a ampop, mesmo com variação do vbe a I fica constante (não procurei ccto pra mostrar). Os série OPx7 até que são estáveis mas penso que até um LM324 da vida atenderia.  Não são necessários R de 1% mas sim (ou talvez) os de baixa variação em ppm/ºC.. sim p.ex. os de filme metálico. Trimpots e suas implicações .. muitíssimo menos necessários. A ideia (+uma) é rotina de ajuste com valores gravados em eeprom interna. Se necessário for, até mesmo uma saída "analógica" do mc pode ser usada.

Link para o comentário
Compartilhar em outros sites

@MOR A expressão CAD_Result me fez pensar numa biblioteca e não numa variável por ti criada. Fazer a multiplicação por base binária ou decimal dá na mesma, pensamos na mesma coisa. O performance é diferente em poucos clocks mas se a diferença de tempo for desprezível na aplicação, se tornam iguais. No desenvolvimento acho mais fácil raciocinar na quantidade de bits do que controlar numericamente um limite de 4294967296 = 32bits.

Na atual fase estou me concentrando no funcionamento da ideia. Dentro de horas chega os 100m de par trançado de telefonia para os testes de longa distância. Com os atuais 60cm de cabo a ideia não tem viabilidade prática. Estou ansioso pelos testes. Contribuições como as suas ajudam a levantar o projeto.

Forte abraço

Sérgio

42 minutos atrás, .if disse:

O Vbe não entra na parada.. sabendo-se que o tr da descarga não interfere e a corrente é movida e controlada a ampop, mesmo com variação do vbe a I fica constante (não procurei ccto pra mostrar). Os série OPx7 até que são estáveis mas penso que até um LM324 da vida atenderia.  Não são necessários R de 1% mas sim (ou talvez) os de baixa variação em ppm/ºC.. sim p.ex. os de filme metálico. Trimpots e suas implicações .. muitíssimo menos necessários. A ideia (+uma) é rotina de ajuste com valores gravados em eeprom interna. Se necessário for, até mesmo uma saída "analógica" do mc pode ser usada.

A 40 anos atrás fiz o seguinte teste térmico com o opamp OP07 da Texas. Era um circuito de medição com uma relação de 19mV/mm. Com uma gota imensa de solda no ferro esquentei a tampa do ci e não tive variação de saída. A porcaria do operacional produzido pela RCA, depois Harris, variava só de colocar o dedo na tampa por alguns segundos.

 

Sobre a precisão dos resistores: Eles atuarão no RC e na referência de tensão do comparador. Qualquer variação de valor altera o resultado e por consequência as constantes da programação. Numa produção única isso é aceitável mas numa produção seriada me forçaria a ter mais uma constante de correção a cada unidade produzida. O custo de um resistor de alta precisão é igual ao de 2 transistores baratos. Ainda assim terei a variação da construção de cada sonda, mas será um único número a ser inserido pelo usuário por teclado ou por smartphone, um ESP básico é barato e smartphone virou mato.

Link para o comentário
Compartilhar em outros sites

@.if Ainda temos mais um problema sobre a fonte de corrente constante: A precisão da fonte de alimentação. Tendo um resistor confiável e um comparador cuja referência de tensão é proporcional ao valor da fonte, o tempo de corte do comparador será sempre o mesmo para qualquer valor de tensão diferente de zero. Então a fonte de corrente sobre a sonda tem que ser proporcional ao valor da tensão ou a tensão deverá ter elevada precisão. Ter uma sonda que responda 1mm em um metro é precisão de 0,1%. No momento estou conseguindo resposta com estabilidade de 0,3mm pico a pico que equivale a +- 0,15mm. Não sei como a sua sugestão superaria esse desafio com o mesmo custo dos resistores. Referência de tensão tão precisas assim são caríssimas.

 

A ideia de ter um resultado a cada 16 leituras ao invés de acumular 16 resultados para fazer média a cada leitura está me conquistando. Ter um resultado final a cada 80ms no pior caso (sonda no limite, tempo maior) também é bom desempenho para a aplicação. Vou fazer uma segunda versão para testar a sugestão.

Link para o comentário
Compartilhar em outros sites

Se o Arduino pudesse ficar colado na ponta da sonda o que correria até o monitor seria informação e não dado... Dá para fazer uma caixinha de acrílico à prova d'água numa boa, fechada com cola para acrílico, mesmo, e usando canaletas de "garrote" de látex nas bordas para a tampa fechar hermeticamente fechada, prá poder abrir e fechar. Ou mesmo vidro, desse comum que o pessoal usa para fazer aquário, selado como silicone. Talvez com um saquinho de sílica gel dentro, como tinha nos HDs antigos...

 

Já quanto à linearidade, tirando a possibilidade de compensá-la via sw, dou um chute sem ver o gol, com os olhos vendados pela ignorância: e se você enrolasse a bobina de forma que a distância entre os fios seja maior num dos extremos da sonda?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@Sérgio Lembo infelizmente não visualizo seu projeto como você... não consigo (e nem preciso) pensar nele em termos de unidades de medida neste momento. Nem m, cm, farads, segundos e etc. O que preciso mesmo são dados brutos. Essencialmente seu sistema é um capacímetro, certo? Não é nem necessário pensar em termos de farads. Penso que bastam os dados brutos de balde cheio e balde quase vazio. O sistema só precisa dos números, no caso de uma captura 16 bits. Digamos que ele seja fique variando de 100 a 200 com balde quase vazio e 60000 60100 com cheio. Se o balde tiver 1m imagine a baita resolução que isso dá. Só isso já satisfaz o momento. Outra coisa: até pode mas nem mesmo é preciso forçar o mc a fazer as contas da conversão: os dados brutos podem ser transmitidos pra um sistema maior e com mais capacidade e este sim transforma em valores humanos.

 

A a ideia da I constante pra ficar linear:  não tenho certeza que (p.ex.) o tempo - essencialmente é o que queremos medir -  que 1uA leva pra carregar um capacitor de 1nF é o mesmo que pra 10nF. Pra isso existem os testes práticos que pra mim (mim) é ligeiramente mais fácil do que a matemática. Não me lembro direito mas acho que sugeri medir ou acompanhar a capacitância de sua sonda com capacímetro.. o 1º teste que eu (eu) faria.

 

Quanto às suas preciosas precisões eletroeletrônicas e seus custos que mencionas com vigor representam uma parcela mínima do o custo do ajuste mecânico.físico da sua sonda .. este sim tende a ser caro e complexo deixar com valores próximos e repetitivos.  O custo humano tende a ser elevado.. a não ser que desenvolvas uma sonda produzível por máquinas.

 

+Dica: não leve apenas um par de fios da sonda até o sistema. A distância e alta impedância se torna antena como já mencionaste. Leve 3: vcc, dado, gnd. Trate o sinal bem perto da sonda e apenas envie dados - pode ser analógico mesmo - com baixa impedância.

 

Se um dia ganhar muito ou um pouco de dinheiro com isso não te esqueças dos pobres ... amigos ou não. 😁

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Substitui o cabo torcido de 60cm por aproximadamente 15m de par de telefonia. A indicação aumentou 4cm acima do real. Isso foi verificado com 23cm de coluna d'água e com 2 cm. Tirei a sonda e coloquei os 85m de cabo remanescente como sonda. A capacitância do cabo com 85m acusou 6nF pelo meu multímetro DT9205A, marca genérica. Isso me impõe que o cabo deve ser parte da equação e integrante da sonda. Outro efeito foi o aumento da variação máxima de medidas que passou de 0,3mm para quase 6mm mesmo tendo aumentado a média para 64 valores. Ainda assim continua sendo interessante para o fim ao qual se destina.

 

@.ifSobre a sugestão de 2 mc com alimentação + 1 ou 2 de dados no cabo, qual protocolo sugere para aguentar essa distância?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

A 85m da sonda ao sistema infelizmente não tenho competência pra te orientar nisso ok? Mas permita-me de novo ativar o modo minimalista de uma visão do seu sistema. Ele precisa de apenas 2 dados: um de ida outro de vinda: um pulso que descarrega o cap e espera a chegada de 1 bit. Só isso. Assim sendo bastam 2 acopladores óticos um tx e outro rx. Como o dado é digital e frequencia zero, penso que se a linha for de baixa impedância não deve sofrer influência considerável mesmo se a longa distância, capiste? Filtros simples RC podem complementar a proteção. O tempo de reposta dos optos deve ser levado em conta com relação ao do seu sistema, claro.

Então o resumo: 1 fio vai, 1 volta e 1 gnd. 1 pouco de criatividade e imaginação eletro & técnica pode-se considerar transmitir e receber o sinal num fio só. Lembrando/repetindo que na sonda vai haver uma fonte pra alimentar o sistema com ampop e apenas 1 dado 0 e 1 trafegaria nos 85m com baixa impedância nos extremos.

 

Mas caso insistas mesmo em usar algo + sofisticado, que tal algo wireless como um bluetooth ou wifi? Talvez até mesmo este módulo 433Mhz. A distância pode te atender. Mas já que é pra sonhar... que tal se matasse mais passarinho com o mesmo canhão? PH, turbidez, temperatura e etc além do nivel poderia ser transmitido com o sistema inteligente de multiplos sensores. A um custo relativamente pequeno. Já pensou que legal monitorar tudo isso no conforto do seu celu lar?😁... já to querendo encomendar um pra mim😜

 

Enfim... é isso aí .. 🙃

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@rmlazzari58 O circuito que captura a capacitância está na foto na primeira postagem. P1 e P2 foram usados para teste, o correto é ter resistor fixo ali. Teremos então um operacional + 1 transistor + 3 resistores e 4 fios para interligação com a fonte 12V + arduino e 2 para a sonda. O circuito cabe em meia caixa de fósforo.

Sobre a disposição dos fios: Sabemos que o capacitor são placas paralelas, valor proporcional a área e inversamente proporcional ao quadrado da distância, ar como dielétrico = 1. Nessa sonda a água é a segunda placa e o esmalte do fio a distância e dielétrico. O valor desse dielétrico costuma estar entre 3 e 6. Consegue-se entre 50 e 80pF por cm de fio dependendo da bitola e do esmalte empregado. Com 10 voltas tenho 20 fios, isto é, entre 1nF e 1,6nF por cm. Os resistores devem ser de metal filme por possuir baixa variação térmica. Fazendo-se 2 medições, a primeira com 2cm de imersão e a segunda próxima ao topo se tem uma equação de reta que transforma direto os valores capturados pelo timer em cm de coluna d'água.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O par de telefonia que apliquei apresentou graves problemas quando a sonda passou do balde para uma caixa real. Passeio de 15 m. Variações malucas que eram atenuadas pela média. Algumas delas davam overflow no timer sem que houvesse disparo de captura. Atribuo a causa ao fato do fio de telefonia não ser soldável e as emendas feitas entre o cabo e a sonda terem apresentado mau contato. Comprei um cabo CAT de 2 pares, fio soldável. Testarei primeiro na versão original, 1 par para a sonda. Se ainda assim continuar apresentando graves variações usarei os 2 pares e transfiro o circuito que contém o operacional + transistor de descarga para a sonda. Terei então 2 fios para os 12V, adiciono um capacitor nessa plaquinha externa para a fonte. Os outros 2 serão usados para o acionamento do transistor e a saída do comparador. Como os 12V são referenciados ao GND pela diferença fixa de tensão então os pares serão formados por 1 sinal + 1 alimentação. A corrente de pico durante a leitura é 20uA e o consumo constante do comparador 1mA. Tal pico não provocará ruídos e a impedância do cabo associada ao capacitor na entrada da fonte distribuirá essa energia no tempo. Mas esse é o plano B, continuarei tentando ter a eletrônica num ponto único.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
1 hora atrás, Sérgio Lembo disse:

transfiro o circuito que contém o operacional + transistor de descarga para a sonda.

É disso que tava falando. Achei que já era.

 

Permita-me acrescentar (ou subtrair) algo... Sua teoria é que a água é uma das placas do capacitor, correto? Mas sabemos que a água não tem resistência zero portanto seu sistema deve considerar como um resistor em série. Me lembro de ter medido certa feita e deu algo como 100K/cm. Um agravante é que este valor deve variar de acordo com a química na água e tal. Assim sendo, considero que o circuito de I constante não deve ser totalmente ignorado. Também acrescento que uma maior tensão de carga 24...48v pode ser considerada pra otimização do sistema.

 

1 hora atrás, Sérgio Lembo disse:

um cabo CAT de 2 pares

Permita-me + uma vez viajar em um par só. Ele levaria a alimentação bem como o sinal de disparo e a recepção do retorno. Um método minimalista e simples com comparadores e filtros me parece promissor. Algo como:

-gnd comum na malha de um fio blindado

-12V...um diodo..um resistor na pci principal leva a alimentação pro circuito sensor

-ainda na pci principal um pulso de 15V é aplicado ao catodo do diodo

-o mc zera, dispara um contador e fica esperando o sinal da linha

-o receptor detecta que passou de 12 e dispara a descarga da sonda

-ao atingir o máximo, coloca uma carga resistiva no vcc fazendo-o cair um pouco ... lembra do resistor em série lá na principal?

-esta queda vai ser monitorada pelo mc a qual lhe informa que tem que parar de contar e pegar o dado

O desafio seria incorporar a isolação ótica neste sistema doidão... caso necessária.

Lembrando que o circuito-sensor conceitual acima não tem nada de inteligente. Tem apenas ampop ou comparador.

 

De fato apliquei o conceito minimalista acima num sistema com vários sensores de presença e um par de fios a alimentar todos em paralelo. Cada 1 ao ser acionado faz cair a alimentação em valores diferentes. Assim consigo saber qual deles foi acionado com 1 entrada apenas

🤪

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!