Ajuda com projecto final (Controlar aparelhos electrónicos através de um Android

Boas pessoal!

Sou um estudante do curso de engenharia electrónica e estou a finalizar o curso, sendo que para terminar preciso de concluir uma cadeira chamada Projecto, que como tal o nome indica, a cadeira é avaliada no final do semestre através de um projecto proposto a responsável do curso. O meu projecto trata-se do controlo de vários aparelhos (TV, projector, ar condicionado, etc...) através de um dispositivo Android via WIFI.

Como introduçao ao Arduino e a como controla-lo através de WIFI, o meu orientador pediu para trabalhar em dois projectos simples, para trabalhar como teste. Eles consistem em:

1) Devo fazer um LED piscar e via WIFI imprimir para uma página de web o estado do LED (On/Off), e como tal pensei em utilizar o esqueleto de um exemplo de um WebCliente de uma biblioteca WiFly que descarreguei da Internet.

2) Devo criar uma página web com um botão onde posso escolher o estado que quero com que o LED fique (On/Off)

O material que estou a utilizar é o seguinte:

Estou a ter alguns problemas com o código, não sei se coloquei bem os print's e os digitalwrite e não sei como criar esse servidor para testar os prints do estado do LED. Até ao momento isto é o que tenho para o 1).

// (Based on Ethernet's WebClient Example)

#include "WiFly.h"
#include "Credentials.h"


byte server[] = { 66, 249, 89, 104 }; // Google

int led=13;

//Client client(server, 80);

Client client("google.com", 80); // not my server

void setup() {
  
  Serial.begin(9600);

  WiFly.begin();
  
  if (!WiFly.join(ssid, passphrase)) {
    Serial.println("Association failed.");
    while (1) {
      // Hang on failure.
    }
  }  

  Serial.println("connecting...");

  if (client.connect()) {
    Serial.println("connected");
    client.println("GET /search?q=arduino HTTP/1.0");
    client.println();
    pinMode(led, OUTPUT);
  } else {
    Serial.println("connection failed");
  }
  
}

void loop() {
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
    digitalWrite(led, HIGH);
    client.println("The LED is On");
    delay(1000);
    digitalWrite(led, LOW);
    client.println("The LED is Of");
    delay(1000);
  }
  
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
}
#ifndef __CREDENTIALS_H__
#define __CREDENTIALS_H__

// Wifi parameters
char passphrase[] = "mypassphrase";
char ssid[] = "myssid";

#endif

Após estar com algumas dificuldades em ligar o módulo à rede consegui através deste link http://www.youtube.com/watch?feature=player_embedded&v=M5ABBw_0hDc

Qualquer ajuda era bem-vinda.

Que nivel e esse curso?

Se eu fosse o teu professor e tu me apresentasses codigo de Arduino chumbava-te na hora.

Dito isto, se pretendes testar o hardware, o Arduino sera a forma mais rapida de o fazer… tem cuidado com o que apresentas no final.

bubulindo: Que nivel e esse curso?

Se eu fosse o teu professor e tu me apresentasses codigo de Arduino chumbava-te na hora.

Dito isto, se pretendes testar o hardware, o Arduino sera a forma mais rapida de o fazer... tem cuidado com o que apresentas no final.

Boas, antes de mais gostaria de agradecer o tempo disponibilizado a olhar para a minha questão, e depois gostaria de pedir desculpa pela resposta tardia, mas foi impossível vir ao computador mais cedo.

Respondendo a questão o projecto está enquadrado no 3º ano do curso de engenharia electrónica. Esta parte do trabalho é suposto ser feito no Arduino só para me ambientar, mas apesar do problema que me foi proposto ser talvez dos mais básicos, não consigo resolve-lo.

Explicando novamente, foi me proposto inicialmente uma espécie de projecto teste com um LED, o qual numa primeira fase devo fazer com que mude de estado e imprima para uma página Web o estado em que o LED se encontra.

Em suma:

  • LED acende -> é impresso na página a seguinte frase "O LED está On"
  • LED apaga -> é impresso na página a seguinte frase "O LED está Off"

Apenas isto. Numa segunda fase devo usar uma página Web na qual tenho um botão, com o qual defino o estado do LED, resumidamente:

  • A página apresenta uma frase "Defina se quer o LED On ou Off", tem por debaixo um botão com as opções "On" e "Off"
  • Clico em "On" o LED acende
  • Clico em "Off" o LED apaga

O LED com o qual estou a trabalhar é o LED que está no PIN 13 do Atmega2560

Respondendo a questão o projecto está enquadrado no 3º ano do curso de engenharia electrónica. Esta parte do trabalho é suposto ser feito no Arduino só para me ambientar, mas apesar do problema que me foi proposto ser talvez dos mais básicos, não consigo resolve-lo.

Eu pra te ser sincero esperava mais de ti.Se estas no final do teu curso era suposto teres os conhecimentos para fazer isso num ardiuno, num PIC,z80 ou em qualquer outro. Deixo te a pergunta, será que te queres enganar a ti proprio? Entretanto respondendo a tua pergunta e olhando para o teu codigo fico com a sensaçao que te esqueceste de colocar um ip, dns valido, mascara de rede, mac address valido ... Sem eles o modulo wifi nao deve funcionar Para teres uma idea se fores ao exemplos localizados na IDE do arduino tens la um em Examples->Ethernet->Webserver que te deve dar uma boa idea do que tens de fazer.O exemplo usa uma placa ethernet, tu usas uma wireless mas o conceito é o mesmo ...

O que me choca a mim sao duas coisas...

O professor ter proposto isto. Ou seja, o professor nao sera muito bom. Eu preferiria que o aluno fizesse algo que nao fosse bonito de mostrar mas que envolvesse competencia tecnica. O professor pediu-te algo que qualquer pessoa com paciencia e um pouco de carolice faz (tanto e, que ja muita gente o fez).

Nao teres capacidade de procurar isto ja feito ou os exemplos que te permitem fazer isto.

A capacidade mais importante dum engenheiro e encontrar a informacao que lhe permitira atingir um objectivo. Para teres um exemplo, e darem-te um manual de 600 paginas dum sistema que nunca viste e em menos de uma hora teres a informacao que precisas para resolver um problema. E nao me parece que ainda tenhas essa capacidade. Essa capacidade passa, primeiramente, por entender as partes envolvidas num problema e separa-las de forma a resolveres uma a uma.

Nao leves a mal, nao estou a criticar de forma agressiva, mas de forma construtiva para que tentes mudar esse aspecto. Tenta tambem ter um pouco mais de sentido critico com os professores. La porque eles dizem, nao quer dizer que seja correcto ou verdade. Pergunta ao professor se faz sentido usares bibliotecas da internet e hardware do chines... em vez de seres tu a montar o hardware e escrever as bibliotecas (mesmo que para algo menos vistoso).

Estar aqui no fórum a expor o meu problema foi último recurso.

Eu já pesquisei mil e uma coisas, e a única coisa que consegui foi configurar o RN-XV para ligar a rede onde estou a trabalhar.

Eu sei que estas perguntas são programação básica, mas eu nunca fui muito forte a programar e este foi o único projecto que consegui arranjar. O projecto não consiste nisto, volto a frisar, o projecto que tenho de apresentar passa pelo controlo de aparelhos electrónicos através de um Android.

Só que se eu não consigo fazer isto, dificilmente consigo fazer o projecto, por isso é que gostaria de ver se alguém me consegue explicar, porque encontrar informação sobre este módulo, só consegui encontrar o data sheet , e poucos projectos que estão um pouco relacionados com o meu, as livrarias não tenho muito hipótese.

Claro que se acharem que o tópico não faz sentido, depressa irei apagar o mesmo.

Heyyyyy, claro que faz sentido!

vieste procurar ajuda e ninguem ta esta a negar. Apenas comecamos pela ajuda que, para nos, te sera mais importante para o resto da tua carreira. Se nao percebes de programacao... como vais fazer a parte do Android? Nos nao estamos contra o facto de estares a fazer algo para ligar o LED... isso seria um projecto bem interessante, se escrevesses o codigo de raiz. Com bibliotecas do Arduino, sera mais ou menos copy paste.

O que tu precisas e de um servidor...

O teu ATmega2560 sera um servidor Web. Nesse servidor web vais ter uma pagina guardada e um led ligado a uma saida (espero, para mostrares algo bonito, que seja numa porta PWM e facas um dimmer).

Quando tu, no teu computador, entrares o IP da tua placa, o ATmega vai servir-te uma pagina com o estado do LED (em texto sera mais facil) e tera tambem um botao para o utilizador carregar para mudar o estado do LED. Eventualmente colocaras uma caixa de texto e o utilizador escolhe a luminosidade. Mas adiante...

Ate agora, precisas de usar o exemplo WebServer. Se vais fazer uma app para o Android, precisas de especificar um protocolo de comunicacao para ligar e desligar o LED... se e uma pagina web, entao precisas de fazer a pagina em HTML.

Se fizeres a pagina em HTML, precisas de ver quando e que o browser te esta a pedir a pagina inicial... ou quando te esta a dizer que quer mudar o estado do LED.

Mais so se fizer eu o codigo por ti... o que nao da porque estou no trabalho.

Viste isto:

http://www.instructables.com/id/Making-an-Android-application-for-ArduinoLED-Turn/?lang=pt

http://www.instructables.com/id/Making-an-Android-application-for-ArduinoLED-Turn/step2/Run-an-Android-Application/

http://cairohackerspace.blogspot.co.uk/2011/05/beginners-guide-to-connecting-and.html

http://www.is.kau.se/julioangulo/angulo/blog/?p=9

Demorou-me menos de 10 minutos a recolher esta informacao... estou no meio do Atlantico e a minha net vem por satelite para cerca de 100 computadores.

Mais uma vez... podes como que copiar tudo isso sem teres trabalho algum... mas eventualmente sera esperado de ti que facas isto por ti... ou pior que resolvas um problema em algo "feito" por ti.

Eu vou tornar a repetir eu não peço para que me façam nada apenas me digam se vou ou não no bom caminho, e uma pequena luz do tipo, começa por aqui.

Pesquisas?

http://www.openhomeautomation.net/monitor-your-home-remotely-using-the-arduino-wifi-shield/

http://evomedia.evothings.com/doc/arduino-led-onoff-tcp.html

https://github.com/evothings/EvoThingsExamples/blob/master/examples/arduino-led-onoff-tcp/arduinowifi/arduinowifi.ino

http://www.tinkerfailure.com/2012/02/setting-up-the-wifly-rn-xv/

https://forum.sparkfun.com/viewtopic.php?f=13&t=21846

http://forum.arduino.cc/index.php/topic,6595.0.html

http://www.arduteka.com/2013/04/comunicar-con-arduino-por-wifi-xbee-shield-wifly-rn-xv/

http://codebrane.com/blog/2014/04/27/arduino-mega-web-server-with-wifly-and-temperature-sensor/

http://www.is.kau.se/julioangulo/angulo/blog/?p=9

Como podes comprovar não me faltou pesquisa durante este tempo, apenas não consigo juntar as “peças”, não tenho o shield neste projecto estou a fazer as ligações por cabos.

Hoje toda a parte da configuação o módulo foi feita num programa para que não tenha que o estar a fazer manualmente de cada vez que me tentou ligar à rede.

// the setup routine runs once when you press reset:
void setup() {                

  // initialize the digital pin as an output.
  Serial.begin(9600,SERIAL_8N1);
  Serial3.begin(9600,SERIAL_8N1);
  Serial2.begin(9600,SERIAL_8N1);


  pinMode(1, OUTPUT);                                                             //TX
  pinMode(0, INPUT);                                                              //RX

  pinMode(16, OUTPUT);                                                            //TX
  pinMode(17, INPUT);                                                             //RX

  pinMode(14, OUTPUT);                                                           //TX
  pinMode(15, INPUT);  

  wifi_defaults();
  config_wlan();
  config_ip();

  status_wlan_and_ip();
  /*uart_config();*/
}

// the loop routine runs over and over again forever:
void loop() {


}



void read_infs(){
  //statements
  unsigned int aux=Serial3.available();
  char buffer[255];
  char *ptr=buffer;
  
  while(aux>0){
   Serial.write(Serial3.read());
   delay(50);
   aux=Serial3.available();
   }

  return; 
}


void wifi_defaults(){
  Serial3.write("$$");
  delay(3000);
  read_infs();
  Serial3.write("factory RESET\r");
  delay(300);
  read_infs();
  Serial3.write("save\r");
  delay(300);
  read_infs();
  Serial3.write("reboot\r");
  delay(1000);
  read_infs();
  return;
}

void config_wlan(){
  Serial3.write("$$");
  delay(3000);
Serial2.println();
  Serial3.write("set wlan auth 4\r");                  //WPA2-PSK (AES only)
  delay(300);
  read_infs();
  Serial3.write("set wlan channel 0\r");                //para fazer scanning em todos os canais
  delay(300);
  read_infs();
  Serial3.write("set wlan join 1\r");                    //para associar-se ao SSID guardado
  delay(300);
  read_infs();
  Serial3.write("set wlan hide 0\r");                    //esconde ou não a passwd 1-esconde 0-não esconde
  delay(300);
  read_infs();
  Serial3.write("set wlan phrase gecadpower\r");        //passwd da rede a iniciar
  delay(300);
  read_infs();
  Serial3.write("set wlan ssid GECAD_N\r");             //defineo o ID da rede a associar-se   
  delay(300);
  read_infs();
  Serial3.write("save\r");
  delay(300);
  read_infs();
  Serial3.write("reboot\r");
  delay(1000);
  read_infs();
  return;
}

void config_ip()
{
  Serial3.write("$$");
  delay(300);
  Serial2.println();
  Serial3.write("set ip localport 80\r");             //porto para o modbus TCP
  delay(300);
  read_infs();
  Serial3.write("set ip protocol 2\r");                // permite o funcionamento como TCP server/cliente -> bitmapped
  delay(300);
  read_infs();
  Serial3.write("set ip dhcp 1\r");                    //ativa o DHCP
  delay(300);
  read_infs();
  Serial3.write("save\r");
  delay(300);
  read_infs();
  Serial3.write("reboot\r");
  delay(1000);
  read_infs();

  return; 
}
void status_wlan_and_ip()
{
  delay(3000);
  Serial3.write("$$");
  delay(200);
  Serial2.println();
  Serial2.println();
  Serial2.println("wlan parameters: ");
  Serial3.write("get wlan\r");
  delay(200);
  read_infs();
  Serial2.println();
  Serial2.println("ip parameters: ");
  Serial3.write("get ip\r");
  delay(200);
  read_infs();
  Serial3.write("exit\r");
  delay(200);
  read_infs();
  return;
}

void uart_config()
{
  delay(3000);
  Serial3.write("$$");
  delay(200);
  read_infs();
  Serial2.println();
  Serial3.write("set uart baud 19200\r");
  delay(200);
  read_infs();
  Serial3.write("save\r");
  delay(300);
  read_infs();
  Serial3.write("reboot\r");
  Serial2.begin(19200,SERIAL_8N1);
  delay(1000);
  read_infs();
  return;
}

Isto claro que fiz com grande ajuda de um amigo meu. De seguida tentei pegar pelo mais simples mandar para o módulo 2 prints para imprimir para o ecrã, o problema e que isto imprime de imediato uma página cheia com os 2 prints e continua repetidamente a imprimir, pensei que através de um circulo for() conseguiria fazer com que imprimisse apenas uma vez, pensando que se fizesse um for de i = 0 ate 1 iria obrigar de maneira rudimentar obrigar o ciclo dos dois prints a ser feito apenas uma vez.

void setup() {
  
  char ssid[] = "minharede";
  
  Serial3.begin(9600);
  Serial.print("IP: ");
 
   
}
  
  void loop() {
    
    int i;
    
   for(i;i<=1;i++)
       {
           
         Serial3.print("isto e um teste\n");
         delay(100);
         Serial3.print("isto e apenas um teste\n");
         delay(100);

      }
  }

Tentei também aumentar o tempo de delay do último print, retirando o ciclo for(), para um valor grande o que iria obrigar quase a uma não impressão, mas eu já sei que qualquer pessoa que perceba minimamente de código está a espera que aquele ciclo vá ser repetido ao fim de um “x” tempo, o que seria atirar areia para os olhos ou tapar o sol com a paneira. Contudo mesmo tendo feito isso, não obtenho o que espero, uma vez que a página apenas fica a carregar e nunca me apresenta nada, noto ainda através da luz do módulo que nenhuma informação neste caso é enviada para ele.

nimohoxi: De seguida tentei pegar pelo mais simples mandar para o módulo 2 prints para imprimir para o ecrã, o problema e que isto imprime de imediato uma página cheia com os 2 prints e continua repetidamente a imprimir, pensei que através de um circulo for() conseguiria fazer com que imprimisse apenas uma vez, pensando que se fizesse um for de i = 0 ate 1 iria obrigar de maneira rudimentar obrigar o ciclo dos dois prints a ser feito apenas uma vez.

Repara que tu nem tao pouco sabes o que quer dizer as funcoes do arduino... a funcao setup corre uma vez. A funcao loop corre em continuo, dai os prints estarem sempre a ser repetidos.

é normal que não saiba é a primeira vez a trabalhar com ele

A explicacao das funcoes do Arduino aprendem-se em 2 minutos… afinal de contas sao duas funcoes.

Tu nao sabes C, ou sabes?

Eu vou tornar a repetir eu não peço para que me façam nada apenas me digam se vou ou não no bom caminho, e uma pequena luz do tipo, começa por aqui.

Ok vais no bom caminho em tentares aprender, mas o teu caminho está um pouco empenado pois olhando para a tua programação como tu dizes precisas de aprender ainda bastante e saberes o básico para dares os primeiros passos.Não te estou a dizer para desistires, pois espero que não o faças, nos estamos aqui para te ajudar mas é esperado que tu nos apresentes algo para a comunidade no que puder te ajudar.Como te disse eu nunca usei esse modulo, de uma breve pesquisa que fiz pareceu me relativamente simples.Fiquei com a ideia que é configurar o modulo wireless nos seguintes passos: Usando a porta serie dele configurar o modulo para se ligar à rede wifi perto dele.Isto é feito escrevendo os comandos na porta Serie dele, ele vai te dando os ok's ao longo das instruções que lhe envias... Configurar um ip fixo nele preferencialmente, ja que se vais conceber uma app deves querer saber sempre o ip para onde deves mandar as instruções. Não tenho a certeza mas ao ler sobre ele fiquei com a sensação que ele ao conectar com sucesso à tua rede wifi fica à escuta na porta 2000 TCP no ip que tu lhe especificaste, portanto se assim for depois podes interagir directamente com os GPIO do modulo através dessa pipe eventualmente. Não consegui encontrar o datasheet dos registos e das instruções sobre ele ...