Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal, procurei em vários lugares na internet mas sem sucesso uma solução para meu problema.

 

Projeto: medir temperatura de diferentes pontos da sala, utilizando sensores MAX6675, e ler tais temperaturas com um Arduino ESP8266 (devido sua conexão WiFi), o objetivo é usar um multiplexer HEF4067BP para aumentar o número possível de sensores MAX6675. 

 

TL;DR: Qual linha de comando coloco no código para que o Arduino leia diferentes sensores de temperatura (em ºC) através do multiplexer? 

 

Não está dos melhores, mas na figura 1 eu tentei fazer uma representação física do circuito que acabei criando. Como não tinha o meu multiplexer nem o sensor, acabei substituindo por uma porta lógica e botões respectivamente por pura representação.

 

A ideia básica desse sensor é que, fora a alimentação (não representada mas +V dele no +5V do arduino e o GND todos conectados), temos 3 principais sinais:

i) signal output (SO)

ii) clock (CLK)

iii) CS (que eu não sei o significado mas entendo que é o sinal de saída do sensor, ou seja, o que informa a temperatura - é um sinal digital - )

 

Os sinais SO e CLK de todos os MAX6675 podem ser ligados no mesmo pino do arduino, pelo menos é o que entendi de todos os tutoriais que vi até agora pela internet, onde somente o CS deve ser ligado separadamente para leitura da temperatura. Se utilizasse somente o Arduino, teria possibilidade para 10 sensores, porém com o multiplexer posso aumentar esse número para 16 (no projeto, quanto mais sensores, melhor). 

 

Já no multiplexer, entendo que temos 4 tipos de pinos importantes:

i) sinal de micro-controlador: Z

ii) sinais de saída: A0, A1, A2 e A3

iii) pino enable

iv) sinais de entrada

 

O pino tipo iii) garante que o sistema esteja disponível para uso, onde para que isso aconteça ele deve receber um sinal LOW, por isso, ligo ele ao GND do circuito. 

Já os pinos do tipo  i) e ii) funcionam em conjunto. Enquanto o Arduino envia para o multiplexer qual porta lógica ele quer ler através do pino Z, o multiplexer responde através dos pinos A0, A1, A2 e A3 (ele utiliza linguagem binária para selecionar quais portas irá acessar: 0000 = porta 1, 0001 = porta 2... etc até porta 16). Por fim, o pino tipo iv) são justamente estas portas lógicas, onde em cada uma teremos a resposta de um sensor MAX diferente. 

 

Pois bem, nos testes, consigo conectar os sensores ao Arduino, e também consigo fazer essa conexão via WiFi para nosso canal no thingspeak. Porém, quando tentei adicionar o multiplexer, não encontro uma solução para conseguir ler isso. O código que possuo e que funciona sem o multiplexer é o seguinte:

 


/*Inclui as bibliotecas necessárias para os componentes que uso*/
#include <max6675.h>
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
  
/*Definições: GPIOs do Arduino utilizado na comunicação com o MAX6675, não seguem o exemplo da figura 1 pois é um sistema mais simples (sem o multiplexer)*/
#define GPIO_SO       5 //D1; 
#define GPIO_CS       4 //D2; 
#define GPIO_CLK      0 //D3;

/*Comunicação WiFi e ThingSpeak (somente login e passwords para WiFi e ThingSpeak)*/

char ssid[] = "*******";
char pass[] = "*******";

WiFiClient client;

unsigned long myChannelNumber = *******;
const char *myWriteAPIKey = "********";
 
/*Definição: baudrate da comunicação com Serial Monitor*/
#define BAUDRATE_SERIAL_MONITOR    115200
 
/*Definição: tempo entre leituras do MAX6675*/
#define TEMPO_ENTRE_LEITURAS             40000 //ms
 
/*Criação de objeto para comunicação com termopar*/
MAX6675 termopar(GPIO_CLK, GPIO_CS, GPIO_SO);
  
void setup()
{
    Serial.begin(BAUDRATE_SERIAL_MONITOR);
    WiFi.mode(WIFI_STA);
    ThingSpeak.begin(client);
}
 
/*Programa principal*/
void loop() 
{  

   
  if(WiFi.status() != WL_CONNECTED){
    while(WiFi.status() != WL_CONNECTED){
      WiFi.begin(ssid, pass);  // Connect to WPA/WPA2 network. Change this line if using open or WEP network
      //Serial.print(".");
      delay(5000);     
    } 
    //Serial.println("\nConnected.");
  }

  
    Serial.print("Temperatura: "); 
    Serial.print(termopar.readCelsius());
    Serial.println("C");
    
    ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
    ThingSpeak.setField(5,termopar.readCelsius());
    
    delay(TEMPO_ENTRE_LEITURAS);

    
}

 

Mas, quando tento adicionar o multiplexer, a leitura simplesmente não acontece.  Tentei seguir esse tutorial: 

 

 

mas sem muito sucesso pois ele realmente usa botões, e não sensores de temperatura, o que apesar de também serem sinais digitais não consigo fazer o .readCelsius necessário, por ex. 

Alguém tem ideia sobre como proceder? Qual linha de código eu devo usar para conseguir fazer essa comunicação? Se é que ela é possível, digo, pois imagino que talvez meu erro esteja na compreensão do multiplexer. De qualquer forma, tomara que tenha conseguido explicar bem o meu problema. Se estiver postando isso na área errada, por favor algum ADM mova para área certa (primeiro post no fórum, pra mim parecia o mais intuitivo postar aqui).

 

Valeu a ajuda desde já! 

 

figura 1.png

  • Membro VIP
Postado

O que tem a ver o 4017?

Foquei só na multiplicidade de sensores. Vá por partes. 1º entenda como ler a temperatura...

ther1.gif

https://www.bristolwatch.com/ele2/therc.htm

 

Depois...

Um multiplexador analógico é uma simples chave rotativa digital

  ac82fae2bc52471d969978821cb73885.png =images?q=tbn:ANd9GcTCwCipiC9fjgVV_KGkhdJ

Coloque todos os [-] dos termopares em comum e bem perto da entrada T- e cada T+ na entrada Y0 a Y15. A saída E vai pra entrada analógica do arduino. 'Rode a chave' das entrada A3...A0 para selecionar o termopar, faça a leitura respeitando a temporização da interface, guarde em variáveis e faça bom uso.

 

3 horas atrás, wixxos disse:

iii) CS (que eu não sei o significado mas entendo que é o sinal de saída do sensor, ou seja, o que informa a temperatura - é um sinal digital - )

Errou. CS é chip select: entrada do ci. É pra quando vai colocar vários sensores em paralelo... não ś seu caso.

  • Membro VIP
Postado

Ahhh. Achei que o 4067 era multiplexador analógico. ... mas peraí...

61E7e3wKmnL._AC_SX679_.jpg

...é sim! Neste caso mantenho o que disse. E caso use o gnd comum como lhe disse, só precisa de 1.

2 horas atrás, aphawk disse:

usar dois desses 4067 ....

🤔

Pra fazer como disse Paulão, penso que ele supõe que vais usar 16 max6675 que custa uma minifortuna ..U$16,00!  (clique). .. humilha eu mesmo... Se dinheiro não lhe for problema, vá enfrente garotão! Detalhe é que o multiplex não precisa ser analógico e a princípio pode sim manter o SO e CLK em comum e chavear apenas o CS... quando este em 1 é como se o ci levantasse as pernas do circuito.

Postado

@.if ,

 

Estás a pensar que a saída SO é tri-state ? Não diz nada disso no datasheet ..... só que ela consegue suprir 50 mA !

Tem certeza que quer ligar elas juntas, de cada módulo ?

 

Paulo

  • Membro VIP
Postado
1 hora atrás, aphawk disse:

a pensar que a saída SO é tri-state

Ok querido amigo.. vejamos. Existe sim a menção do tristate. Mas no caso 1ªmente mencionei foi pura intuição devido à natureza termo CS Chip Select pra outros ci's. Tu de lembra quando ROM e RAM compartilhavam o mesmo barramento de dados e tal? Era graças ao CS não simultâneo de cada. Dando uma olhadela no d.s. segundo sua orientação, 2ªmente percebi apenas a forma da onda quando CS=1. Perceba ele indeciso entre 0 e 1 o que nos leva a pensar intuitivamente num tristate. 3ª mente vi literalmente o termo tristate... ops... Three-state .. ah.. tá explicado 😁

59391027_Capturadetelade2022-02-0115-53-48.png.06ea1da0eb9cdfe49081b162bea8dc5d.png

ok aquilo é apenas o estado do bit0 mas perceba sua amplitude na forma de onda... não é a mesma de quando CS=1?

Baita literal escovação de bits hein...?😜

Postado

@.if ,

 

Pois é, quando eu lí que o tri-state se refere ao BIT D0 eu achei bem estranho .... ainda mais ter um ID no bit D1 .... só faria sentido se realmente pudesse colocar dois desses CI´s juntos ....

RepareI que quando CS=1 o nível de SO fica num meio termo entre 1 e 0 ..... mas custava deixarem claro que nesse caso a saída SO fica em tri-state ?

 

Paulo

 

 

  • Haha 1
  • Membro VIP
Postado

Permita-me de novo opinar que o garoto deve preferir multiplexar os sinais analógicos o que torna o sistema mais eficiente.

Ah sim.. o ID em 0 no bit1 penso ser algo como um sinal ACK (reconhecimento) pra dizer que tem boi na linha. Algo como acontece com o protocolo I2C . Já o bit0 em tristate minha intuição diz que é pra ver se o resistor de pullup está presente... nem sei pra quê ... seria algo como bi1=0, bit0=1.. então varreu corretamente ... chute kk

Postado

Talvez eu tenha complicado as coisas ao tentar explicar o projeto por completo. 

 

Hoje fiz novos testes, e enviando somente um sinal analógico (1V fornecido por uma fonte que temos no lab), consegui ler esse 1V através do multiplexer em todos os pinos que queria. Para isso, usei esse código: 

/*Teste para tentar ler 1V de sinal no Arduino através do Multiplexer*/

/*Bibliotecas*/

#include <ESP8266WiFi.h>
/*existe biblioteca para multiplexer?*/

#define TEMPO_ENTRE_LEITURAS    1000 //ms

float pVoltage[3];

void setup() {
  // put your setup code here, to run once:

  Serial.begin(115200);

  pinMode(12, OUTPUT); //D6
  pinMode(14, OUTPUT); //D5
  pinMode(0, OUTPUT); //D3
  pinMode(2, OUTPUT); //D4

}

void loop() {
  // put your main code here, to run repeatedly:


   mux (0,1,1,1);  //(0,0,0,0) Set the multiplexer to door 0
   delay(2000);
   pVoltage[0] = analogRead(A0)*5.0/1024.0; // analog sensor is 5v-0v
   Serial.print("Sinal 1: "); 
   Serial.print(pVoltage[0]);
   Serial.println("V");

   mux (0,1,1,0);
   delay(2000);
   pVoltage[1] = analogRead(A0)*5.0/1024.0; // analog sensor is 5v-0v
   Serial.print("Sinal 2: "); 
   Serial.print(pVoltage[1]);
   Serial.println("V");
   
   mux (0,1,0,1);
   delay(2000);
   pVoltage[2] = analogRead(A0)*5.0/1024.0; // analog sensor is 5v-0v
   Serial.print("Sinal 3: "); 
   Serial.print(pVoltage[2]);
   Serial.println("V");


   delay(TEMPO_ENTRE_LEITURAS);


}


void mux (int state1,int state2,int state3,int state4){

digitalWrite(12, state1); //D6
digitalWrite(14, state2); //D5
digitalWrite(2, state3); //D4
digitalWrite(0, state4); //D3

}

 

 

Após conseguir isso, o que tentei foi passar para o próximo nível: ler a temperatura pelo sensor MAX6675. Tentei utilizar esse código:

 

/*Teste para tentar ler temperatura no Arduino através do Multiplexer*/

/*Bibliotecas*/

#include <ESP8266WiFi.h>
#include <max6675.h>


/*existe biblioteca para multiplexer?*/

#define TEMPO_ENTRE_LEITURAS    1000 //ms

#define pin_SO  5 //D1
#define pin_CLK 4 //D2

float pin_Temp[3];

MAX6675 termopar(pin_CLK, pin_Temp[3], pin_SO);


void setup() {
  // put your setup code here, to run once:

  Serial.begin(115200);

  pinMode(12, OUTPUT); //D6
  pinMode(14, OUTPUT); //D5
  pinMode(0, OUTPUT); //D3
  pinMode(2, OUTPUT); //D4

  pinMode(13, INPUT); //D7

}

void loop() {
  // put your main code here, to run repeatedly:


   mux (0,1,1,1);  //(0,0,0,0) Set the multiplexer to door 0
   delay(2000);
   //pin_Temp[0] = termopar.readCelsius(); 
   Serial.print("Temperatura 1: "); 
   Serial.print(termopar.readCelsius());
   Serial.println("C");

   mux (0,1,1,0);  //(0,0,0,0) Set the multiplexer to door 0
   delay(2000);
   pin_Temp[1] = termopar.readCelsius(); 
   Serial.print("Temperatura 2: "); 
   Serial.print(pin_Temp[1]);
   Serial.println("C");

   mux (0,1,0,1);  //(0,0,0,0) Set the multiplexer to door 0
   delay(2000);
   //pin_Temp[2] = termopar.readCelsius(); 
   Serial.print("Temperatura 3: "); 
   Serial.print(termopar.readCelsius());
   Serial.println("C");


   delay(TEMPO_ENTRE_LEITURAS);


}


void mux (int state1,int state2,int state3,int state4){

digitalWrite(12, state1); //D6
digitalWrite(14, state2); //D5
digitalWrite(2, state3); //D4
digitalWrite(0, state4); //D3

digitalRead(13);

}

 

Mas tudo que consigo no Serial Monitor do Arduino são leituras de Temperatura 1 = Temperatura 2 = Temperatura 3 = 0.00 ºC. Como se não houvesse qualquer tipo de leitura.

Não consigo descobrir onde está o erro. As conexões foram feitas igual está representado no desenho que fiz no paint (existem resistores 10k no caminho do fio amarelo que esqueci de representar). 

figura2.png

Postado

@wixxos ,

 

Sugiro alimentar esse módulo com +5V se possível.

 

O multiplexer deve apenas levar o nível 0 ao pino CS do MAX6675 escolhido. Mas para isso sugiro você colocar um resistor de 4k7 entre esse pino CS e o + 5V, para que todos os outros estejam mesmo em tri-state ( se é que esse CI funciona como pensamos porque o datasheet tá uma b..... kkkk) .

 

Para tirar essa duvida, tente primeiro "conversar" com apenas um desses MAX6675, veja se consegue iniciar a conversão e receber ela pela serial. Lembro que o formato dos dados recebidos é meio estranho, tem de dar uma tratada nos bytes para que eles sejam corretos.

 

Paulo

 

  • Membro VIP
Postado

... e num é que o riquinho vai usar vários max mesmo? 😲 Neste caso o mux analógico está subutilizado e lembrando que o sinal CS é o que vai ser chaveado portanto ele deve ter nível 0 coerente com seu momento e posição. Percebo também que estás a usar rotinas mastigadas... nada contra mas isso meio que coloca um véu entre você e o sistema. . além de te dar uma engessadinha mental básica 😜

Vá de...

1 hora atrás, aphawk disse:

tente primeiro "conversar" com apenas um desses MAX6675

 

Pra finalizar...

Usar vários ci's destes é só pra elite sendo totalmente fora de minha realidade daqui de fora, ok? Portanto não me sinto muito a vontade em participar deste projeto faraônico.. meio que me dá um nó no cérebro (como se eu tivesse)  😁.. algo como: mesmo não sendo você que deixou a torneira aberta e nem você que paga a conta de água, duvido que você não se sente tentado a fechar...🤪

  • Haha 1
Postado

@aphawk

Eu já havia conseguido conversar com o MAX6675 e ler as temperaturas de maneira eficiente, porém sem a utilização do Mux. O meu maior problema é quando vou inserir o mux nessa equação, não consigo fazer as duas coisas (sensor MAX e multiplexer) funcionarem ao mesmo tempo com o Arduino, e não sei se isso é questão de código ou de conexão. 

 

@.if Entendo que se usasse o Mux com sinais analógicos diretamente do termopar isso seria mais eficiente para o Mux, porém, eu ainda precisaria fazer a conversão de cada tensão oferecida por cada termopar no meu projeto para temperatura, ainda consertando o que cada termopar deveria ler como 0V. Para pular essa parte do trabalho, usar 1 sensor MAX6675 completo (que na compra já vem termopar + chip) facilita isso tudo, pois o chip incluído já faz essa conversão e já corrige o 0V. 🙂 Sei que não é um sensor tão barato, mas a ideia era implementar um mesmo circuito e projeto já existentes num laboratório parceiro do nosso, porém a pessoa que fez esse projeto nesse outro lab não organizou absolutamente nada e ainda fez uma placa de circuito que queimou um dos sensores. Agora estou eu corrigindo estes problemas e tentando debugar o código para entender tudo que está acontecendo. Sou leigo nessas coisas, é o meu segundo projeto com arduino (o primeiro foi usar servo-motores para mover espelhos no nosso experimento), então ainda tem muita coisa que não entendo 😅

 

Em tempo, fiz a compra destes sensores neste site: https://www.curtocircuito.com.br/sensor-de-temperatura-termopar-tipo-k.html, o preço total está 9 dólares, com a promoção sai por 7.42$, o que ajuda no fator custo hahahah. 

 

ps: o código que consigo fazer a leitura de temperatura é esse, caso ajude em algo:

 

#include <max6675.h>
#include <ESP8266WiFi.h>
  
/* Definições: GPIOs do Arduino utilizado na comunicação com o 
   MAX6675 */
#define GPIO_SO       5  //D1; 
#define GPIO_CS       4  //D2; 
#define GPIO_CLK      13 //D7;       
 
/* Definição: baudrate da comunicação com Serial Monitor */
#define BAUDRATE_SERIAL_MONITOR    115200
 
/* Definição: tempo entre leituras do MAX6675 */
#define TEMPO_ENTRE_LEITURAS             1000 //ms
 
/* Criação de objeto para comunicação com termopar */
MAX6675 termopar(GPIO_CLK, GPIO_CS, GPIO_SO);
  
void setup()
{
    Serial.begin(BAUDRATE_SERIAL_MONITOR);
}
 
/* Programa principal */
void loop() 
{  
    Serial.print("Temperatura: "); 
    Serial.print(termopar.readCelsius());
    Serial.println("C"); 
    delay(TEMPO_ENTRE_LEITURAS);
}

 

  • Membro VIP
Postado

Legal amigo. Eu tenho réplicas a fazer com relação aos seus argumentos mas acho que nem vale a pena pra proposta do tópico, ok?

 

Agora tente acionar um led .. um não, três ou+... usando seu multiplex. Dica: coloque anodo no +5 e catodo [com resistor claro] na saída do seu multiplex: ele vai ser acionado com 0: o nível que você precisa pro seu CS. Entenda e domine o acendimento individual. Olha uma maneira mais eficiente:

void mux (char canal){

digitalWrite(12,(canal>>0)&1); //D6 
digitalWrite(14,(canal>>1)&1); //D5
digitalWrite(2, (canal>>2)&1); //D4
digitalWrite(0, (canal>>3)&1); //D3
}
                   saída mux
5V--+--[1k]--->|---[pino 18]
    |--[1k]--->|---[pino 16]
    |--[1k]--->|---[pino 14]
    +--[1k]--->|---[pino 12]

Pra ver piscar ou varrer

for (i=0,i<16,i++) {mux(i);delay(1000);}

Mas antes coloque o pino E do mux no 0V

Postado
1 hora atrás, wixxos disse:

Eu já havia conseguido conversar com o MAX6675 e ler as temperaturas de maneira eficiente, porém sem a utilização do Mux. O meu maior problema é quando vou inserir o mux nessa equação, não consigo fazer as duas coisas (sensor MAX e multiplexer) funcionarem ao mesmo tempo com o Arduino, e não sei se isso é questão de código ou de conexão. 

 

Não tem nenhum segredo : use o Mux para jogar nível 0 no lugar desejado, espere virem os dados seriais , e após jogue o Mux para um endereço que não existe sensor ( para que todos os  CS dos sensores fiquem em nível 1 ), e aguarde o novo endereço de mux.

 

Lembre-se de que é muito importante colocar o resistor de 4k7 levando para o +5V cada uma das entradas CS dos sensores. Sem isso não vai mesmo funcionar .....

 

Paulo

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!