terça-feira, 16 de abril de 2013

Atraso do Curso Arduino Automation - Dilema do ENC28J60

Pessoal,

Estou aqui, ainda atrasado com o lançamento da aula inaugural do Curso Arduino Automation, e resolvi escrever esse post, com um diário dos meus últimos 15 dias.

Finalmente estou finalizando o trabalho que venho desenvolvendo com essa versão de Ethernet Shield conhecida por ENC28J60, que nada mais é senão um chip da Microchip que ajuda a resolver a camada de rede (Ethernet).

Datasheet do ENC28J60: http://ww1.microchip.com/downloads/en/devicedoc/39662b.pdf

Como podemos verificar no datasheet ele é entitulado de Stand-Alone Ethernet Controller with SPI Interface. Isso significa que ele se denomina um controlador Ethernet independente, e que disponibiliza uma interface SPI para comunicação, com o Arduino ou outro microcontrolador.

O grande problema desse modelo de Ethernet Shield é a biblioteca! O modelo W5100 de Ethernet Shield tem sua a biblioteca oficial sendo distribuida junto com o programa do Arduino. Já o ENC28J60, não existe uma biblioteca oficial, e as versões que existem sempre empacam no mesmo problema:


  • Buffer pequeno e limite envio na comunicação impedem o envio de HTML com mais de 500 caracteres*.

* Buffer de 500 bytes para o Arduino UNO e 1500 bytes para o Arduino MEGA.

Comparando o datasheet do ENC28J60 com o que está implementado em sua biblioteca para Arduino, nota-se que faltam muitas funções; e algumas estão comentadas, sob argumento de que não funcionam, e um material adicional é sugerido para leitura.

Exemplo:


// check if a packet has been received and buffered
//if( !(enc28j60Read(EIR) & EIR_PKTIF) ){

// The above does not work. See Rev. B4 Silicon Errata point 6.
 
if( enc28j60Read(EPKTCNT) == 0 ) {
return(0);
}

Estou tentando entender como funciona esse Ethernet Shield ENC28J60 pelos últimos 15 dias. Já venho brigando com ele há tempos, mas agora é definitivo.

Já consegui as seguintes melhorias na minha biblioteca para o ENC28J60:

  • Eliminada a limitação do buffer de 500 bytes para o Arduino UNO e de 1500 bytes para o Arduino MEGA;
  • Retirada a limitação de envio de apenas um pacote TCP;
  • Mantida a limitação de apenas um socket TCP, mas com agora controle de outros sockets;
Dessa forma, agora a biblioteca pode enviar páginas grandes de HTML, em pequenos pacotes TCP de 72 (dados) + 54 (header) = 128 bytes.

Só que agora que são muitos pacotes de 128 bytes sendo enviados, então a conexão ficou um pouco demorada, mas isso é facilmente resolvido através de ajustes no timer.

Alterei a biblioteca para funcionar em um formato de Serviço, com um timer que roda a cada 5 ms e verifica se dados chegaram ou precisam ser enviados pelo socket TCP.

Esse Serviço também lida com pacotes ARP, ICMP, e novos sockets, que o cliente vai abrindo durante a conexão. Como o Arduino não tem memória suficiente para lidar com vários sockets, o Serviço vai respondendo e fechando as conexões de socket, fora da conexão principal.

Essa biblioteca que estou fazendo ainda vai precisar de muitas contribuições da comunidade e muitas versões para ainda resolver todos os bugs e implementar todas as funcionalidades, mas já é uma luz no fim do túnel para quem sempre quis utilizar esse modelo de Ethernet Shield ENC28J60.

Eu mesmo sempre fiquei revoltado de não conseguir fazer esse modelo ENC28J60 a funcionar, mas só depois que descobri que ele não é "pior" que o W5100, mas sim, ele é mais versátil, permitindo implementações mais próximas às camadas mais baixas da rede. Por outro lado, é mais difícil de implementar código e organizar em bibliotecas.

A grande motivação que me faz continuar a criar essa biblioteca para o ENC28J60 é que ele é mais portável que o W5100. Enquanto o ENC28J60 tem problemas com a biblioteca, o W5100 tem dificuldades de funcionar em algumas versões de Arduino, principalmente se for uma versão stand-alone, tipo Nano, Mini, Lilypad, etc.

Já o ENC28J60 tem até versão em Módulo, além do Shield:


Shield Ethernet ENC28J60 v1.1


Módulo Ethernet ENC28J60 v1.1

quarta-feira, 13 de fevereiro de 2013

Grade de Aulas Curso Arduino Automation

Semestre 1 – 2013

  • Aula 1 – Ethernet Shield
    • Dilema do Ethernet Shield e a dificuldade de aprendizado
    • Diferenças entre os modelos de Ethernet Shield (W5100, ENC28J60, Shield e Módulo)
    • Discussão sobre as bibliotecas existentes e a dificuldade de utilização delas
    • Apresentação da biblioteca EthernetSup.h
      • Especialmente desenvolvida para simplificar o uso do Ethernet Shield com Arduino
    • Conexão com o Arduino, através do conector ICSP
    • Opções de conexão do Ethernet Shield com a rede local
    • Configurações de roteadores e disponibilidade da automação através da Internet
  • Aula 2 – Acionamento de Cargas por Relês
    • Apresentação do Módulo de Relês de 4 Canais
    • Esquemas de ligação de cargas
      • Lâmpada
      • Ventilador
    • Acionamento de cargas
    • Abertura de Fechadura Elétrica
    • Detalhes da instalação da Fechadura
  • Aula 3 – Controle de Cargas por TRIAC's
    • Controle de velocidade do ventilador
    • Apresentação do Módulo Dimmer
    • Programação do Ethernet Shield para contemplar controle Dimmer
  • Aula 4 – Plataforma Supervisório
    • Apresentação do Arduino Supervisório
    • Modos de operação e gravação do programa no Arduino
    • Kit de acessórios do Supervisório
      • Shield Supervisório
      • Módulo Conversor Supervisório (converte pinos em bornes)
      • Módulo Distribuidor de Alimentação Supervisório
      • Módulo Conversor de Alimentação Supervisório
      • Módulo LCD Supervisório
      • Módulo Nobreak Supervisório
    • Detalhes da instalação e fixação em painéis e caixas
  • Aula 5 – Integração com Infra-Vermelho
    • Acionamento de Ar-condicionado via Infra-Vermelho
    • Mapeamento das teclas do controle remoto do Ar-condicionado
    • Instalação do Emissor Infra-Vermelho com Plataforma Supervisório
    • Programação do Ethernet Shield para contemplar integração Infra-Vermelho
  • Aula 6 – Integração Wireless
    • Utilização de módulos Wireless 433Mhz
    • Integrando com motores EMTECO de persiana
    • Mapeamento e clonagem de controles Wireless com função pulseIn() do Arduino
    • Acionamento de portões de garagem utilizando o HT12 com módulo Wireless
    • Shield Ethernet Wifi

Semestre 2 – 2013

  • Aula 7 – Android (ADK)
    • Integrando Arduino com Android via Kit de Desenvolvimento do Android (ADK)
    • Utilização do USB Host Shield
    • Programando aplicativo Android com Java para integração com Arduino
  • Aula 8 – Controle de Consumo & Queda de Energia
    • Sensor de corrente
    • Controle do consumo da energia elétrica
    • Chaveamento de energia elétrica por baterias para sistema continuar funcionando mesmo em caso de queda de energia
  • Aula 9 – Módulo GSM
    • Utilização de sensor de movimento PIR
    • Envio de SMS's com eventos de sensores de movimento
  • Aula 10 – Motores
    • Acionamento de motores de vidro-elétrico para abertura de janelas
    • Apresentação do Módulo de Ponte H de 5 amperes
    • Motores de precisão (Motor de passo) para posicionamento de aletas de persiana
    • Apresentação da placa Chopper
  • Aula 11 – Sensores de Luminosidade e Temperatura
    • Sensor LM35 para determinar temperatura ambiente e regular o Ar-condicionado automaticamente
    • Ligação de LDR (sensor de luminosidade) para determinar a abertura de persiana
  • Aula 12 – Comando de Voz
    • Módulo EasyVr para reconhecimento de voz
    • Abertura da fechadura através de comandos de voz
    • Acionamento de cargas através de comandos de voz

Material Necessário

  • Aula 1 – Ethernet Shield
    • Essencial
      • Ethernet Shield W5100
      • Arduino UNO
      • Roteador
      • Cabo de Internet
      • Computador
    • Opcional
      • Nano Roteador TL-WR702N
      • Ethernet Shield ENC28J60
  • Aula 2 – Acionamento de Cargas por Relês
    • Essencial
      • Material da Aula 1
      • Módulo de Relê de 4 Canais
      • Fechadura Elétrica 12V
      • Lâmpada
      • Ventilador
    • Opcional
      • Fio de cobre para ligação elétrica
      • Terminais de tomada
      • Conectores Sindal
      • Soquete para lâmpada
      • Capacitor de Poliester de 3300uF (se ventilador for de teto)
  • Aula 3 – Controle de Cargas por TRIAC's
    • Essencial
      • Material da Aula 1
      • Módulo Dimmer
  • Aula 4 – Plataforma Supervisório
    • Essencial
      • Material da Aula 1
      • Arduino Supervisório
    • Opcional
      • Módulo USB/Serial FTDi
      • Acessórios da plataforma Supervisório
      • Painel ou caixa para fixação
      • Suportes plásticos para fixação
  • Aula 5 – Integração com Infra-Vermelho
    • Essencial
      • Material da Aula 1
      • Aparelho controlado por Infra-Vermelho (Ar-condicionado, TV etc)
      • Kit Infra-Vermelho (Emissor/Receptor)
    • Opcional
      • Material da Aula 4
  • Aula 6 – Integração Wireless
    • Essencial
      • Material Aula 1
      • Kit Wireless 433Mhz
      • Motor EMTECO para persianas
    • Opcional
      • Kit Motor para Portão Eletrônico Deslizante PPA ¼ HP
      • Fechadura Elétrica Wireless 433Mhz
      • Shield WiFi 802.11b
  • Aula 7 – Android (ADK)
    • Essencial
      • Arduino UNO
      • USB Host Shield
      • Celular/Tablet Android
      • Cabo USB
      • Computador PC
    • Opcional
      • Arduino MEGA ADK
  • Aula 8 – Controle de Consumo & Queda de Energia
    • Essenciais
      • Material da Aula 1
      • Módulo Sensor de Corrente
      • Módulo Nobreak Supervisório
  • Aula 9 – Módulo GSM
    • Essencial
      • Material da Aula 1
      • Sensor de Movimento PIR
      • Módulo GSM/GPRS SIM900
  • Aula 10 – Motores
    • Essencial
      • Material da Aula 1
      • Motor Mabuschi 8 Dentes (Máquina de vidro-elétrico)
      • Módulo Ponte H 5A
      • Motor de Passo NEMA 23
      • Módulo Driver Chopper 5A
    • Opcionais
      • Correias e Polias Sincronizadoras
  • Aula 11 – Sensores de Luminosidade e Temperatura
    • Essenciais
      • Material da Aula 1
      • Sensor LM35
      • Sensor LDR
    • Opcionais
      • Sensor de Temperatura e Umidade DHT11
  • Aula 12 – Comando de Voz
    • Essencial
      • Material da Aula 1
      • Módulo EasyVr
    • Opcional
      • Auto-falantes


Previsão de lançamento: Março 2013

Grade de Aulas do Curso Arduino Pró


  • Aula 1 – Bootloader
    • Entendendo como funciona o bootloader
    • Diferenças entre as versões das boards do Arduino
    • Conhecendo melhor o microcontrolador (ATMega), o cérebro do Arduino
    • Vamos aprender o que faz o Arduino ser um Arduino
  • Aula 2 – Arrays e Ponteiros
    • Entendendo como funcionam ponteiros de memória
    • Conhecendo as diferenças entre arrays e ponteiros
    • Limitações e usos dos arrays e de ponteiros
  • Aula 3 – Classes
    • Aprendendo a criar classes e consumir objetos
    • Utilizando Programação Voltada ao Objeto (OOP) no Arduino
    • Passando parâmetros e ponteiros para funções dentro de classes
  • Aula 4 – Memórias
    • Entendendo as diferentes memórias que fazem parte do microcontrolador
    • Conhecendo a biblioteca FreeMem.h – ajuda a controlar o uso da memória RAM
    • PROGMEM – Variáveis armazenadas na memória de programação ao invés da RAM
  • Aula 5 – Operadores Binários
    • Conhecendo os operadores binários Bitwise
    • Diferenças entre os operadores Boolean e Bitwise
    • Aplicando transformações com operadores Bitshift
    • Conversão de tipos, desmembrando e reagrupando bytes
  • Aula 6 – AVRDude
    • Conhecendo a ferramenta de upload de código para o Arduino
    • Aprendendo como os programas são compilados e publicados no ATMega328
    • Diferenças entre upload através de bootloader e via programador
  • Aula 7 – Fuse Bits
    • Aprendendo como configurar os Fuse bits e para que servem
    • Bloqueando o código no ATMega328 para evitar cópia por outras pessoas
    • Configurando o ATMega328 para funcionar sem cristal externo
  • Aula 8 – Acesso Direto a Portas
    • Acessando diretamente as portas do Arduino sem utilização de funções
    • Configurando as portas diretamente pelos registradores internos
    • Conhecendo os registradores de configuração DDR
    • Escrevendo nas portas através dos registradores PORT
    • Lendo das portas através dos registradores PIN
  • Aula 9 – Timers & Contadores
    • Explorando os timers internos do microcontrolador do Arduino
    • Detectando estouro de contagem através de interrupções dos contadores
    • Fazendo cálculos de tempos independentes da execução principal do código
    • Aprendendo mais sobre interrupções e seus vetores
  • Aula 10 – DAC
    • Conversão analógica digital com Arduino
    • Entendendo o pino ARef e o valor de referência para conversão
    • Utilizando buffers de saída PWM

Previsão de lançamento: Segunda quinzena de Fevereiro de 2013

quarta-feira, 28 de novembro de 2012

Criando Bibliotecas no Arduino



Este documento explica como criar bibliotecas para o Arduino. Começaremos com um programa exemplo de Código Morse, explicando como converter suas funcionalidades em uma biblioteca. Isto permite que outras pessoas possam facilmente utilizar seu código receber atualizações, conforme você melhorar a biblioteca.

Começamos com este Sketch (programa) que lida com Código Morse:
int pin = 13;

void setup()
{
  pinMode(pin, OUTPUT);
}

void loop()
{
  dot(); dot(); dot();
  dash(); dash(); dash();
  dot(); dot(); dot();
  delay(3000);
}

void dot()
{
  digitalWrite(pin, HIGH);
  delay(250);
  digitalWrite(pin, LOW);
  delay(250);
}

void dash()
{
  digitalWrite(pin, HIGH);
  delay(1000);
  digitalWrite(pin, LOW);
  delay(250);
}
Se você executar o sketch acima, ele piscará o código S.O.S. na porta 13.
Este sketch possui partes diferentes que serão implementadas na nossa biblioteca. Primeiro, é claro, temos as funções dot() and dash() que executam a funcionalidade de piscar. Segundo, temos a variável ledPin que é utilizada pelas funções para determinar qual porta utilizar. Finalmente, temos a chamada da função pinMode() que inicia a porta como saída.

Vamos começar a transformar esse sketch em uma biblioteca!

Você precisa de pelo menos dois arquivos para criar uma biblioteca: um arquivo de cabeçalho (header file), com a extensão .h, e o arquivo de código-fonte (source file), com a extensão .cpp. O arquivo de cabeçalho possui as definições da biblioteca: basicamente uma listagem de tudo que a biblioteca possui; enquanto o arquivo de código-fonte, é o código real, que executa as funções. Vamos chamar nossa biblioteca de "Morse", então nosso arquivo de cabeçalho será Morse.h. Vamos ver o que vai dentro dele. Pode parecer um pouco estranho a primeira vista, mas fará mais sentido quando você vir o código-fonte, que acompanha este arquivo.

O truque desse arquivo de cabeçalho é criar em uma linha para cada função da biblioteca, contida em uma classe, acompanhada das variáveis que você utilizará:
class Morse
{
  public:
    Morse(int pin);
    void dot();
    void dash();
  private:
    int _pin;
};
Uma classe é simplesmente uma coleção de funções e variáveis que estão organizadas em um pacote. Estas funções e variáveis, podem ser public (públicas), significando que podem ser acessadas pelos programadores que a implementarão, ou private (privada), significando que elas só podem ser utilizadas internamente na classe em si. Cada classe tem uma função especial conhecida por constructor (construtor), que é utilizada para criar uma instância da classe, em tempo de execução. O construtor possui o mesmo nome da classe, e sem tipo de retorno.

Você precisa de algumas outras coisas no seu arquivo de cabeçalho. Uma delas é uma declaração #include que lhe dá acesso aos tipos e constantes da linguagem do Arduino (isto é automaticamente feito quando você cria um sketch, mas não em uma biblioteca, devendo ser adicionado manualmente).
#include "Arduino.h"
Finalmente, é comum empacotar o arquivo de cabeçalho, em uma construção de declarações, com a seguir:
#ifndef Morse_h
#define Morse_h

// the #include statment and code go here...

#endif
Basicamente, isto previne que alguém acidentalmente adicione mais de uma vez o cabeçalho da sua biblioteca.
Para encerrar, normalmente colocamos um comentário no início do arquivo, com o nome da biblioteca, uma breve descrição, nome do autor, data e termos de uso.
Vamos dar uma olhada no arquivo de cabeçalho completo:
/*
  Morse.h - Library for flashing Morse code.
  Created by David A. Mellis, November 2, 2007.
  Released into the public domain.
*/

#ifndef Morse_h
#define Morse_h

#include "Arduino.h"

class Morse
{
  public:
    Morse(int pin);
    void dot();
    void dash();
  private:
    int _pin;
};

#endif
Agora veremos as várias partes do arquivo de código-fonte, Morse.cpp.
Primeiro vem umas declarações #include. Elas trazem o código necessário para as funções básicas do Arduino, e as definições implementadas no seu arquivo de cabeçalho:
#include "Arduino.h"
#include "Morse.h"
Então vem o construtor. Novamente, ele é iniciado cada vez que alguém cria uma instância da sua classe. Neste caso, o usuário especifica qual porta ele deseja utilizar. Configuramos então a porta como saída, gravando o parâmetro em uma variável privada, utilizada posteriormente em outras funções:
Morse::Morse(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}
Este código possui algumas coisas estranhas nele. Primeiro é o Morse:: antes do nome da função. Ele mostra que a função é parte da classe Morse  Você verá isto novamente na criação das outras funções da classe também. A segunda coisa é o underline (traço-baixo) no nome da nossa variável privada, _pin  Esta variável pode ter qualquer nome que você desejar, desde que coincida com a definição no arquivo de cabeçalho. Adicionar um underline no começo do nome é uma convenção para clarificar a ideia de que a variável é privada e também distinguir do nome de argumento da função.
Em seguida, temos o código realmente originado do sketch que estamos transformando em biblioteca. Não mudou, muito, exceto pelo Morse:: na frente dos nomes das funções, e _pin ao invés de pin:
void Morse::dot()
{
  digitalWrite(_pin, HIGH);
  delay(250);
  digitalWrite(_pin, LOW);
  delay(250); 
}

void Morse::dash()
{
  digitalWrite(_pin, HIGH);
  delay(1000);
  digitalWrite(_pin, LOW);
  delay(250);
}
Finalmente, é comum incluir o comentário no início, como fizemos no arquivo do cabeçalho. Vamos ver como ficou o código-fonte completo:
/*
  Morse.cpp - Library for flashing Morse code.
  Created by David A. Mellis, November 2, 2007.
  Released into the public domain.
*/


#include "Arduino.h"
#include "Morse.h"

Morse::Morse(int pin)
{
  pinMode(pin, OUTPUT);
  _pin = pin;
}

void Morse::dot()
{
  digitalWrite(_pin, HIGH);
  delay(250);
  digitalWrite(_pin, LOW);
  delay(250); 
}

void Morse::dash()
{
  digitalWrite(_pin, HIGH);
  delay(1000);
  digitalWrite(_pin, LOW);
  delay(250);
}
E isto é tudo que você precisa (existem algumas coisas adicionais interessantes, mas falaremos disso a seguir). Vamos ver como utilizar nossa biblioteca.
Primeiro, crie um diretório chamado Morse dentro do sub-diretório libraries do seu sketchbook (lugar padrão onde salva os sketches que você cria). Copie ou mova os arquivos Morse.h e Morse.cpp para esse diretório. Agora inicie o programa do Arduino (IDE). Se você abrir o menu Sketch > Import Library, verá que a biblioteca Morse está lá. A biblioteca será compilada com os sketches que a utilizarem.
Vamos ver como vai ficar nosso sketch SOS agora, usando a biblioteca:
#include

Morse morse(13);

void setup()
{
}

void loop()
{
  morse.dot(); morse.dot(); morse.dot();
  morse.dash(); morse.dash(); morse.dash();
  morse.dot(); morse.dot(); morse.dot();
  delay(3000);
}
Existem algumas diferenças entre a versão original e este novo sketch (além do código que foi movido para dentro da biblioteca).
Primeiro, adicionamos uma declaração #include, no início do sketch. Isto faz a biblioteca Morse se tornar disponível durante o código. Isso significa que ao encontrar essa linha o compilador vai linkar o código da biblioteca e publicar na placa. Ou seja, caso não vá utilizar mais a biblioteca, lembre-se de retirar essa linha para o seu sketch gerar um arquivo final menor.
Segundo, declaramos uma instância da classe Morse, chamada morse :
Morse morse(13);
Quando esta linha é executada (o que acontece até mesmo antes da função setup()), o construtor da classe Morse será chamado, passando o argumento da porta (no nosso caso, 13).
Finalmente, para chamar as funções dot() e dash(), você precisa utilizar um prefixo morse. - o nome da instância (objeto) que queremos utilizar. Podemos ter várias instâncias da classe Morse, cada qual configurando uma porta diferente, independentemente umas das outras com suas próprias variáveis privadas. Fazemos isso alterando o parâmetro inicial que será passado, conforme exemplo:
Morse morse(13);
Morse morse2(12);
então dentro da chamada na função morse2.dot()_pin seria 12.
Se você testou o novo sketch, provavelmente notou que alguns termos de nossa biblioteca não ficaram ressaltados pelo esquema de cores do Arduino. Infelizmente o programa do Arduino não pode reconhecer automaticamente o que você define dentro da biblioteca (embora essa seria uma funcionalidade interessante para as próximas versões), então você precisa dar uma mãozinha, criando um arquivo chamado keywords.txt dentro do diretório Morse. Deve se parecer com este:
Morse   KEYWORD1
dash    KEYWORD2
dot     KEYWORD2
Cada linha tem o nome da palavra-chave, seguida por uma tabulação (não espaços), seguidos pelo tipo da palavra. As classes devem ser do tipo KEYWORD1, e coloridas de laranja; funções devem ser do tipo KEYWORD2, e serão marrons. Você deve reiniciar o ambiente do Arduino para que as modificações sejam aplicadas.

Seria bacana enviar um exemplo do uso da biblioteca junto com o pacote. Para fazer isso crie um diretório examples dentro do diretório Morse  Então copie ou mova o diretório contendo o sketch do SOS  que criamos, acima. Se você reiniciar o Arduino mais uma vez, a última, prometo - você verá sua Library-Morse dentro do menu File > Sketchbook > Examples.

Adicionalmente você pode adicionar comentários no seu código de exemplo para ensinar as pessoas como utilizar sua biblioteca.
Se você quiser o código completo da biblioteca (com exemplos de palavras-chave), você pode baixar aqui: Morse.zip.

Fonte: http://arduino.cc/en/Hacking/LibraryTutorial

domingo, 28 de outubro de 2012

Curso Arduino Advanced - Aula 17 (Bluetooth)

Pessoal,

Segue o link para acessar o código fonte desta aula sobre bluetooth e o Arduino:

http://seriallink.com.br/forum/viewtopic.php?f=71&t=1554

Abraços,
Renato

sexta-feira, 12 de outubro de 2012

Fórum do Curso do Arduino

Pessoal,

Estou publicando este post para divulgar o fórum do Curso do Arduino no endereço do meu site:

http://www.seriallink.com.br/forum

Por favor utilizem o fórum para dúvidas técnicas e discussões sobre os posts feitos no blog.

Abraços,
Renato Aloi

domingo, 26 de agosto de 2012

Código Fonte - Aula 15 do Curso Arduino Advanced (PHP)

Pessoal,

Segue o código utilizado no Arduino:


void setup()
{
  Serial.begin(9600);
  delay(1000);
}

void loop()
{
  if (Serial.available())
  {
    char recebido = Serial.read();
    if (recebido = 't')
    {
      int valorLido = analogRead(0);
      float temperatura = (valorLido * 0.00488) * 100;
      Serial.print("Temperatura: ");
      Serial.println(temperatura);
    }
  }
}

Código utilizado no PHP:




<?php

//MAC/Linux
//$portAddress = '/dev/tty.XYZ';

//Windows
$portAddress = 'COM3';
exec("mode com3: BAUD=9600 PARITY=N data=8 stop=1 xon=off");

echo(" <h1> Temperatura Via Arduino </h1> ");

echo(" <p> Conectando, aguarde...");
$port = fopen($portAddress, 'w+');
if(!$port)
{
echo " <br /> Nao foi possivel abrir a porta $portAddress";
}
else
{
echo " <br /> Conectado com sucesso na porta $portAddress";
}
echo(" </p> ");


sleep(3);
fwrite($port, 't');

sleep(1);
echo fgets($port);

fclose($port);

?>