collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Rede de sensores DS18S20  (Lida 5480 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline poliveira1978

  • Mini Robot
  • *
  • Mensagens: 335
Rede de sensores DS18S20
« em: 31 de Agosto de 2011, 00:31 »
Estou a montar uma rede de sensores de temperatura com a possibilidade de ver os dados através da web (com uma shield enc28j60).
Instalei a lib ETHER_28J60 da página http://srmonk.blogspot.com/2010/03/simplified-ethernet-library-for-28j60.html.
Já consigo ver todos os sensores e respectivas temperaturas, mas no que diz respeito aos endereços (uma espécie de MAC dos sensores ONEWIRE) só consigo ver o valor em decimal.
Na biblioteca ETHER_28J60 o método ethernet.print só trabalha com inteiros ou char e o campo endereço é de tipo Byte. se fizer cast da variável, só consigo ver o valor decimal, algo do género:
ethernet.print(int(endereco));

o código completo é:

Código: [Seleccione]
#include "etherShield.h"
  #include "ETHER_28J60.h"
  #include <OneWire.h>
  #include <DallasTemperature.h>
  #define ONE_WIRE_BUS 3
  #define TEMPERATURE_PRECISION 9
  static uint8_t mac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
  static uint8_t ip[4] = {192,168,10,159};
  static uint16_t port = 80;
  ETHER_28J60 ethernet;
  int counter;
  #define ONE_WIRE_BUS 3
  #define TEMPERATURE_PRECISION 9
  OneWire oneWire(ONE_WIRE_BUS);
  DallasTemperature sensors(&oneWire);
  int numberOfDevices;
  DeviceAddress tempDeviceAddress;
 
  void setup()
  {
    Serial.begin(9600);
    digitalWrite(6,LOW);
    for (counter=0;counter<=10;counter++)
    {
      digitalWrite(ledPin,HIGH);
      delay(1000);
      digitalWrite(ledPin,LOW);
    }
    ethernet.setup(mac, ip, port);
    sensors.begin();
  }
 
  void loop()
  {
    numberOfDevices = sensors.getDeviceCount();
    char* param;
    char endereco[8];
    if (param = ethernet.serviceRequest())
    {
      ethernet.print("<html><head><title>Temperatura Actual</title></head><body>");
      ethernet.print("<table border=\"1\" bordercolor=\"#CC66FF\"   style=\"background-color:#00FFFF\" width=\"100%\" cellpadding=\"0\"   cellspacing=\"0\">");
      ethernet.print("<tr><td>ID</td><td>Endere&ccedil;o</td><td>Temperatura</td>");
      for (int(i)=0;i<numberOfDevices;i++)
      {
        sensors.getAddress(tempDeviceAddress,i);
        ethernet.print("</tr><tr><td>");
        ethernet.print(i);
        ethernet.print("</td><td>");
        ethernet.print(int(tempDeviceAddress));
        ethernet.print("</td><td>");
        ethernet.print(sensors.getTempC(tempDeviceAddress));
        ethernet.print("&ordm; C</td></tr>");
      }
      ethernet.print("</table></body></html>");
      ethernet.respond();
    }
  }
 
 

Se alguém me puder dar uma ajuda agradeço muito.

Cumprimentos,

Pedro

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Rede de sensores DS18S20
« Responder #1 em: 31 de Agosto de 2011, 00:34 »
Se podes meter strings de texto usas a função itoa e convertes o valor do MAC dos sensores para uma string de numeros e usas essa mesma string para fazer o ethernet.print.
Avr fanboy

Offline poliveira1978

  • Mini Robot
  • *
  • Mensagens: 335
Re: Rede de sensores DS18S20
« Responder #2 em: 31 de Agosto de 2011, 08:50 »
Com itoa não funciona... "Invalid conversion from uint8_t to int"...

Vou ver se consigo fazer de outra maneira.

Offline vdr

  • Mini Robot
  • *
  • Mensagens: 78
Re: Rede de sensores DS18S20
« Responder #3 em: 31 de Agosto de 2011, 10:41 »
Podias tentar fazer uma função que te separava a parte inteira e decimal para duas variáveis e depois era só fazer o print com um ponto ou virgula.

Offline poliveira1978

  • Mini Robot
  • *
  • Mensagens: 335
Re: Rede de sensores DS18S20
« Responder #4 em: 31 de Agosto de 2011, 11:44 »
Não há nenhuma parte decimal... Vou tentar clarificar melhor o problema:

O "MAC" é um valor na forma 0010C0A0. Como a função ethernet.print só aceita como parametros uma string ou um inteiro, se eu tentar fazer ethernet.print(int(0010c0a0)) vou obter 1097888, que é a conversão para base 10 do valor 0010C0A0 em hexa.

Vou tentar fazer uma função que decomponha o valor em hexa e construa uma string.

Depois posto novidades.

Offline vdr

  • Mini Robot
  • *
  • Mensagens: 78
Re: Rede de sensores DS18S20
« Responder #5 em: 31 de Agosto de 2011, 12:20 »
parvoice minha, li na diagonal, e pensei que não desse para fazer print de floats que seriam os valores das leituras do sensor.  :-[

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Rede de sensores DS18S20
« Responder #6 em: 31 de Agosto de 2011, 14:34 »
Como isso é um long usa a função ltoa e usa antes este site como referência, pois são estas as funções que o avr-gcc usa e que podem ter diferenças quanto ás std do C.
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga4f6b3dd51c1f8519d5b8fce1dbf7a665
Avr fanboy

Offline poliveira1978

  • Mini Robot
  • *
  • Mensagens: 335
Re: Rede de sensores DS18S20
« Responder #7 em: 31 de Agosto de 2011, 21:05 »
Ainda assim não funciona, continua a dar o mesmo erro, invalid convertion from uint8_t to long int.

Obrigado na mesma pelo link.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Rede de sensores DS18S20
« Responder #8 em: 31 de Agosto de 2011, 21:16 »
Mostra o código então, é que sem código ninguem adivinha qual é o problema.
Avr fanboy

Offline poliveira1978

  • Mini Robot
  • *
  • Mensagens: 335
Re: Rede de sensores DS18S20
« Responder #9 em: 31 de Agosto de 2011, 21:22 »
o código está logo no post de abertura deste tópico. ;-)

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Rede de sensores DS18S20
« Responder #10 em: 31 de Agosto de 2011, 21:43 »
O código em que usas a função ltoa ou itoa?
Avr fanboy

Offline poliveira1978

  • Mini Robot
  • *
  • Mensagens: 335
Re: Rede de sensores DS18S20
« Responder #11 em: 31 de Agosto de 2011, 22:07 »
ok, sorry....

Código: [Seleccione]
ethernet.print("</td><td>");
ethernet.print(ltoa(tempDeviceAddress));
ethernet.print("</td><td>");

O problema é que não é possivel fazer ethernet.print(variavel ,HEX);

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Rede de sensores DS18S20
« Responder #12 em: 31 de Agosto de 2011, 22:10 »
Por esse exemplo é perfeitamente visivel que leste sobre como usar essa função não foi?

Código: [Seleccione]
  #include "etherShield.h"
  #include "ETHER_28J60.h"
  #include <OneWire.h>
  #include <DallasTemperature.h>
  #define ONE_WIRE_BUS 3
  #define TEMPERATURE_PRECISION 9
  static uint8_t mac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
  static uint8_t ip[4] = {192,168,10,159};
  static uint16_t port = 80;
  ETHER_28J60 ethernet;
  int counter;
  #define ONE_WIRE_BUS 3
  #define TEMPERATURE_PRECISION 9
  OneWire oneWire(ONE_WIRE_BUS);
  DallasTemperature sensors(&oneWire);
  int numberOfDevices;
  DeviceAddress tempDeviceAddress;
 
  char buffer[10]; //BUffer usado para a função ltoa

  void setup()
  {
    Serial.begin(9600);
    digitalWrite(6,LOW);
    for (counter=0;counter<=10;counter++)
    {
      digitalWrite(ledPin,HIGH);
      delay(1000);
      digitalWrite(ledPin,LOW);
    }
    ethernet.setup(mac, ip, port);
    sensors.begin();
  }
 
  void loop()
  {
    numberOfDevices = sensors.getDeviceCount();
    char* param;
    char endereco[8];
    if (param = ethernet.serviceRequest())
    {
      ethernet.print("<html><head><title>Temperatura Actual</title></head><body>");
      ethernet.print("<table border=\"1\" bordercolor=\"#CC66FF\"   style=\"background-color:#00FFFF\" width=\"100%\" cellpadding=\"0\"   cellspacing=\"0\">");
      ethernet.print("<tr><td>ID</td><td>Endere&ccedil;o</td><td>Temperatura</td>");
      for (int(i)=0;i<numberOfDevices;i++)
      {
        sensors.getAddress(tempDeviceAddress,i);
        ethernet.print("</tr><tr><td>");
        ethernet.print(i);
        ethernet.print("</td><td>");
        ltoa(tempDeviceAddress, buffer, 16); //Converter a variavel temp... para uma string, com representação em hexa
        ethernet.print(buffer); //Imprime a variavel convertida para uma string na linha acima
        ethernet.print("</td><td>");
        ethernet.print(sensors.getTempC(tempDeviceAddress));
        ethernet.print("&ordm; C</td></tr>");
      }
      ethernet.print("</table></body></html>");
      ethernet.respond();
    }
  }
« Última modificação: 31 de Agosto de 2011, 22:15 por senso »
Avr fanboy

Offline poliveira1978

  • Mini Robot
  • *
  • Mensagens: 335
Re: Rede de sensores DS18S20
« Responder #13 em: 31 de Agosto de 2011, 22:26 »
O C não é o meu forte... estava a pensar em atoi

o código deve ser algo deste género:

char buffer [sizeof(long)*8+1];
...
      ltoa (deviceAddress,buffer,16);
      ethernet.print(buffer);
..

Mas agora dá erro no ltoa

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Rede de sensores DS18S20
« Responder #14 em: 31 de Agosto de 2011, 22:29 »
Que tipo de erros?
Faz include da stdlib.h

Ao fazeres esse buffer assim vais guardar espaço para 8 longs nesse buffer, mais um byte, só precisas de um caracter por cada digito que o teu endereço MAC tem, mais um caracter para o \0
Avr fanboy