fixos em variáveis que quando gravadas no arquino serão setadas no RTC.
Bem, o que eu queria era fazer um sketch onde atraves de um botão, eu pudesse alterar os horarios do sistema e ao final gravar no ci DS1307, mas não esta acontecendo, eu até altera o codigo, mas quando o programa volta a rodar no loop principal ele da todo doido, dai eu reinicio o arduino e nenhuma alteração foi gravada no 1307.
O que criei foi um sistema onde com apenas um botão dá pra mudar todas as configurações, baseado no tempo de pressionamento do botão.
No trecho do sketch abaixo a parte de edição de data e hora funciona inicialmente chamando os segundos, minutos, hora, etc e atribuindo a variaveis, depois essas variáveis vão ser chamadas uma a uma em um lcd 16x2 para serem editadas, se o botão for pressionado rapido(menos de 2 seg) ele acrescente mais um, se ao contrario o botão for pressionado por mais de 2 seg, um S de sair, aparece na tela, e ele vai para o proximo item a ser configurado.
Após configurar todas as variáveis, elas deveriam ser gravadas no DS1307, mas isso não esta acontecendo.
Alguem ai pode em ajudar ?
void menuopcao3(){ // ************************** EDITA A DATA E HORA DO SISTEMAWire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS, 7); segundos = ConverteparaDecimal(Wire.read()); minutos = ConverteparaDecimal(Wire.read()); horas = ConverteparaDecimal(Wire.read() & 0b111111); diadasemana = ConverteparaDecimal(Wire.read()); diadomes = ConverteparaDecimal(Wire.read()); mes = ConverteparaDecimal(Wire.read()); ano = ConverteparaDecimal(Wire.read());segundos = 30; // os segundos é um valor fixo, não editável por questão de ganho de tempo.lcd.setCursor(0,0); // *************************** Edita MINUTOS do tempolcd.print(" ");lcd.setCursor(0,1); lcd.print(" ");lcd.setCursor(0,0); lcd.print("AJUSTE MINUTOS");int sairlaco = 0; while(sairlaco==0){ lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print(minutos); delay(100); if(digitalRead(12)==1){ primeirotempo=millis(); while(digitalRead(12)==1){ int tempopressionado= millis() - primeirotempo; if(tempopressionado < 2000){ minutos++; delay(200); if(minutos > 59){minutos=0;} } else{sairlaco=1; lcd.setCursor(9,2); lcd.print("S");} }}} // fim do Edita MINUTOS do tempolcd.setCursor(0,0); // *************************** Edita HORAS do tempolcd.print(" ");lcd.setCursor(0,1); lcd.print(" ");lcd.setCursor(0,0); lcd.print("AJUSTE HORAS");sairlaco = 0; while(sairlaco==0){ lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print(horas); delay(100); if(digitalRead(12)==1){ primeirotempo=millis(); while(digitalRead(12)==1){ int tempopressionado= millis() - primeirotempo; if(tempopressionado < 2000){ horas++; delay(200); if(horas > 23){horas=0;} } else{sairlaco=1; lcd.setCursor(9,2); lcd.print("S");} }}} // fim do Edita HORAS do tempolcd.setCursor(0,0); // *************************** Edita DIA DA SEMANA do tempolcd.print(" ");lcd.setCursor(0,1); lcd.print(" ");lcd.setCursor(0,0); lcd.print("AJUSTE DIA/SEMANA");sairlaco = 0; while(sairlaco==0){ lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); switch(diadasemana){ case 0:lcd.print("Domingo "); break; case 1:lcd.print("Segunda "); break; case 2:lcd.print("Terca "); break; case 3:lcd.print("Quarta "); break; case 4:lcd.print("Quinta "); break; case 5:lcd.print("Sexta "); break; case 6:lcd.print("Sabado "); } delay(100); if(digitalRead(12)==1){ primeirotempo=millis(); while(digitalRead(12)==1){ int tempopressionado= millis() - primeirotempo; if(tempopressionado < 2000){ diadasemana++; delay(200); if(diadasemana > 6){diadasemana=0;} } else{sairlaco=1; lcd.setCursor(9,2); lcd.print("S");} }}} // fim do Edita DIA DA SEMANA do tempolcd.setCursor(0,0); // *************************** Edita DIA DO MES do tempolcd.print(" ");lcd.setCursor(0,1); lcd.print(" ");lcd.setCursor(0,0); lcd.print("AJUSTE DIA/MES");sairlaco = 0; while(sairlaco==0){ lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print(diadomes); delay(100); if(digitalRead(12)==1){ primeirotempo=millis(); while(digitalRead(12)==1){ int tempopressionado= millis() - primeirotempo; if(tempopressionado < 2000){ diadomes++; delay(200); if(diadomes > 31){diadomes=1;} } else{sairlaco=1; lcd.setCursor(9,2); lcd.print("S");} }}} // fim do Edita DIA DO MES do tempolcd.setCursor(0,0); // *************************** Edita MES do tempolcd.print(" ");lcd.setCursor(0,1); lcd.print(" ");lcd.setCursor(0,0); lcd.print("AJUSTE O MES");sairlaco = 0; while(sairlaco==0){ lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); switch(mes){ case 1:lcd.print("Janeiro "); break; case 2:lcd.print("Fevereiro "); break; case 3:lcd.print("Marco "); break; case 4:lcd.print("Abril "); break; case 5:lcd.print("Maio "); break; case 6:lcd.print("Junho "); break; case 7:lcd.print("Julho "); break; case 8:lcd.print("Agosto "); break; case 9:lcd.print("Setembro "); break; case 10:lcd.print("Outubro "); break; case 11:lcd.print("Novembro "); break; case 12:lcd.print("Dezembro "); } delay(100); if(digitalRead(12)==1){ primeirotempo=millis(); while(digitalRead(12)==1){ int tempopressionado= millis() - primeirotempo; if(tempopressionado < 2000){ mes++; delay(200); if(mes > 12){mes=1;} } else{sairlaco=1; lcd.setCursor(9,2); lcd.print("S");} }}} // fim do Edita MES do tempolcd.setCursor(0,0); // *************************** Edita ANO do tempolcd.print(" ");lcd.setCursor(0,1); lcd.print(" ");lcd.setCursor(0,0); lcd.print("AJUSTE ANO max50");sairlaco = 0; while(sairlaco==0){ lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(0,1); lcd.print(ano); delay(100); if(digitalRead(12)==1){ primeirotempo=millis(); while(digitalRead(12)==1){ int tempopressionado= millis() - primeirotempo; if(tempopressionado < 2000){ ano++; delay(200); if(ano > 50){ano=14;} } else{sairlaco=1; lcd.setCursor(9,2); lcd.print("S");} }}} // fim do Edita ANO do tempoWire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); //Stop no CI para que o mesmo possa receber os dados Wire.write(ConverteParaBCD(segundos)); Wire.write(ConverteParaBCD(minutos)); Wire.write(ConverteParaBCD(horas)); Wire.write(ConverteParaBCD(diadasemana)); Wire.write(ConverteParaBCD(diadomes)); Wire.write(ConverteParaBCD(mes)); Wire.write(ConverteParaBCD(ano));// Wire.write(zero); //Start no CI Wire.endTransmission(); }//******************************************** FIM DA opcao 3 em edicao…
Adicionado por Weider Duarte ao 1:16 em 11 agosto 2014
a atraves de sms.
O modulo gsm que estou utilizando e um SM5100B-D
Segue o codigo arduino que ja realizei. ALGUEM ME PODERIA AJUDAR
#include <SoftwareSerial.h>#include <LiquidCrystal.h>#include <Wire.h>#include "RTClib.h"#include <EEPROMex.h>#include <EEPROMvar.h>
//.....................Variáveis para guardar comandos emitidos pelo modulo...char listacomandos[10][55];int numerocomando = 0;boolean comandoencontrado = false;
//.....................SETUP terminado........................................boolean pronto = false;
//.....................ESTADO FINAL...........................................boolean erro = false;
//.....................Modulo gsm................SoftwareSerial cell(2,3); // - Pino 2 ARDUINO == RX Pino 3 ARDUINO == TX.//............................................................................//.....................Define o RTC_DS1307....................................RTC_DS1307 RTC;//............................................................................//...................Declaração das variáveis.................................const int maxAllowedWrites = 20;const int memBase = 120;int addressFloat;int S=0;int MIN=0;int H=0;int D=0;int Mes=0;int Uaux;int Iaux;int cont=0;byte value;const int AnalogPin = A1;float Umaxarduino = 5;float Uin = 1023;float V_sensor, I_instantaneo, A, Vrms, I_eficaz,Aparente;float Energia, Energial, Potencia, Energia_Total;float Tensao_eficaz = 230.0;int P;int k;//............................................................................
//............................................................................void setup(){ Serial.begin(9600); cell.begin(9600); Wire.begin(); RTC.begin(); Serial.print("A iniciar modulo GSM"); cell.print("AT+CFUN=1,1\r"); // 1º Faz o REBOOT do módulo colheComandos(); // 2º Colhe os comandos emitidos pelo módulo for(int i=0;i<numerocomando;i++) Serial.println(listacomandos[i]);
Serial.print("OK"); delay(1000); analisaComandos(); // 3º Analisa a informação // SMS no modo TEXTO cell.print("AT+CMGF=1\r"); // Telefone do recipiente... cell.print("AT+CMGS=\"+351936015412\"\r"); cell.print("A sua Contagem de Energia via gsm teve inicio agora.\x1A"); cell.print("AT+CMSS=1\r"); Serial.println("Mensagem Enviada"); Serial.println(); delay(1000); //.....................Lê o que esta gravado na EEPROM e ==Energia............double output=0.0;output=EEPROM.readFloat(addressFloat);Energia=output;
//............................................................................//.......................Se o RTC não funciona da erro/atualiza a data e hora. if (! RTC.isrunning()) { Serial.println("RTC deixou de FUNCIONAR!"); // Actualiza a data e hora pelo tempo que foi compilado.............................. RTC.adjust(DateTime(__DATE__, __TIME__)); }//............................................................................}//----------------------------------------------------------------------------// Função: analisaComandos()// Descodifica o eco enviado pelo módulo//----------------------------------------------------------------------------void analisaComandos(){ if(strcmp(listacomandos[0],"+SIND: 0")==0){ Serial.print("Erro no SIM "); for(;;); } else if (strcmp(listacomandos[0],"+SIND: 1")==0){ Serial.print(" Cartao SIM... OK "); } else { Serial.print(" Erro no Modulo "); for(;;); } delay(1000); if (strcmp(listacomandos[numerocomando-1],"+SIND: 4")==0){ Serial.print("- Inicializado - "); } else { Serial.print(" Erro: Reinicie "); for(;;); } delay(1000);}//----------------------------------------------------------------------------// Função: colheComandos()// Guarda em listacomandos[] o conjunto de ecos emitidos pelo modulo//----------------------------------------------------------------------------void colheComandos(){ static unsigned long watchdog = 0; static unsigned long tempoinicial = millis(); while(watchdog < 30000){ // Previne que o sistema fique em ciclo infinito leComando(); watchdog = millis() - tempoinicial; }}
//----------------------------------------------------------------------------//Função: leComando()// Implementa máquina de estados para detectar comando enviado pelo GSM//----------------------------------------------------------------------------void leComando(){ static int i = 0; static byte estado = 0; static char letra; if (cell.available() > 0){ char letra = cell.read();//****************************************************************************// MÁQUINA DE ESTADOS//**************************************************************************** if(estado == 0 && letra == 13) estado = 1; // Aguarda pelo linefeed else if (estado == 1 && letra == 10) estado = 2; // Detecta inicio do comando else if (estado == 2 && letra > 31) estado = 3; // Lê novo comando else if (estado == 3 && letra == 13) estado = 4; // Detecta fim do comando else if (estado == 4 && letra == 10) estado = 0; // Aguarda novo comando//****************************************************************************// LÊ COMANDO//**************************************************************************** if (estado == 3){ comandoencontrado = false; listacomandos[numerocomando][i] = letra; listacomandos[numerocomando][i+1] = '\0'; i++; } else if (estado == 4){ Serial.print("*"); // Apresenta um "progress bar" comandoencontrado = true; numerocomando++; i=0; } }}//----------------------------------------------------------------------------// Fim: leComando()//---------------------------------------------------------------------------- void loop() { if(cell.available() > 0) { Serial.print((char)cell.read()); } if(Serial.available() > 0) { cell.print((char)Serial.read()); }//----------------------------------------------------------------------------// Relógio//----------------------------------------------------------------------------
DateTime now = RTC.now(); Serial.print("Data:"); Serial.print(now.year(),DEC); Serial.print('/'); Serial.print(now.month(),DEC); Serial.print('/'); Serial.print(now.day(),DEC); Serial.print(' '); Serial.print("Hora:"); Serial.print(now.hour(),DEC); Serial.print(':'); Serial.print(now.minute(),DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); delay(3000);//----------------------------------------------------------------------------// Fim de relógio e mostra serial//----------------------------------------------------------------------------
delay(20); leitura(); // Função contabiliza a energia//----------------------------------------------------------------------------// Grava e envia sms//----------------------------------------------------------------------------//.....................Declaração de variáveis para comparação................ S = now.second(), DEC; MIN = now.minute(), DEC; H = now.hour(), DEC; D = now.day(), DEC; Mes = now.month(), DEC;//............................................................................//..................... Gravar na EEPROM ..................................... if(MIN==30 && S==10 ) { if(H==9 || H==13 || H==16 || H==22) { double input =Energia_Total; EEPROM.writeFloat(addressFloat,input); } }//............................................................................//.....................Enviar sms com a contagem.............................. //if(D==1 && H==10 && MIN==28 && S==0) //{
{ // SMS no modo TEXTO cell.print("AT+CMGF=1\r"); // Telemovel receptor... cell.print("AT+CMGS=\"+351936015412\"\r"); cell.print(" A sua Contagem de Energia e a seguinte:\x1A"); seria aqui que teria que inserir o valor da energia total para receber no celular. cell.print("AT+CMSS=1\r"); delay (1000); } //}//............................................................................//----------------------------------------------------------------------------// Fim de Grava e envia sms//----------------------------------------------------------------------------}//----------------------------------------------------------------------------// Função:leitura()// contabilização da energia elétrica e mostra o resultado na serial//---------------------------------------------------------------------------- void leitura(){ A=0; P=0; Iaux=0; for (k=0;k<1000;k++) // definição para o numero de amostras { V_sensor = analogRead(AnalogPin); // leitura da tensao do sensor de corrente I_instantaneo =(V_sensor*Umaxarduino/Uin)-2.5;// conversao dos valores da porta analogica para volts, ajuste da tensao continua para 0 A+=pow(I_instantaneo,2); // soma de todas as amostras. Iaux=Iaux+I_instantaneo; Uaux=230; delay(1); } Vrms=sqrt(A/1000); // calculo valor medio quadratico I_eficaz=Vrms/0.066; // sensibilidade do sensor Aparente=Vrms*I_eficaz;// calculo potencia aparente P=(Uaux*Iaux)/1000;// calculo potencia ativa //Potencia= I_eficaz*Tensao_eficaz;// calculo da potencia em Watt Potencia=1000; Energial+= (Potencia/3600)/1000; // calculo e contabilização da energia em KWh Energia_Total= Energia + Energial; }
…
Adicionado por Fabio queijo ao 10:58 em 4 julho 2015
tion 'void loop()':
C:\Users\Usuário\Downloads\Rele Serial Ethernet v.1.0\rele-serial-ethernet\rele-serial-ethernet.ino:137:49: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
O sketch usa 23.208 bytes (71%) de espaço de armazenamento para programas. O máximo são 32.256 bytes.Variáveis globais usam 1.514 bytes (73%) de memória dinâmica, deixando 534 bytes para variáveis locais. O máximo são 2.048 bytes.
#include <SPI.h>#include <SD.h>#include <Ethernet_v2.h>#include <SerialRelay.h>
//Define o Mac Address da placa de rede. Essa informação pode ser encontrada em uma etiqueta colada embaixo da mesma.byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0x04, 0x75 };//Define o IP da placa. Caso necessário altere o mesmo para se adequar a sua rede.IPAddress ip(192, 168, 0, 90);
EthernetServer server(80);File webFile;
//na linha de baixo está sendo definido as portas em que o módulo relé serial está conectado.SerialRelay relays(8, 9, 10); // (pino de data, pino de clock, quantidade de módulos)
#define REQ_BUF_SZ 60char HTTP_req[REQ_BUF_SZ] = {0};char req_index = 0;
int estado_botao[41];
char * pch;
void setup(){ //ESTADO INICIAL DOS BOTOES 0 -> desligado, 1 -> ligado: estado_botao[1] = 0; estado_botao[2] = 0; estado_botao[3] = 0; estado_botao[4] = 0; estado_botao[5] = 0; estado_botao[6] = 0; estado_botao[7] = 0; estado_botao[8] = 0; estado_botao[9] = 0; estado_botao[10] = 0; estado_botao[11] = 0; estado_botao[12] = 0; estado_botao[13] = 0; estado_botao[14] = 0; estado_botao[15] = 0; estado_botao[16] = 0; estado_botao[17] = 0; estado_botao[18] = 0; estado_botao[19] = 0; estado_botao[20] = 0; estado_botao[21] = 0; estado_botao[22] = 0; estado_botao[23] = 0; estado_botao[24] = 0; estado_botao[25] = 0; estado_botao[26] = 0; estado_botao[27] = 0; estado_botao[28] = 0; estado_botao[29] = 0; estado_botao[30] = 0; estado_botao[31] = 0; estado_botao[32] = 0; estado_botao[33] = 0; estado_botao[34] = 0; estado_botao[35] = 0; estado_botao[36] = 0; estado_botao[37] = 0; estado_botao[38] = 0; estado_botao[39] = 0; estado_botao[40] = 0;
Serial.begin(9600);
Serial.println("Inicializando cartao microSD..."); if (!SD.begin(4)) { Serial.println("ERRO - inicializacao do cartao falhou!"); return; } Serial.println("SUCESSO - cartao microSD inicializado.");
if (!SD.exists("index.htm")) { Serial.println("ERRO - index.htm nao foi encontrado!"); return; } Serial.println("SUCESSO - Encontrado arquivo index.htm.");
Ethernet.begin(mac, ip); server.begin();}
void loop(){ EthernetClient client = server.available(); //verifica se existe alguém querendo se conectar
if (client) { // existe cliente? boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { // Existe informacao vinda do cliente char c = client.read(); // Le cada byte enviado pelo cliente, ou seja, cada caracter. // Por padrao, o ultimo caracter enviado pelo cliente (nosso navegador) é em branco e termina com \n // Dessa forma conseguimos saber se o cliente acabou de enviar informacoes para o servidor (Arduino) if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // salva os caracteres das solicitacoes do browser req_index++; } if (c == '\n' && currentLineIsBlank) { // envia para o cliente o protocolo padrao de sucesso HTTP client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println();
//caso a request seja pela ação de um botão: if (StrContains(HTTP_req, "ajax_botao")) { for (int i = 1 ; i <= 40 ; i++) { //Serial.println(HTTP_req); char botao[] = "botaoxx"; if (i < 10) { botao[5] = '0'; botao[6] = '0' + i; } else { botao[5] = '0' + (i / 10); botao[6] = '0' + (i % 10); }
//Serial.println(botao); if (StrContains(HTTP_req, botao)) { SetBotao(i, client); } } } else { // grava no arquivo webFile a página que temos no microSD webFile = SD.open("index.htm"); if (webFile) { while (webFile.available()) { client.write(webFile.read()); // envia para o cliente a página - nessa linha de fato o Arduino imprime no browser a página } webFile.close(); } } Serial.println(HTTP_req); //para debug, verifica no monitor serial a requisição req_index = 0; //reseta o index do buffer e a variável que armazena as requisições StrClear(HTTP_req, REQ_BUF_SZ); break; } // toda linha de texto recebida do cliente termina com \r\n if (c == '\n') { //verifica se acabou a linha, já que \n é o ultimo caracter currentLineIsBlank = true; } else if (c != '\r') { // o cliente ainda está enviando informações currentLineIsBlank = false; } } } delay(1); // dá um tempo para o browser receber os dados client.stop(); // fecha a conexão }}
void SetBotao(int botao, EthernetClient client) {
int modulo = (botao - 1) / 4 + 1; int rele = botao % 4; if (rele == 0) { rele = 4; }
Serial.print("modulo:"); Serial.print(modulo); Serial.print(" rele:"); Serial.print(rele); Serial.print(" - ");
if (estado_botao[botao] == 0) { relays.SetRelay(rele, SERIAL_RELAY_ON, modulo); estado_botao[botao] = 1; //client.print("1"); Serial.println("1"); } else { relays.SetRelay(rele, SERIAL_RELAY_OFF, modulo); estado_botao[botao] = 0; //client.print("0"); Serial.println("0"); } client.print("0|"); for (int i = 1 ; i <= 40 ; i++) { client.print(estado_botao[i]); client.print("|"); }
}
// funcao para limpar arrays (no nosso caso, as variaveis que armazenam requests)void StrClear(char *str, char length){ for (int i = 0; i < length; i++) { str[i] = 0; }}
// funcao que procura pela string SFIND em STR// retorna 1 se a string for encontrada// retorna 0 se a setring não for encontradachar StrContains(char *str, char* sfind){ char found = 0; char index = 0; char len;
len = strlen(str);
if (strlen(sfind) > len) { return 0; } while (index < len) { if (str[index] == sfind[found]) { found++; if (strlen(sfind) == found) { return 1; } } else { found = 0; } index++; } return 0;}…
lt;SPI.h>#include <SD.h>#include <Ethernet_v2.h>#include <SerialRelay.h>
//Define o Mac Address da placa de rede. Essa informação pode ser encontrada em uma etiqueta colada embaixo da mesma.byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0xC6, 0x65 };//Define o IP da placa. Caso necessário altere o mesmo para se adequar a sua rede.IPAddress ip(192, 168, 0, 99);
EthernetServer server(8484);File webFile;
//na linha de baixo está sendo definido as portas em que o módulo relé serial está conectado.SerialRelay relays(8, 9, 10); // (pino de data, pino de clock, quantidade de módulos)
#define REQ_BUF_SZ 60char HTTP_req[REQ_BUF_SZ] = {0};char req_index = 0;
int estado_botao[41];
char * pch;
void setup(){ //ESTADO INICIAL DOS BOTOES 0 -> desligado, 1 -> ligado: estado_botao[1] = 0; estado_botao[2] = 0; estado_botao[3] = 0; estado_botao[4] = 0; estado_botao[5] = 0; estado_botao[6] = 0; estado_botao[7] = 0; estado_botao[8] = 0; estado_botao[9] = 0; estado_botao[10] = 0; estado_botao[11] = 0; estado_botao[12] = 0; estado_botao[13] = 0; estado_botao[14] = 0; estado_botao[15] = 0; estado_botao[16] = 0; estado_botao[17] = 0; estado_botao[18] = 0; estado_botao[19] = 0; estado_botao[20] = 0; estado_botao[21] = 0; estado_botao[22] = 0; estado_botao[23] = 0; estado_botao[24] = 0; estado_botao[25] = 0; estado_botao[26] = 0; estado_botao[27] = 0; estado_botao[28] = 0; estado_botao[29] = 0; estado_botao[30] = 0; estado_botao[31] = 0; estado_botao[32] = 0; estado_botao[33] = 0; estado_botao[34] = 0; estado_botao[35] = 0; estado_botao[36] = 0; estado_botao[37] = 0; estado_botao[38] = 0; estado_botao[39] = 0; estado_botao[40] = 0;
Serial.begin(9600);
Serial.println("Inicializando cartao microSD..."); if (!SD.begin(4)) { Serial.println("ERRO - inicializacao do cartao falhou!"); return; } Serial.println("SUCESSO - cartao microSD inicializado.");
if (!SD.exists("index.htm")) { Serial.println("ERRO - index.htm nao foi encontrado!"); return; } Serial.println("SUCESSO - Encontrado arquivo index.htm.");
Ethernet.begin(mac, ip); server.begin();}
void loop(){ EthernetClient client = server.available(); //verifica se existe alguém querendo se conectar
if (client) { // existe cliente? boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { // Existe informacao vinda do cliente char c = client.read(); // Le cada byte enviado pelo cliente, ou seja, cada caracter. // Por padrao, o ultimo caracter enviado pelo cliente (nosso navegador) é em branco e termina com \n // Dessa forma conseguimos saber se o cliente acabou de enviar informacoes para o servidor (Arduino) if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // salva os caracteres das solicitacoes do browser req_index++; } if (c == '\n' && currentLineIsBlank) { // envia para o cliente o protocolo padrao de sucesso HTTP client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println();
//caso a request seja pela ação de um botão: if (StrContains(HTTP_req, "ajax_botao")) { for (int i = 1 ; i <= 40 ; i++) { //Serial.println(HTTP_req); char botao[] = "botaoxx"; if (i < 10) { botao[5] = '0'; botao[6] = '0' + i; } else { botao[5] = '0' + (i / 10); botao[6] = '0' + (i % 10); }
//Serial.println(botao); if (StrContains(HTTP_req, botao)) { SetBotao(i, client); } } } else { // grava no arquivo webFile a página que temos no microSD webFile = SD.open("index.htm"); if (webFile) { while (webFile.available()) { client.write(webFile.read()); // envia para o cliente a página - nessa linha de fato o Arduino imprime no browser a página } webFile.close(); } } Serial.println(HTTP_req); //para debug, verifica no monitor serial a requisição req_index = 0; //reseta o index do buffer e a variável que armazena as requisições StrClear(HTTP_req, REQ_BUF_SZ); break; } // toda linha de texto recebida do cliente termina com \r\n if (c == '\n') { //verifica se acabou a linha, já que \n é o ultimo caracter currentLineIsBlank = true; } else if (c != '\r') { // o cliente ainda está enviando informações currentLineIsBlank = false; } } } delay(1); // dá um tempo para o browser receber os dados client.stop(); // fecha a conexão }}
void SetBotao(int botao, EthernetClient client) {
int modulo = (botao - 1) / 4 + 1; int rele = botao % 4; if (rele == 0) { rele = 4; }
Serial.print("modulo:"); Serial.print(modulo); Serial.print(" rele:"); Serial.print(rele); Serial.print(" - ");
if (estado_botao[botao] == 0) { relays.SetRelay(rele, SERIAL_RELAY_ON, modulo); delay(500); estado_botao[botao] = 1; //client.print("1"); Serial.println("1"); relays.SetRelay(rele, SERIAL_RELAY_OFF, modulo); delay(500); estado_botao[botao] = 0; //client.print("0"); Serial.println("0"); } else { } client.print("0|"); for (int i = 1 ; i <= 40 ; i++) { client.print(estado_botao[i]); client.print("|"); }
}
// funcao para limpar arrays (no nosso caso, as variaveis que armazenam requests)void StrClear(char *str, char length){ for (int i = 0; i < length; i++) { str[i] = 0; }}
// funcao que procura pela string SFIND em STR// retorna 1 se a string for encontrada// retorna 0 se a setring não for encontradachar StrContains(char *str, char* sfind){ char found = 0; char index = 0; char len;
len = strlen(str);
if (strlen(sfind) > len) { return 0; } while (index < len) { if (str[index] == sfind[found]) { found++; if (strlen(sfind) == found) { return 1; } } else { found = 0; } index++; } return 0;}…
Bm ou menos
1 -111 dBm
2...30 -110...-54 dBm
31 -52 dBm ou maior
99 não detectou sinal
Portanto, depois de enviar o comando corretamente para o sim900 você deverá ler a resposta do sim900, e em seguida tratar a string recebida, retirando o valor desejado do rssi, salvando-o em uma variavel para então enviar ao lcd...
Segue um sketch que faz a leitura do rssi do sim900 e imprime o mesmo no serial monitor do arduino, estude-o, entenda como é que funciona, pois com certeza deverá ser necessário algumas modificações principalmente na instance da porta serial... dificilmente o nome da porta serial usada no sketch do exemplo ( no caso mySerial ) coincidirá com a que que foi usada no seu sketch, para verificar isso você deverá abrir a library do sim900 e verificar qual o nome usado...
O sketch:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
// AUX GSM Leitura de dados
String linhaAtual = "";
String db = "";
boolean lendoDB = false;
void setup()
{
mySerial.begin(19200); // inicia conexao SIM900
Serial.begin(9600); // inicia conexao PC
}
void loop()
{
delay(500); // delay de envio de dados
mySerial.println("AT+CSQ"); // envia comando ao SIM900
while(mySerial.available()>0) // se existem dados na porta serial
{
char dados = mySerial.read(); // variavel dados recebe informacoes
linhaAtual += dados; // variavel linha recebe dados
if (dados == '\n') // se tiver um ENTER em dados
{
linhaAtual = ""; // apaga dados da linha
}
if (linhaAtual.endsWith(" ")) // se a linha terminar com espaco em branco
{
lendoDB = true; // estamos lendo dados
db = ""; // limpo variavel que vai receber dados em DB
}
if (lendoDB) // se estamos lendo os dados
{
if (dados != ',') // faz leitura ate encontrar virgula
{
db += dados; // adiciona info a variavel db
}
else // se nao estamos lendo
{
lendoDB = false; // sem leitura
Serial.println(db); // enviamos os dados para o computador pela porta serial
}
}
}
}
fonte: http://microembarcado.blogspot.com.br/2013/11/sim900-labview-fazendo-leitura-de-sinal.html
Espero que isto possa lhe ajudar a conseguir ver a indicação do sinal no seu display lcd.
Abraço.…
Adicionado por Wiechert ao 4:35 em 6 setembro 2014
define polling 10 // the scan rate
// If the packets internal retry register matches// the set retry count then communication is stopped// on that packet. To re-enable the packet you must// set the "connection" variable to true.#define retry_count 10
// used to toggle the receive/transmit pin on the driver#define TxEnablePin 20
#define LED 9
// This is the easiest way to create new packets// Add as many as you want. TOTAL_NO_OF_PACKETS// is automatically updated.enum{ PACKET1, PACKET2, PACKET3, PACKET4, PACKET5, PACKET6, PACKET7, PACKET8, PACKET9, PACKET10, PACKET11, PACKET12, PACKET13, PACKET14, PACKET15, PACKET16, PACKET17, TOTAL_NO_OF_PACKETS // leave this last entry};
// Create an array of Packets to be configuredPacket packets[TOTAL_NO_OF_PACKETS];
// Create a packetPointer to access each packet// individually. This is not required you can access// the array explicitly. E.g. packets[PACKET1].id = 2;// This does become tedious though...//////////////////////////HMI READS/////////////////////////////packetPointer enableDisableHMI = &packets[PACKET1];packetPointer runFwdHMI = &packets[PACKET2];packetPointer runRevHMI = &packets[PACKET3];packetPointer resetHMI = &packets[PACKET4];packetPointer eStopHMI = &packets[PACKET5];packetPointer userSetSpeedHMI = &packets[PACKET6];
//////////////////////////HMI WRITES////////////////////////////packetPointer runLedHMI = &packets[PACKET7];packetPointer stopLedHMI = &packets[PACKET8];packetPointer errorLedHMI = &packets[PACKET9];packetPointer actualSpeedHMI = &packets[PACKET10];packetPointer motorCurrentHMI = &packets[PACKET11];
/////////////////////////VSD READS//////////////////////////////packetPointer statusWordVSD = &packets[PACKET12];packetPointer actualSpeedVSD = &packets[PACKET13];packetPointer motorCurrentVSD = &packets[PACKET14];
/////////////////////////VSD WRITES/////////////////////////////packetPointer commandWordVSD = &packets[PACKET15];packetPointer userSetSpeedVSD = &packets[PACKET16];packetPointer clearFaultsVSD = &packets[PACKET17];
////////HMI READ VARIABLES////////////unsigned int readEnableDisableHMI[1];unsigned int readRunFwdHMI[1];unsigned int readRunRevHMI[1];unsigned int readResetHMI[1];unsigned int readEstopHMI[1];unsigned int readUserSetSpeedHMI[1];
////////HMI WRITE VARIABLES//////////unsigned int writeRunLedHMI[1];unsigned int writeStopLedHMI[1];unsigned int writeErrorLedHMI[1];unsigned int writeActualSpeedHMI[1];unsigned int writeMotorCurrentHMI[1];
////////VSD READ VARIABLES///////////unsigned int readStatusWordVSD[1];unsigned int readActualSpeedVSD[1];unsigned int readMotorCurrentVSD[1];
////////VSD WRITE VARIABLES//////////unsigned int writeControlWordVSD[1];unsigned int writeUserSetSpeedVSD[1]={0};unsigned int writeClearFaultsVSD[1];
// High or Low variables as arraysunsigned int writeHigh[1]={1};unsigned int writeLow[1]={0};
const int vccPin = 17;const int gndPin = 21;
unsigned int BUTTONSTATE;unsigned int PREVBUTTONSTATE;
void setup(){ Serial.begin(19200); // Set modes of some pins for LED outputs pinMode(vccPin, OUTPUT); pinMode(gndPin, OUTPUT); digitalWrite(vccPin, HIGH); digitalWrite(gndPin, LOW); // Read all values from HMI modbus_construct(enableDisableHMI, 3, READ_HOLDING_REGISTERS, 50, 1, readEnableDisableHMI); modbus_construct(runFwdHMI, 3, READ_HOLDING_REGISTERS, 60, 1, readRunFwdHMI); modbus_construct(runRevHMI, 3, READ_HOLDING_REGISTERS, 70, 1, readRunRevHMI); modbus_construct(resetHMI, 3, READ_HOLDING_REGISTERS, 80, 1, readResetHMI); modbus_construct(eStopHMI, 3, READ_HOLDING_REGISTERS, 90, 1, readEstopHMI); modbus_construct(userSetSpeedHMI, 3, READ_HOLDING_REGISTERS, 10, 1, readUserSetSpeedHMI); // Write required values to HMI modbus_construct(runLedHMI, 3, PRESET_MULTIPLE_REGISTERS, 100, 1, writeRunLedHMI); modbus_construct(stopLedHMI, 3, PRESET_MULTIPLE_REGISTERS, 110, 1, writeStopLedHMI); modbus_construct(errorLedHMI, 3, PRESET_MULTIPLE_REGISTERS, 120, 1, writeErrorLedHMI); modbus_construct(actualSpeedHMI, 3, PRESET_MULTIPLE_REGISTERS, 0, 1, readActualSpeedVSD); modbus_construct(motorCurrentHMI, 3, PRESET_MULTIPLE_REGISTERS, 20, 1, readMotorCurrentVSD); // Read all values from VSD modbus_construct(statusWordVSD, 2, READ_HOLDING_REGISTERS, 8603, 1, readStatusWordVSD); modbus_construct(actualSpeedVSD, 2, READ_HOLDING_REGISTERS, 8604, 1, readActualSpeedVSD); modbus_construct(motorCurrentVSD, 2, READ_HOLDING_REGISTERS, 3204, 1, readMotorCurrentVSD); // Write required values to VSD modbus_construct(commandWordVSD, 2, PRESET_MULTIPLE_REGISTERS, 8601, 1, writeControlWordVSD); modbus_construct(userSetSpeedVSD, 2, PRESET_MULTIPLE_REGISTERS, 8602, 1, readUserSetSpeedHMI); modbus_construct(clearFaultsVSD, 2, PRESET_MULTIPLE_REGISTERS, 8501, 1, writeClearFaultsVSD); // Configure the MODBUS connection modbus_configure(baud, SERIAL_8E1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS); pinMode(LED, OUTPUT); pinMode(6,OUTPUT); pinMode(5,OUTPUT); digitalWrite(5,LOW); pinMode(3,OUTPUT); pinMode(2,OUTPUT); digitalWrite(2,LOW); pinMode(11,OUTPUT); pinMode(10,OUTPUT); digitalWrite(10,LOW);}
void loop(){ modbus_update(); // Get the latest register values for the buttons and screen elements... checkState(); // Convert the button register states into a single integer value for use in switch|case statement... switch(BUTTONSTATE){ case 0: while(BUTTONSTATE==0) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 1: while(BUTTONSTATE==1) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 2: while(BUTTONSTATE==2) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 3: while(BUTTONSTATE==3) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 4: while(BUTTONSTATE==4) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 5: while(BUTTONSTATE==5) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 6: while(BUTTONSTATE==6) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 7: while(BUTTONSTATE==7) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 8: while(BUTTONSTATE==8) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 9: while(BUTTONSTATE==9) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 10: while(BUTTONSTATE==10) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; case 16: while(BUTTONSTATE==16) { modbus_update(); checkState(); Serial.println(BUTTONSTATE); // Your Code Here... } break; default: break; } }
void checkState() // This function simply reads whether each button is active("1") or inactive ("0") and bitshifts each button to create a unique BUTTONSTATE value for each combination of button presses...{ PREVBUTTONSTATE=BUTTONSTATE; BUTTONSTATE = (readEnableDisableHMI[0])+(readRunFwdHMI[0]<<1)+(readRunRevHMI[0]<<2)+(readResetHMI[0]<<3)+(readEstopHMI[0]<<4); // Example: Drive enabled, and run forward... 0b00011 = dec "3"... so BUTTONSTATE = 3. if(BUTTONSTATE==11||BUTTONSTATE==12||BUTTONSTATE==13||BUTTONSTATE==14||BUTTONSTATE==15) // For our implementation these button press combinations are not valid... so just make them = to state 10... { BUTTONSTATE=10; } // As above... These are all the possible BUTTONSTATE values when the E-stop button is pressed... but if E-Stop is pressed we want to kill all buttons anyway... if(BUTTONSTATE==17||BUTTONSTATE==18||BUTTONSTATE==19||BUTTONSTATE==20||BUTTONSTATE==21||BUTTONSTATE==22||BUTTONSTATE==23||BUTTONSTATE==24||BUTTONSTATE==25||BUTTONSTATE==26||BUTTONSTATE==27||BUTTONSTATE==28||BUTTONSTATE==29||BUTTONSTATE==30||BUTTONSTATE==31) { BUTTONSTATE=16; } }…
Adicionado por Rodrigo Sutto ao 10:36 em 27 outubro 2016