, a parte de acionar lampadas, coolers, via servidor está ok, até que eu fui tentar incluir no projeto um sensor de movimento, segui diversos exemplos para incluir ao meu código que ja estava feito e não obtive sucesso, se alguem puder me ajudar ficarei muito grato !!!
segue código:
#include <SPI.h>#include <Ethernet.h>String readString; int pino_rele1 = 1; //LAMPADA 01int pino_rele2 = 2; //LAMPADA 02int pinoAlarme1 = 10;//alarme1int pinoAlarme2 = 11; //alarme2int pino_rele3 = 3; //COOLER 01int pinoSensor = 4; //SENSORMOVIMENTO//sensor em estado 0, desligado.int iniciaSensor = 0; //calibracao do sensorint calibracao = 45;
boolean ligado = true;boolean ligado_2 = true;boolean ligado_3 = true;
//Informacoes de endereco IP, gateway, mascara de redebyte mac[] = { };byte ip[] = { 192, 168, 15, 177 };byte gateway[] = { 192, 168, 15, 1 };byte subnet[] = { 255, 255, 255, 0 }; EthernetServer server(80); void setup(){ Serial.begin(9600); //pinos que serao utilizados como saida pinMode(pino_rele1, OUTPUT); pinMode(pino_rele2, OUTPUT); pinMode(pino_rele3, OUTPUT); pinMode(pinoAlarme1, OUTPUT); pinMode(pinoAlarme2, OUTPUT); //pino que sera utilizado como entrada pinMode(pinoSensor, INPUT); Serial.println("Calibrando sensor"); for (int i = 0; i < calibracao; i++){ Serial.println("."); delay (1000); } Serial.println("Sensor ativado"); delay (500);} //Inicializa Ethernet Shield Ethernet.begin(mac, ip, gateway, subnet); server.begin(); Serial.println("Automacao Residencial"); //Desliga os reles digitalWrite(pino_rele1, HIGH); digitalWrite(pino_rele2, HIGH); digitalWrite(pino_rele3, HIGH); void loop(){ EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); if (readString.length() < 100) { readString += c; } if (c == 'n') { //Controle do rele1 Serial.println(readString); //Liga o Rele 1 if (readString.indexOf("?ligar") > 0) { digitalWrite(pino_rele1, LOW); Serial.println("Rele 1 Ligado"); ligado = false; } else { //Desliga o Rele 1 if (readString.indexOf("?desligar") > 0) { digitalWrite(pino_rele1, HIGH); Serial.println("Rele 1 Desligado"); ligado = true; } } //Controle do rele2 Serial.println(readString); //Liga o Rele 2 if (readString.indexOf("?2_ligar") > 0) { digitalWrite(pino_rele2, LOW); Serial.println("Rele 2 Ligado"); ligado_2 = false; } else { //Desliga o Rele 2 if (readString.indexOf("?2_desligar") > 0) { digitalWrite(pino_rele2, HIGH); Serial.println("Rele 2 Desligado"); ligado_2 = true; } } //Controle do rele3 Serial.println(readString); //Liga o Rele 3 if (readString.indexOf("?3_ligar") > 0) { digitalWrite(pino_rele3, LOW); Serial.println("Rele 3 Ligado"); ligado_3 = false; } else { //Desliga o Rele 3 if (readString.indexOf("?3_desligar") > 0) { digitalWrite(pino_rele3, HIGH); Serial.println("Rele Desligado"); ligado_3 = true; } } // cada ciclo, e feita uma leitura do estado do sensor de presenca iniciaSensor = digitalRead(pinoSensor); Serial.print("Valor do Sensor PIR: "); Serial.println(iniciaSensor); //verificando se ocorreu deteccao de movimentos if (iniciaSensor ==1) { alarme_on(); else { alarme_off(); } } void alarme_on(){ //metodo que ativa o alarme - se detectada presenca acende a lampada digitalWrite(pinoAlarme1, HIGH); digitalWrite(pinoAlarme2, HIGH); } void alarme_off(){ //funcao que desativa o alarme digitalWrite(pinoAlarme1, LOW); digitalWrite(pinoAlarme2, LOW); } } readString = ""; client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<html>"); client.println("<head>"); client.println("<title> Automacao Residencial</title>"); client.println("<meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1'>"); client.println("<meta name='viewport' content='width=720, initial-scale=0.5' />"); client.println("<!-- // BOOTSTRAP 4 - CSS -->"); client.println("<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css' integrity='sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ' crossorigin='anonymous'> "); client.println("<link rel='stylesheet' type='text/css' href='http://fontawesome.io/assets/font-awesome/css/font-awesome.css' />"); //client.println("<link rel='stylesheet' type='text/css' href='http://img.filipeflop.com/files/download/automacao/automacao_residencial.css' />"); client.println("<link rel='stylesheet' type='text/css' href='https://automacaoresidencial.000webhostapp.com/automacao_residencial.css' />"); client.println("</head>"); client.println("<body>"); /* ESTADO DOS RELES */ client.print("<div id='estado' style='display:none;'>"); client.print(ligado); client.println("</div>"); client.print("<div id='estado_2' style='display:none;'>"); client.print(ligado_2); client.println("</div>"); client.print("<div id='estado_3' style='display:none;'>"); client.print(ligado_3); client.println("</div>"); client.print("<div id='estado_4' style='display:none;'>"); client.print(ligado_4); client.println("</div>"); client.println("<div id='content'></div>"); //CARREGA TODO O CONTEUDO DA PAGINA POR JS client.println("<script src='https://code.jquery.com/jquery-3.1.1.slim.min.js' crossorigin='anonymous'></script>"); client.println("<script src='https://automacaoresidencial.000webhostapp.com/automacao_residencial.js'></script>"); //client.println("<script type='text/javascript' src='http://img.filipeflop.com/files/download/automacao/automacao_residencial.js'></script>"); client.println("<script>");
client.println("</script>"); client.println("</body>"); client.println("</html>"); delay(1); client.stop(); } } } }
erro emitido:
sketch_sep10a.ino:50:3: error: ‘Ethernet’ does not name a typesketch_sep10a.ino:51:3: error: ‘server’ does not name a typesketch_sep10a.ino:53:3: error: ‘Serial’ does not name a typesketch_sep10a.ino:56:15: error: expected constructor, destructor, or type conversion before ‘(’ tokensketch_sep10a.ino:57:15: error: expected constructor, destructor, or type conversion before ‘(’ tokensketch_sep10a.ino:58:15: error: expected constructor, destructor, or type conversion before ‘(’ tokensketch_sep10a.ino: In function ‘void loop()’:sketch_sep10a.ino:143:16: error: ‘alarme_on’ was not declared in this scopesketch_sep10a.ino:144:6: error: expected ‘}’ before ‘else’sketch_sep10a.ino:145:17: error: ‘alarme_off’ was not declared in this scopesketch_sep10a.ino:148:22: error: a function-definition is not allowed here before ‘{’ tokensketch_sep10a.ino:152:23: error: a function-definition is not allowed here before ‘{’ tokensketch_sep10a.ino:191:24: error: ‘ligado_4’ was not declared in this scope
antes de incluir o código referido ao sensor de movimento estava funcionando perfeitamente.
…
esmo problema.
Com os comandos do controle para acionar a TV via emissor infra não consegui gerar o problema, mas quando aciono o botão da luz as vezes o mesmo envia o comando mas não recebe a resposta e parece que trava a ethernet shield ai após esse travamento nem os botões do controle remoto funcionam mais. Só resetando na placa do arduino o mesmo volta a funcionar.
E é aleatório as vezes no primeiro click as vezes no vigésimo as vezes no segundo não há muita lógica.
Não sei se ter que por algum delay, bom alguém já teve problema similar ou sabe o que poderia ser tentado?
Código do arduino abaixo:
//Sistema de Automacao//Daniel Diniz Arbulu#include <SPI.h>#include <Ethernet.h>#include <IRremote.h>#include <ArdOSC.h>
//Configurações do Ethernet Shieldbyte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };byte ip[] = { 192,168,0,22 }; // ip que o arduino assumirábyte gateway[] = { 192,168,0, 1 }; // ip do roteadorbyte subnet[] = { 255, 255, 255, 0 };
// String que representa o estado dos dispositivoschar Luz[7] = "0000L#";
EthernetServer server(8081); // Cria o servidor na porta 8081
IRsend irsend; //Objeto IRSendint i = 0;
// String onde é guardada as msgs recebidaschar msg[7] = "0000L#";
//MOBILEint serverPort = 8000; //define a porta de recepção do comando OSCint destPort= 9000; //define a porta de envio do comando OSCint flag=0;int flag2=0;
OSCServer server_mobile; //inicializa o servidor OSC (serviço que trata a recepção de mensagem OSC)OSCClient client_mobile;
void setup() { Serial.begin(9600); Ethernet.begin(mac, ip, gateway, subnet); server.begin(); server_mobile.begin(8000); server_mobile.addCallback("/ard/relePin",&func1); server_mobile.addCallback("/ard/btnVolMais",&func2); server_mobile.addCallback("/ard/btnVolMenos",&func3); server_mobile.addCallback("/ard/btnVolMenos2",&func3); pinMode(A0,OUTPUT); pinMode(A1,OUTPUT); pinMode(A2,OUTPUT); pinMode(A3,OUTPUT); // pinMode(A4,OUTPUT); // pinMode(A5,OUTPUT); digitalWrite(A0,LOW); digitalWrite(A1,LOW); digitalWrite(A2,LOW); digitalWrite(A3,LOW); }
void loop() { if(server_mobile.aviableCheck()>0) { Serial.println("Entrei no if do mobile!"); } EthernetClient client = server.available(); // SE receber um caracter... if (client) { // guarda o caracter na string 'msg' //msg[1]=msg[2]; msg[2]=msg[3]; msg[3]=msg[4]; msg[4]=msg[5]; msg[5]=msg[6]; //msg[6] = client.read(); for(int k = 1; k < 8; k++) { msg[k] = client.read(); } Serial.print("MSG 1:");Serial.println(msg[1]); Serial.print("MSG 2:");Serial.println(msg[2]); Serial.print("MSG 3:");Serial.println(msg[3]); Serial.print("MSG 4:");Serial.println(msg[4]); Serial.print("MSG 5:");Serial.println(msg[5]); Serial.print("MSG 6:");Serial.println(msg[6]); Serial.println(i++); Serial.println("============================="); if (msg[2]=='#') { Serial.println("Entrei no R#"); switch(msg[1]) { case 'R': // Se receber o comando 'R#' envia de volta o status dos // dispositivos. (Que é a string 'Luz') client.write(Luz); break; } } else if(msg[6]=='#') { Serial.println("Entrei no L#"); switch(msg[5]) { // case 'P': // // Caso P#, aciona o pino do portão pequeno por 1s. // digitalWrite(A4,HIGH); // delay(1000); // digitalWrite(A4,LOW); // break; // case 'G': // // Caso G#, aciona o pino do portão pequeno por 1s. // digitalWrite(A5,HIGH); // delay(1000); // digitalWrite(A5,LOW); // break; case 'L': // Caso L#, ele copia os 4 bytes anteriores p/ a // string 'Luz' e cada byte representa um // dispositivo, onde '1'=ON e '0'=OFF Luz[0]=msg[1]; Luz[1]=msg[2]; Luz[2]=msg[3]; Luz[3]=msg[4]; if (Luz[0]=='1') digitalWrite(A0,HIGH); else digitalWrite(A0,LOW); if (Luz[1]=='1') digitalWrite(A1,HIGH); else digitalWrite(A1,LOW); if (Luz[2]=='1') digitalWrite(A2,HIGH); else digitalWrite(A2,LOW); if (Luz[3]=='1') digitalWrite(A3,HIGH); else digitalWrite(A3,LOW); client.write(Luz); break; case 'C':
if (msg[4] == 'p') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DF10EF, 32); //Desligar TV delay(40); } } if (msg[4] == '+') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DF40BF, 32); //Subir volume delay(40); } } if (msg[4] == '-') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DFC03F, 32); //Descer volume delay(40); } } if (msg[4] == '/') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DF00FF, 32); //Subir canal delay(40); } } if (msg[4] == '*') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DF807F, 32); //Descer canal delay(40); } } if (msg[4] == 'i') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DFD02F, 32); //Input delay(40); } } if (msg[4] == 'a') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DF0CF3, 32); //Av Mode delay(40); } } if (msg[4] == '6') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DF609F, 32); //Direita menu delay(40); } } if (msg[4] == '4') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DFE01F, 32); //Esquerda menu delay(40); } } if (msg[4] == '8') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DF02FD, 32); //Cima menu delay(40); } } if (msg[4] == '5') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DF827D, 32); //Baixo menu delay(40); } } if (msg[4] == 'e') { for (int i = 0; i < 1; i++) { irsend.sendNEC(0x20DF22DD, 32); //Enter menu delay(40); } } client.write(Luz); break; } } }}
void func1(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/led2" recebido do ANDROID Serial.println("Antes da atividade!"); int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/led2" //digitalWrite(A0,value); //muda estado da porta digital 8 (ledPin2) conforme argumento OSC recebido //delay(40); //create new osc message OSCMessage txMes; //cria uma nova menssagem OSC //set destination ip address & port no txMes.setAddress(_mes->getIpAddress(),9000); //define o endereço e porta do destino da mensagem OSC txMes.beginMessage("/ard/relePin"); //define comando OSC txMes.addArgFloat(flag); //define no estado do led 2 que será enviado no argumento OSC para ANDROID if(flag==1){ flag=0; digitalWrite(A0, LOW); delay(100); } else{ flag=1; digitalWrite(A0, HIGH); delay(100); } txMes.addArgInt32(flag); Serial.println("Antes do envio da Mensagem!"); //send osc message client_mobile.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID Serial.println("Enviei a mensagem!");}
void func2(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/led2" recebido do ANDROID int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/led2" irsend.sendNEC(0x20DF40BF, 32); //Subir volume delay(40); //create new osc message OSCMessage txMes; //cria uma nova menssagem OSC //set destination ip address & port no txMes.setAddress(_mes->getIpAddress(),9000); //define o endereço e porta do destino da mensagem OSC txMes.beginMessage("/ard/btnVolMais"); //define comando OSC txMes.addArgFloat(flag); //define no estado do led 2 que será enviado no argumento OSC para ANDROID txMes.addArgInt32(flag); //send osc message client_mobile.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID Serial.println("Enviei a mensagem!"); }
void func3(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/led2" recebido do ANDROID int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/led2" irsend.sendNEC(0x20DFC03F, 32); //Descer volume delay(40); //create new osc message OSCMessage txMes; //cria uma nova menssagem OSC //set destination ip address & port no txMes.setAddress(_mes->getIpAddress(),9000); //define o endereço e porta do destino da mensagem OSC txMes.beginMessage("/ard/btnVolMenos"); //define comando OSC txMes.addArgFloat(flag); //define no estado do led 2 que será enviado no argumento OSC para ANDROID txMes.addArgInt32(flag); //send osc message client_mobile.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID }
…
Adicionado por Daniel Diniz ao 13:00 em 6 agosto 2014
.
Continuo tentando calibrar o sistema aqui mas está complicado...
Vejam o que já fiz:
Circuito do sensor (conectado pelo terminal verde de 3 vias; esta versão está com burden de 18ohm)
Ligação no Arduino + Ethernet shield (nesta versão usando a saída de 3.3v para o circuito do CT)
Calibração no código
emon1.current(3, 60); //porta, iCAL
double Irms = emon1.calcIrms(1480); // Calculate Irms only
watts = (Irms * 128); // Apparent power * 128; tensao da rede
OBS: O sensor já está pendurado na fase principal no quadro geral.
Abaixo alguns resultados que obtive:
- Medições feitas em aparelhos separados(luminárias e secador).
Configuração: Alimentação = USB do PC; Burden resistor = 33ohm; usando o pino de 5v do Arduino; Calibração no código(iCAL) = 60; Resultado: os valores mostrados bateram 90% com a potência de cada aparelho medido. OK.
- Ao plugar o sensor no quadro geral e deixar de usar a alimentação do Arduino via USB, os problemas começaram.
Configuração: Alimentação = fonte genérica de 9v/1A; Burden resistor = 33ohm; usando o pino de 5v do Arduino; Calibração no código(iCAL) = 60;
Resultado: com apenas umas 3 lâmpadas fluorescentes acesas em casa + o notebook + modem/router e geladeira OFF, não tinha como o consumo ser maior do que digamos, 300w no chute, mas o sistema me informava em torno de 500 a 600w.
Configuração: Voltei pra alimentação = USB do PC; Burden resistor = 33ohm; usando o pino de 5v do Arduino; Calibração no código(iCAL) = 60;
Resultado: com consumo residencial de 300w no chute, o sistema me informava em torno de 250 a 300w. Pra mim OK!
Como o intuito é usar o dispositivo alimentado pela entrada DC, fui pesquisar na internet e fiz algumas medições e alterações que encontrei indicadas no fórum do energymonitor.org.
- Medi a tensão nos pinos 3.3 e 5v do Arduino(sendo alimentado pela porta USB) e o pino de 3.3v deu 3.28v, enquanto o pino de 5v deu 3.64v.
- Medi a tensão nos pinos 3.3 e 5v do Arduino(alimentado por uma fonte de 6.5v/1A) e o pino de 3.3v deu 3.28v, enquanto o pino de 5v deu 4.5v.
Decidi então mudar o burden do circuito e passar a usar o pino de 3.3v pois era o que ficava mais estável ao trocar as fontes de energia.
Configuração: Alimentação = USB do PC; Burden resistor = 18ohm; usando o pino de 3.3v do Arduino; Calibração no código(iCAL) = 111;
Resultado: com consumo residencial de 300w no chute, o sistema me informava em torno de 250 a 300w. Pra mim OK!
Configuração: Alimentação = Fonte de 6.5v/1A; Burden resistor = 18ohm; usando o pino de 3.3v do Arduino; Calibração no código(iCAL) = 111;
Resultado: com consumo residencial de 300w no chute, o sistema me informava em torno de 800w; Voltei o iCAL para 60 e o resultado caiu para 450w; Valores que considerei irreais.
Agora vem o mais estranho: neste mesmo teste pluguei o cabo USB junto com a fonte de 6.5v já plugada e a medição caiu para 350w! (valor que considero mais aceitável para o momento)
Enfim, despluguei o cabo USB e a medição voltou para 450w; Liguei o chuveiro e subiu para 1850w. Considerei estes resultados irreais.
Sei que o post ficou grande e só quem tiver muita paciência e alguma experiência nesse projeto especificamente vai se interessar em responder, porém acho que seria de extrema importância para todos que querem iniciar neste circuito para evitar perder tanto tempo como tenho perdido...
Desde já deixo os agradecimentos a quem animar a se aventurar no meu caso.
Quem aí chuta o que pode estar acontecendo de errado no meu projeto?
Grande abraço!
PS: Claro, estou avaliando comprar ou pegar emprestado um alicate amperímetro pra medir a corrente real da minha rede pra poder comparar melhor com as medições do meu projeto e eliminar essa fonte de dúvidas.…
Adicionado por Bruno Medina ao 15:52 em 27 novembro 2013
mplos que funcionam muito bem individualmente.
Um deles é o exemplo do próprio software do arduino (Exemplo > SD > ReadWrite) e o outro para o gps, segue abaixo...
Alguém pode me ajudar a desenvolver esse código? Não conheço muito de programação.
Muito obrigado a todos.
Abraços.
#---------- código para o GPS.
#include <string.h>#include <ctype.h>
int ledPin = 13; // LED test pin int rxPin = 0; // RX PIN int txPin = 1; // TX TX int byteGPS=-1; char linea[300] = ""; char comandoGPR[7] = "$GPRMC"; int cont=0; int bien=0; int conta=0; int indices[13];
void setup() { pinMode(ledPin, OUTPUT); // Initialize LED pin pinMode(rxPin, INPUT); pinMode(txPin, OUTPUT); Serial.begin(9600); for (int i=0;i<300;i++){ // Initialize a buffer for received data linea[i]=' '; } }
void loop() { digitalWrite(ledPin, HIGH); byteGPS=Serial.read(); // Read a byte of the serial port if (byteGPS == -1) { // See if the port is empty yet } else { linea[conta]=byteGPS; // If there is serial port data, it is put in the buffer conta++; Serial.print(byteGPS, BYTE); if (byteGPS==13){ // If the received byte is = to 13, end of transmission digitalWrite(ledPin, LOW); cont=0; bien=0; for (int i=1;i<7;i++){ // Verifies if the received command starts with $GPR if (linea[i]==comandoGPR[i-1]){ bien++; } } if(bien==6){ // If yes, continue and process the data for (int i=0;i<300;i++){ if (linea[i]==','){ // check for the position of the "," separator indices[cont]=i; cont++; } if (linea[i]=='*'){ // ... and the "*" indices[12]=i; cont++; } } Serial.println(""); // ... and write to the serial port Serial.println(""); Serial.println("$---------------"); for (int i=0;i<12;i++){ switch(i){ case 0 :Serial.print("Time in UTC (HhMmSs): ");break; case 1 :Serial.print("Status (A=OK,V=KO): ");break; case 2 :Serial.print("Latitude: ");break; case 3 :Serial.print("Direction (N/S): ");break; case 4 :Serial.print("Longitude: ");break; case 5 :Serial.print("Direction (E/W): ");break; case 6 :Serial.print("Velocity in knots: ");break; case 7 :Serial.print("Heading in degrees: ");break; case 8 :Serial.print("Date UTC (DdMmAa): ");break; case 9 :Serial.print("Magnetic degrees: ");break; case 10 :Serial.print("(E/W): ");break; case 11 :Serial.print("Mode: ");break; case 12 :Serial.print("Checksum: ");break; } for (int j=indices[i];j<(indices[i+1]-1);j++){ Serial.print(linea[j+1]); } Serial.println(""); } Serial.println("$---------------"); delay(1000); } conta=0; // Reset the buffer for (int i=0;i<300;i++){ // linea[i]=' '; } } } }
#------- leitura e escrita no cartão
/* SD card read/write This example shows how to read and write data to and from an SD card file The circuit: * SD card attached to SPI bus as follows: ** MOSI - pin 11 ** MISO - pin 12 ** CLK - pin 13 ** CS - pin 4 created Nov 2010 by David A. Mellis updated 2 Dec 2010 by Tom Igoe This example code is in the public domain. */ #include <SD.h>
File myFile;
void setup(){ Serial.begin(9600); Serial.print("Initializing SD card..."); // On the Ethernet Shield, CS is pin 4. It's set as an output by default. // Note that even if it's not used as the CS pin, the hardware SS pin // (10 on most Arduino boards, 53 on the Mega) must be left as an output // or the SD library functions will not work. pinMode(10, OUTPUT); if (!SD.begin(4)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); // open the file. note that only one file can be open at a time, // so you have to close this one before opening another. myFile = SD.open("test.txt", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { Serial.print("Writing to test.txt..."); myFile.println("testing 1, 2, 3."); // close the file: myFile.close(); Serial.println("done."); } else { // if the file didn't open, print an error: Serial.println("error opening test.txt"); } // re-open the file for reading: myFile = SD.open("test.txt"); if (myFile) { Serial.println("test.txt:"); // read from the file until there's nothing else in it: while (myFile.available()) { Serial.write(myFile.read()); } // close the file: myFile.close(); } else { // if the file didn't open, print an error: Serial.println("error opening test.txt"); }}
void loop(){ // nothing happens after setup}
…
Adicionado por sergio silva ao 19:56 em 13 fevereiro 2012
conseguimos achar a solução neste site e venho pedir ajuda... ao incluir a nova rotina alarme utilizando sensor ultrassonico segue o codigo abaixo da erro de compilçao e alem do mais... nao consigo nem mesmo "incluir a rotina" sendo que tenho mais uma que eh o motor que vo utilizar para o portao da garagem
segue o codigo abaixo em anexo o arquivo ino... e pra quem nao tem o arduino irei postar no corpo desta mensagem, o motor da garagem nao esta incluido pois a primeira dificuldade veio o ultrassonico simulando o alarme e incluindo na minha rotina do programa principal é o que estou tendo problemas
#include <SPI.h>
#include <String.h>
#include <Ethernet.h>
#include <Ultrasonic.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x9B, 0x36};// Endereço Macbyte ip[] = {192, 168, 1, 177 };// Endereço de Ip ArduinoEthernetServer server(8090);// Porta de serviço
int cozinha = 7; // wifi
int sala = 3; // wifi
int quarto2 = 6;
int quarto = 2;
int cooler1 = 5;
int cooler2 = 4;
int portao = 8;
Ultrasonic ultrasonic(9, 10);const int alarme1 = 11;const int alarme2 = 12;long microsec = 0;float distanciaCM = 0;
String readString = String(30);// string para buscar dados de endereço
boolean statusQuarto = false;
boolean statusSala = false;
boolean statusQuarto2 = false;
boolean statusCozinha = false;
boolean statusCooler1 = false;
boolean statusCooler2 = false;
boolean statusPortao = false;
boolean statusAlarme = false;
// Variável para o status do portão
void setup(){
// Inicia o Ethernet
Ethernet.begin(mac, ip);
// Define os pinos como saída
pinMode(quarto, OUTPUT);
pinMode(sala, OUTPUT);
pinMode(quarto2, OUTPUT);
pinMode(cozinha, OUTPUT);
pinMode(cooler1, OUTPUT);
pinMode(cooler2, OUTPUT);
pinMode(portao, OUTPUT);
pinMode(alarme1, OUTPUT);
pinMode(alarme2, OUTPUT);
// Inicia a comunicação Serial
Serial.begin(9600); BuzzerDistancia();}
void loop(){ microsec = ultrasonic.timing(); distanciaCM = ultrasonic.convert(microsec, Ultrasonic::CM);
BuzzerDistancia();
Serial.print(distanciaCM); Serial.println(" cm"); delay(1);}
void BuzzerDistancia(){
digitalWrite(alarme1, LOW); digitalWrite(alarme2, LOW);}
// Criar uma conexão de cliente
EthernetClient client = server.available();
if (client){
while (client.connected())
{
if (client.available())
{
char c = client.read();
// ler caractere por caractere vindo do HTTP
if (readString.length() < 30)
{
// armazena os caracteres para string
readString += (c);
}
//se o pedido HTTP terminou
if (c == '\n')
{
// vamos verificar se a lâmpada da área deve ser ligada
// Se a string possui o texto L=Ligar
{
// vamos verificar se a lâmpada da sala deve ser ligada
// Se a string possui o texto L=Ligar
if (readString.indexOf("LigarSala") >= 0)
{
// A lâmpada vai ser ligada
digitalWrite(sala, HIGH);
statusSala = true;
}
// Se a string possui o texto L=Desligar
if (readString.indexOf("DesligarSala") >= 0)
{ // A lâmpada vai ser desligada
digitalWrite(sala, LOW);
statusSala = false;
}
{
// vamos verificar se a lâmpada do quarto2 deve ser ligada
// Se a string possui o texto L=Ligar
if (readString.indexOf("LigarQuarto2") >= 0)
{
// A lâmpada vai ser ligada
digitalWrite(quarto2, HIGH);
statusQuarto2 = true;
}
// Se a string possui o texto L=Desligar
if (readString.indexOf("DesligarQuarto2") >= 0)
{
// A lâmpada vai ser desligada
digitalWrite(quarto2, LOW);
statusQuarto2 = false;
}
if (readString.indexOf("LigarQuarto") >= 0)
{
// A lâmpada vai ser ligada
digitalWrite(quarto, HIGH);
statusQuarto = true;
}
// Se a string possui o texto L=Desligar
if (readString.indexOf("DesligarQuarto") >= 0)
{
// A lâmpada vai ser desligada
digitalWrite(quarto, LOW);
statusQuarto = false;
}
{
// vamos verificar se a lâmpada da cozinha deve ser ligada
// Se a string possui o texto L=Ligar
if (readString.indexOf("LigarCozinha") >= 0)
{
// A lâmpada vai ser ligada
digitalWrite(cozinha, HIGH);
}
// Se a string possui o texto L=Desligar
if (readString.indexOf("DesligarCozinha") >= 0)
{
// A lâmpada vai ser desligada
digitalWrite(cozinha, LOW);
statusCozinha = false; }
{
if (readString.indexOf("LigarCooler1") >= 0)
{
// A lâmpada vai ser ligada
digitalWrite(cooler1, HIGH);
statusCooler1 = true;
}
// Se a string possui o texto L=Desligar
if (readString.indexOf("DesligarCooler1") >= 0)
{ // A lâmpada vai ser desligada
digitalWrite(cooler1, LOW);
statusCooler1 = false;
}
{
if (readString.indexOf("LigarCooler2") >= 0)
{
// A lâmpada vai ser ligada
digitalWrite(cooler2, HIGH);
statusCooler2 = true;
}
// Se a string possui o texto L=Desligar
if (readString.indexOf("DesligarCooler2") >= 0)
{ // A lâmpada vai ser desligada
digitalWrite(cooler2, LOW);
statusCooler2 = false;
}
{
if (readString.indexOf("LigarPortao") >= 0)
{
// A lâmpada vai ser ligada
digitalWrite(portao, HIGH);
statusPortao = true;
}
// Se a string possui o texto L=Desligar
if (readString.indexOf("DesligarPortao") >= 0)
{ // A lâmpada vai ser desligada
digitalWrite(portao, LOW);
statusPortao = false;
}
{ if (readString.indexOf("LigarAlarme") >= 0)
{
if (distanciaCM < 100) { digitalWrite(alarme1, HIGH); digitalWrite(alarme2, HIGH); statusAlarme = true; } }
{ if (readString.indexOf("DesligarAlarme") >= 0)
{ void BuzzerDistancia() { digitalWrite(alarme1, LOW); digitalWrite(alarme2, LOW); statusAlarme = false; } }
// dados HTML de saída começando com cabeçalho padrão
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.println("<font size='20'>");
if (statusQuarto) {
client.print("lampada quarto ligada");
} else {
client.print("lampada quarto desligada");
}
//limpa string para a próxima leitura
readString = "";
// parar cliente
client.stop();
} } } } } } } } } } }}}…
Adicionado por Lucas Ascêncio ao 14:53 em 8 outubro 2014
irene, bomba da piscina.
O simulador de presença fica acendendo e apagando as lampadas do quarto e do banheiro automaticamente, simulando que tem gente em casa.
O alerta via e-mail envia um e-mail automaticamente quando o alarme é disparado.
Os botoes Live Cam e SD-Card é para acessar minha camera de segurança wireless que tenho instalado em casa. Nao tem nenhuma ligação com o arduino. O botao apenas abre a pagina da camera.
O app Android foi feito pelo AppInventor, programa free. O app é simples... os comandos enviados ao arduino foram todos feitos por acesso html, conforme podem conferir no void iniciaweb().
No Protoboard:
https://www.youtube.com/watch?v=vRrjNKAArxw
Projeto montado na caixa:
https://www.youtube.com/watch?v=VcOf7QJpYoY
/* SISTEMA DE ALARME E SIMULADOR DE PRESENÇA RESISTENCIAL COM MONITORAMENTO REMOTO VIA ANDROID APP E ALERTA VIA E-MAIL Creditos: jose miguel fernandes / http://labdegaragem.com/
Feito por: Mário Rodrigues Sobral / mr.sobral@hotmail.com Biblioteca DS1307: https://drive.google.com/file/d/0B5Yz9vPsQ2_ObVJfSFM0ZVF6Wkk/view?usp=sharing */ #include <SPI.h> #include <Ethernet.h> #include <Wire.h> #include <DS1307.h> #include <EthernetClient.h> #define time 1000
//RTC char dateTime[20]; int HoraAtiva[6]; int RTCValues[7];
//Nomeia portas do Arduino int pinalarmefrente = 5; int pinalarmetras = 4; int pinquarto = 6; int pinbanheiro = 7; int pinpiscina = 8; int pinsirene = 9;
//Nomeia Variaveis int estadoalarme = 1; int estadosimulador = 1; int estadoquarto = 0; int estadobanheiro = 0; int estadopiscina = 0; int estadosirene = 0;
int sensorfrente = 0; //variavel para gravar o nivel de sinal do sensor int sensortras = 0; //variavel para gravar o nivel de sinal do sensor int SSalarme = 60; //variavel para guardar o segundo atual que o sensor detectou movimento. Nenhum movimento = 60. int MMpiscina = 60; //variavel para guardar o minuto atual para ligar a bomba.
boolean incoming = 0;
//Configura Ethernet Shield byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //troque pelo mac do seu shield IPAddress ip(192,168,1,100); EthernetServer server(2015); //PORTA DO SERVIDOR WEB. P/ ABRIR, DIGITAR NO NAVEGADOR O IP DO ARDUINO SEGUIDO DA PORTA: http://192.168.1.:2015 byte mailserver[] = { 200, 147, 99, 132 }; // Colocar o ip do servidor SMTP. Testado com smtp do Hotmail, Gmail e BOL. Apenas BOL funcionou. EthernetClient clientmail;
void setup() { //Inicializamos o monitoramento serial e configuramos saídas Serial.begin(9600); Serial.println("Configurando portas e sensores..."); pinMode(pinalarmefrente,INPUT); pinMode(pinalarmetras,INPUT); pinMode(pinquarto,OUTPUT); pinMode(pinbanheiro,OUTPUT); pinMode(pinpiscina,OUTPUT); pinMode(pinsirene,OUTPUT); DS1307.begin(); delay(120000); //aguarda 2 minutos para os sensores estabilizarem Serial.println("Pronto!"); // Inicializamos o Ethernet Shield Ethernet.begin(mac, ip); server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); }
//VOID LOOP INFINITO PADRÃO void loop() { DS1307.getDate(RTCValues); //BUSCA A HORA ATUAL NO RTC DS1307.getDate(RTCValues); sprintf(dateTime, "%02d-%02d-20%02d - %02d:%02d:%02d", RTCValues[2], RTCValues[1], RTCValues[0], RTCValues[4], RTCValues[5], RTCValues[6]); /* Mostra data no leitor USB Serial.print(dateTime); Serial.print(" - day of week: "); Serial.println(RTCValues[3]); delay(900); */ //Coloca o void alarme e simulador em açao if(estadoalarme == 1) { alarme(); } if(estadosimulador == 1) { simulador(); } if(estadopiscina == 11) { piscina1h(); } iniciaweb(); }
//***************************************************************************// // INICIA WEBPAGE void iniciaweb() { EthernetClient clientweb = server.available(); if (clientweb) { boolean currentLineIsBlank = true; String str; // Executa enquanto usuario estiver conectado no site while (clientweb.connected()) { if (clientweb.available()) { char c = clientweb.read(); str.concat(c); if(str.endsWith("/ATIVAALARME")) estadoalarme =1; else if(str.endsWith("/DESATIVAALARME")) estadoalarme =0; if(str.endsWith("/ATIVASIMULADOR")) estadosimulador =1; else if(str.endsWith("/DESATIVASIMULADOR")) estadosimulador =0; if(str.endsWith("/LIGAQUARTO")) estadoquarto =1; else if(str.endsWith("/DESLIGAQUARTO")) estadoquarto =0; if(str.endsWith("/LIGABANHEIRO")) estadobanheiro =1; else if(str.endsWith("/DESLIGABANHEIRO")) estadobanheiro =0; if(str.endsWith("/LIGAPISCINA")) estadopiscina =1; else if(str.endsWith("/DESLIGAPISCINA")) estadopiscina =0; if(str.endsWith("/LIGAPISCINA1H")) estadopiscina =2; if(str.endsWith("/LIGASIRENE")) estadosirene =1; else if(str.endsWith("/DESLIGASIRENE")) estadosirene =0; //Executa somente quando recebe uma solicitação HTTP (abre/atualiza pagina) if (c == '\n' && currentLineIsBlank) { clientweb.println("HTTP/1.1 200 OK"); clientweb.println("Content-Type: text/html"); clientweb.println();
if(estadoalarme == 1) { clientweb.println("Alarme ON" ); } else if (estadoalarme == 0) { clientweb.println("AlarmeOFF" ); if(estadosirene == 0) //evita que desligue a sirene quando queremos liga-la enquanto o alarme está desligado { digitalWrite(pinsirene, LOW); } } if(estadosimulador == 1) { clientweb.println("Simulador ON" ); } else if (estadosimulador == 0) { clientweb.println("SimuladorOFF" ); } if(estadoquarto == 1) { clientweb.println("Quarto ON"); digitalWrite(pinquarto, HIGH); } else if (estadoquarto == 0) { clientweb.println("QuartoOFF" ); digitalWrite(pinquarto, LOW); } if(estadobanheiro == 1) { clientweb.println("Banheiro ON" ); digitalWrite(pinbanheiro, HIGH); } else if (estadobanheiro == 0) { clientweb.println("BanheiroOFF" ); digitalWrite(pinbanheiro, LOW); } if(estadopiscina == 1) { clientweb.println("Piscina ON" ); digitalWrite(pinpiscina, HIGH); } else if (estadopiscina == 0) { clientweb.println("PiscinaOFF" ); digitalWrite(pinpiscina, LOW); } else if (estadopiscina == 2) //mudamos de 2 pra 11 porque se continuasse 2, ela ficaria sempre pegando o minuto atual { clientweb.println("Piscina1ON" ); MMpiscina = RTCValues[5]; --MMpiscina; if (SSalarme == -1) //garantir que nunca vai ficar com segundo -1, oque deixaria a sirene ligada enternamente { SSalarme = 59; } digitalWrite(pinpiscina, HIGH); estadopiscina = 11; } else if (estadopiscina == 11) //mudamos de 2 pra 11 porque se continuasse 2, ela ficaria sempre pegando o minuto atual { clientweb.println("Piscina1ON" ); } if(estadosirene == 1) { clientweb.println("Sirene ON" ); digitalWrite(pinsirene, HIGH); } else if (estadosirene == 0) { clientweb.println("SireneOFF" ); digitalWrite(pinsirene, LOW); } //Imprime hora atual no site clientweb.println("/ HORA ATUAL"); clientweb.println(RTCValues[4]); clientweb.println(":"); clientweb.println(RTCValues[5]); clientweb.println(":"); clientweb.println(RTCValues[6]); clientweb.println(" ."); break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1); clientweb.stop();// close the connection: }
} //***************************************************************************//
//***************************************************************************// //ENVIA ALERTA DE E-MAIL void envia() { delay(time); Serial.println("conectando..."); if (clientmail.connect(mailserver, 587)) // Porta de conexao do servidor do email. { Serial.println("conectado!"); Serial.println("enviando email"); Serial.println(); clientmail.println("EHLO localhost"); recebe(); delay(time); clientmail.println("AUTH LOGIN"); recebe(); delay(time); clientmail.println("YXJk?????????tLmJy"); // Email de login codificado em base de 64: http://base64-encoder-online.waraxe.us/ recebe(); delay(time); clientmail.println("TV???????Nio="); // Senha do email codificado em base de 64: http://base64-encoder-online.waraxe.us/ recebe(); delay(time); clientmail.println("mail from: <arduinosobral@bol.com.br>"); //Email remetente recebe(); delay(time); clientmail.println("rcpt to: <mr.sobral@hotmail.com>"); // Email destinatário recebe(); delay(time); clientmail.println("data"); recebe(); delay(time); clientmail.println("Subject: SOS HOME SOBRAL - Alarme disparado!"); // Assunto recebe(); delay(time); if (sensorfrente == LOW) { clientmail.println("O alarme da FRENTE foi ativado em: "); // Corpo } else { clientmail.println("O alarme de TRAS foi ativado em: "); // Corpo } clientmail.println(dateTime); recebe(); delay(time); clientmail.println("."); // Indica fim do email. recebe(); delay(time); clientmail.println(); recebe(); delay(time); Serial.println("email enviado!"); delay(time); if (clientmail.connected()) // Desconecta pra deixar pronto para novo envio. { Serial.println(); // Serial.println("desconectando..."); clientmail.stop(); Serial.println(); Serial.println(); } } /* else { Serial.println("connection failed"); } Serial.println("Ready. Press 'e' to connect.");*/ } //MONITORA ALERTA DE E-MAIL void recebe() { while (clientmail.available()) { char c = clientmail.read(); Serial.print(c); } } //***************************************************************************//
//***************************************************************************// //ALARME - Os sensores ficam sempre HIGH. Quando detectam movimento, cortam o sinal (LOW) void alarme() { sensorfrente = digitalRead(pinalarmefrente); sensortras = digitalRead(pinalarmetras); if ((sensorfrente == LOW)||(sensortras == LOW)) { if (estadosirene == 0) { envia(); } digitalWrite(pinsirene, HIGH); estadosirene = 1; SSalarme = RTCValues[6]; --SSalarme; //subtrai 1 do segundo recebido do rtc, pra garantir que nao vai ligar e logo em seguida desligar, devido à velocidade do loop } if (SSalarme == RTCValues[6]) { digitalWrite(pinsirene, LOW); estadosirene = 0; SSalarme = 60; //coloca um valor que nunca existirá no ssalarme pra nao ficar desligando a sirene em vão no proximo loop. } if (SSalarme == -1) //garantir que nunca vai ficar com segundo -1, oque deixaria a sirene ligada enternamente { SSalarme = 59; } } //***************************************************************************//
//***************************************************************************// //LIGA PISCINA E MONITORA PRA DESLIGAR APOS 1H void piscina1h() { if (MMpiscina == RTCValues[5]) { digitalWrite(pinpiscina, LOW); estadopiscina = 0; MMpiscina = 60; //coloca um valor que nunca existirá no ssalarme pra nao ficar desligando a sirene em vão no proximo loop. } } //***************************************************************************//
//***************************************************************************// //VOID USADO PELO SIMULADOR DE PRESENÇA //Compara a hora do simulador com a hora atual e executa a açao void MudaDispositivo(byte dispositivo, byte estado, byte hora, byte minuto, byte segundo, int* HoraAtiva) { if (RTCValues[4] == hora && RTCValues[5] == minuto && RTCValues[6] == segundo) digitalWrite(dispositivo, estado); }
//VOID DO SIMULADOR DE PRESENÇA void simulador() { //Simula presença de noite MudaDispositivo(pinbanheiro, HIGH, 18, 40, 10, HoraAtiva); MudaDispositivo(pinbanheiro, LOW, 18, 43, 10, HoraAtiva); MudaDispositivo(pinquarto, HIGH, 18, 43, 20, HoraAtiva); MudaDispositivo(pinquarto, LOW, 18, 47, 10, HoraAtiva); MudaDispositivo(pinquarto, HIGH, 19, 50, 10, HoraAtiva); MudaDispositivo(pinquarto, LOW, 19, 52, 45, HoraAtiva); MudaDispositivo(pinquarto, HIGH, 20, 10, 10, HoraAtiva); MudaDispositivo(pinquarto, LOW, 20, 10, 40, HoraAtiva); MudaDispositivo(pinbanheiro, HIGH, 20, 10, 50, HoraAtiva); MudaDispositivo(pinbanheiro, LOW, 20, 11, 20, HoraAtiva); MudaDispositivo(pinquarto, HIGH, 20, 20, 50, HoraAtiva); MudaDispositivo(pinquarto, LOW, 20, 21, 20, HoraAtiva); MudaDispositivo(pinbanheiro, HIGH, 20, 45, 40, HoraAtiva); MudaDispositivo(pinbanheiro, LOW, 20, 46, 10, HoraAtiva); MudaDispositivo(pinquarto, HIGH, 21, 10, 10, HoraAtiva); MudaDispositivo(pinbanheiro, HIGH, 21, 10, 30, HoraAtiva); MudaDispositivo(pinbanheiro, LOW, 21, 15, 10, HoraAtiva); MudaDispositivo(pinquarto, LOW, 21, 16, 10, HoraAtiva); MudaDispositivo(pinquarto, HIGH, 22, 10, 10, HoraAtiva); MudaDispositivo(pinquarto, LOW, 22, 10, 50, HoraAtiva); //Simula colocar pijama e escovar os dentes MudaDispositivo(pinquarto, HIGH, 22, 40, 10, HoraAtiva); MudaDispositivo(pinbanheiro, HIGH, 22, 41, 10, HoraAtiva); MudaDispositivo(pinbanheiro, LOW, 22, 43, 10, HoraAtiva); MudaDispositivo(pinquarto, LOW, 22, 43, 30, HoraAtiva); MudaDispositivo(pinquarto, HIGH, 23, 40, 10, HoraAtiva); MudaDispositivo(pinbanheiro, HIGH, 23, 40, 30, HoraAtiva); MudaDispositivo(pinbanheiro, LOW, 23, 41, 20, HoraAtiva); MudaDispositivo(pinquarto, LOW, 23, 41, 40, HoraAtiva); //Simula presença de madrugada MudaDispositivo(pinquarto, HIGH, 2, 10, 10, HoraAtiva); MudaDispositivo(pinbanheiro, HIGH, 2, 10, 30, HoraAtiva); MudaDispositivo(pinbanheiro, LOW, 2, 11, 20, HoraAtiva); MudaDispositivo(pinquarto, LOW, 2, 11, 40, HoraAtiva); MudaDispositivo(pinquarto, HIGH, 4, 10, 10, HoraAtiva); MudaDispositivo(pinbanheiro, HIGH, 4, 10, 30, HoraAtiva); MudaDispositivo(pinbanheiro, LOW, 4, 11, 20, HoraAtiva); MudaDispositivo(pinquarto, LOW, 4, 11, 40, HoraAtiva); MudaDispositivo(pinquarto, HIGH, 6, 10, 10, HoraAtiva); MudaDispositivo(pinbanheiro, HIGH, 6, 10, 30, HoraAtiva); MudaDispositivo(pinbanheiro, LOW, 6, 11, 20, HoraAtiva); MudaDispositivo(pinquarto, LOW, 6, 11, 40, HoraAtiva); } //***************************************************************************//
…