Ir ao conteúdo

Posts recomendados

Postado

Vinicius, Papibaquigrafo, Alexandre.

 

Apresento-lhes um problema, estou tentando desenvolver meu código pessoal de gravar na EEPROM, e aproveitei o void submit do renato aloi apenas para mandar a string para eeprom, o resto é de minha autoria.

 

Só que tem um mas...

 

ta gravando o começo lá na memoria 506 e eu declaro a eeprom.begin 512 e não consigo ler de volta também. Sei que minha struct ta meio louca, mas se eu não tentar, nunca irei conseguir.

segue o trecho do código:

oid configWifiSubmit() 
{int contador=0;
  char token[50]="";
  String html = "<html><head><title>Configurar o token submit</title><center>";
  html += "<meta charset='UTF-8' language='pt-br'><style type='text/css' media='all'>";
html += "body{background-color:#527F76;color:#FFFF99;font-family:Verdana,'Times New Roman',Arial;font-size:15px;}";
html +="input{background-color:#2F2F4F;color:#E6E8FA;font-family:,'Times New Roman',Arial,Verdana;font-size:20px;}</style>";

   html += "</head><body>";
  html += "<h1>configuração do token </h1>";
 
  html += "<p>Dados gravados com sucesso!</p>";

 String taken = server.arg("txttoken");
 taken.toCharArray(token,50);
  for(int i=0;i<sizeof(token);i++){
    contador++;
    EEPROM.write(i,token[i]);
     
  }
 int contador1=contador/256;
 int contador2=contador%256;
    EEPROM.write(400,contador1);
    EEPROM.write(401,contador2);
  EEPROM.end();
  
  
   
  html += "<p>token: <b>";
  html += token;
   html += "<form method=GET>";
  html += "<p><input name=button2 type=submit value=Voltar /></p></form>";
  html += "</body></center></html>";
  
  server.send(200, "text/html", html);

 
  ESP.restart();
}

e pra ler to usando esse trecho de código:

tring token="";
  int contar=EEPROM.read(400);
  int contar1=EEPROM.read(401);
  if(contar1>0){
    contar=contar*10;
  }
int  contar2=contar+contar1;
  for(int u=0;u<contar2;u++){
  token +=EEPROM.read(u);
  }

tentei inserir um int no codigo e armazenar na memoria 400, esse int ficaria responsável por definir o tamanho da string e assim eu "teria" o controle de quantos chars existem no Array, só que não está funcionando a contento, a memória no programa não achar o valor no campo 400 e toda vez que eu compilo as letras ficam sambando no dial.

  • Curtir 1
Postado

@lucianolcoa  O problema da conversão (toCharArray()) ta resolvido?

 

 

8 horas atrás, lucianolcoa disse:

ta gravando o começo lá na memoria 506 e eu declaro a eeprom.begin 512 e não consigo ler de volta também. Sei que minha struct ta meio louca, mas se eu não tentar, nunca irei conseguir.

Como assim começa em 506? Se sua Eeprom está configurada para 512 e você começar a gravar no 506 só vão sobrar 6 posições.

 

Você precisa ter certeza de que tem espaço para gravar suas variáveis, nesse sistema de Struct, você não precisa definir as posições dos dados na memória, mas precisa ter espaço para os dados, por exemplo, imagina a seguinte struct:

 

struct {
      int dia;
      int mes;
      int ano; 
   } x; 

Considerando o começo da gravação em 506 conforme você colocou, os dados na eeprom ficariam assim:

dia(posição 506)

mes(posição 507)

ano(posição 508)

 

Agora considere a seguinte struct:

struct {
      char dia[10];
      char mes[10];
      char ano[10]; 
   } x; 

dia(posição 506 a 515)

mes(posição 516 a 525)

ano(posição 526 a 535)

 

Nesse caso sua eeprom já estaria estourada porque ela foi declarada para 512 posições(Bytes)

 

 

 

  • Curtir 1
Postado

@Papibakigrafo  Estive pensando se realmente seria uma boa opção gravar dados de leitura de portas e sensores no banco de dados do servidor, pra ser sincero estou em dúvidas se isso vai funcionar, imagina um sensor mandando um Byte a cada segundo e isto sendo gravado no BD do servidor, em uma hora seriam 3,6KB, em um dia seriam 86KB, em um ano seriam 31MB, se for apenas um sensor ainda vai, mas e se forem 100?

 

Estou pensando em limitar na tabela tipo as últimas 24hs de registro, ou no máximo o último mês, no caso seria só criar uma função que delete da tabela os registros anteriores, concorda?

  • Curtir 2
Postado

@ViniciusKruz Então a struc ela direciona a gravação direto pra memoria onde voce quer?

tipo:

struct{

char teste[10]

char teste1[10]

}x

Se eu colocar x.teste vai pra memoria da eeprom?

mas como faço pra struct começar no 50, no 60 por exemplo?

Postado

@ViniciusKruz Ou você pode enviar a cada 12 horas, ou em algum horário programado. Já que vai estar conectado a internet, poderia sincronizar com o NTP.

Ou, no caso, pode fazer o SQL apagar os 5 primeiros registros a cada dia. Tem como fazer qualquer um dos modos =)

  • Curtir 1
Postado
18 minutos atrás, lucianolcoa disse:

Se eu colocar x.teste vai pra memoria da eeprom?

 

Eu realmente não tenho muito conhecimento de como executar as leituras e gravações por struct, mas creio que com esse comando aí você apenas salvou o dado na struct, para passar da struct para a memória ainda precisa chamar aquela função: saveConfig();

 

18 minutos atrás, lucianolcoa disse:

mas como faço pra struct começar no 50, no 60 por exemplo?

 

Acredito que seja uma destes dois valores pre definidos:

 

#define VERSION_START 500

#define CONFIG_START 6

 

Pra ter certeza mesmo só mandando gravar pela struct e depois mandar ler manualmente endereço por endereço para ver onde o dado começou e onde terminou. Para ler manualmente seria com um EEPROM.read(6), desta forma você verificaria qual dado foi gravado no endereço 6 da eeprom.

adicionado 5 minutos depois

@Papibakigrafo Imagino que caso seja uma estação meteorológica, seria bom atualizar os dados quase que em tempo real, o ideal seria pelo menos 5 segundos entre cada envio e nesse caso realmente precisaria ficar tudo guardado no BD para futuras comparações.

  • Curtir 2
Postado

@lucianolcoa acho que é no CONFIG_START mesmo: http://playground.arduino.cc/Code/EEPROMLoadAndSaveSettings

Achei um interessante aqui também (ele já grava no próprio código): https://github.com/jecrespo/Aprendiendo-Arduino/blob/master/Ejercicio35-EEPROM/Ejercicio35-EEPROM.ino

 

@ViniciusKruz é, assim realmente precisaria. Mas uma estação meteorológica tem que ter um banco de dados enorme... o que esses BROKERS possuem, deve ser gigantesco,  por isso o serviço mais profissional é pago =P

  • Curtir 3
Postado

@lucianolcoa

 

Eu faço do jeito mais difícil kkkk, veja como eu deixo documentado a posição de cada campo:

 

Citação

* Nome da rede Wifi(ST): 0 a 30
 * Senha da rede Wifi(ST): 31 a 95
 *
 * User do login web: 100 a 119
 * Senha do login web 120 a 189
 *
 * IP(ST): 200 a 203
 * Gateway(ST): 204 a 207
 * Sub-rede(ST): 208 a 211
 * DNS(ST): 212 a 215
 *
 * IP(AP): 216 a 219
 * Gateway(AP): 220 a 223
 * Sub-rede(AP): 224 a 227
 *
 *Porta WebServer: 230
 *
 * DHCP
 * INICIO: 232 a 235
 * FIM:    236 a 239
 *
 * Modo de acesso(AP ou Estação): 240 (0=AP+ESTAÇÃO, 1=SÓ AP, 2=SÓ ESTAÇÃO)
 * Modo de inicialização: 241 (0=ESTAÇÃO, 1=ACCESS POINT, 2=ACCESS POINT+ESTAÇÃO)
 *
 * Nome HOST: 242 a 299 (nome usado na rede AP e nome de domínio DNS)
 * Senha da rede Wifi(AP): 300 a 364(senha usada na rede AP)
 *
 *Nome do Host na IoT: 300 a 399
 *Usuario:400 a 449
 *Senha:450 a 499
 *Envia status para a IoT: 500(0=não, 1=sim)
 *Recebe comandos da IoT: 501(0=não, 1=sim)
 *

 

É bem mais trabalhoso, mas dá pra saber exatamente onde está cada coisa.

 

Quando eu tiver com meu sistema pronto vou mudar ele para struct.

 

adicionado 30 minutos depois

@Papibakigrafo  

 

Olha só o teste com seu tutorial:

 

 

chart.png

 

Muito bacana, tá vendo só, seu tutorial já tá me ajudando, meu ESP está gerando um número aleatório e mandando pro site que grava na tabela do BD e mostra no gráfico.

  • Curtir 4
Postado

Pessoal é o seguinte. To conseguindo gravar os dados mas não sei como ler os dados na quantidade certa,alguem se habilita a me ajudar?

adicionado 1 minuto depois

o codigo doido que to tentando usar para impor limite na leitura da eeprom

String token="";
char tiken[50]="";
int i=0;
byte valor;
valor=EEPROM.read(i);

  while(valor='\0'){
    token +=valor;
    i++;
    
  }
  

 

  • Membro VIP
Postado

@lucianolcoa, agradeço muitíssimo a consideração, mas por favor não me coloque nos agradecimentos. Eu tenho consciência de que minha ajuda, se existe mesmo, tem sido preguiçosa, sem adentrar os códigos. Os demais colegas da lista, sim, têm experiência e dedicação (esforço) para discutir linhas de código com você. É injusto com eles me colocar ali. Eu ainda não iniciei um ESP8266 uma primeira vez sequer! Por favor, retire-me dos agradecimentos.

 

Ontem você me chamou juntamente com eles para analisar como tem feito gravação e leitura na EEPROM. Preciso deixar bem claro que eu nunca fiz isso. E também eu ando preocupado com assuntos pessoais. De modo que não há perspectiva de eu me debruçar sobre as suas linhas de código. Perdoe-me. Por justiça, retire-me da lista.

 

@ViniciusKruz e @Papibakigrafo, não sei exatamente do que vocês estão falando. Parece-me que tem algo a ver com o tutorial sobre Google Chart. Ontem eu passei o dia dormindo; para descansar, esfriar a cabeça, orar, e refletir sobre a vida. Mas penso que posso deixar-lhes uma dica muito curta: "pensem em backup". Exportar dados para guardá-los quase sempre importa!

 

  • Curtir 2
Postado
1 hora atrás, Papibakigrafo disse:

entendi, que bom que funcionou! Só não entendi esse numero aleatório que apareceu ai kkkk

 

Kkkk, na verdade é que eu não estou usando um sensor de temperatura como no seu tutorial, daí coloquei um número aleatório só pra testar mesmo. Ao invés do ESP ler o valor no sensor, ele apenas gera um valor qualquer.

adicionado 29 minutos depois
7 horas atrás, lucianolcoa disse:

Pessoal é o seguinte. To conseguindo gravar os dados mas não sei como ler os dados na quantidade certa,alguem se habilita a me ajudar?

 

Vamos analisar seu código, afinal o importante aqui não é dar pronto mas sim ensinar...

 

String token="";
char tiken[50]="";
int i=0;
char valor=" ";
while(valor != '\0'){
    valor=char(EEPROM.read(i));
    token +=valor;
    i++;
}

Na loop while() eu mudei para while(valor != '\0'), aqui precisa ser observado algumas coisinhas:

  1. a variável "valor" foi mudada para "char" porque é o tipo de dado que será recebido
  2. a variável "valor" foi inicializada com um " " (espaço), para que ela não seja nula e não entre no loop
  3. você havia colocado para sair do loop se "valor" fosse nulo('\0') e deve ser o contrário, a rotina deve permanecer no loop enquanto não receber o valor nulo ('\0')
  4. nessa checagem do valor nulo, só vai funcionar se ao gravar a string na eeprom, o sistema estiver finalizado com o caractere nulo('\0'), tipo assim, se for gravar na eeprom a palavra "ola", na verdade deve ser gravado "o,l,a,\0", se o seu sistema (struct) não estiver fazendo isto, a rotina do loop não vai funcionar, ela vai ficar lendo a memória inteira até encontrar o cal caractere.
  5. por último, a variável "i" serve de parâmetro para o loop acessar a eeprom e nesse caso, ela está começando com o valor "0", ou seja, seu loop vai pegar todos os caracteres da eeprom a partir do endereço "0" até encontrar o caracrete nulo.

Avalia com calma isso aí, eu não tenho certeza se a struct grava o caractere nulo, mas penso que não e se eu estiver certo, seu loop já era.

 

 

  • Curtir 3
Postado

@ViniciusKruz vou testar seu help quando chegar em casa. Eu to gravando sem usar a struct mesmo, pelo que eu li da documentação que o papibaquigrafo mostrou a qual o renato aloi se baseou, pra usar a struct precisa dos ponteiros, e eu estou fugindo de ponteiros haha...

 

To usando o input type mesmo e lá num laço for eu gravo o endereço da eeprom a partir do 0, e depois voce tentar usar o seu codigo para ler o endereço ate o caracter nulo. 

Opina por favor se isso vai dar certo, pois se não der, ja vou tentar montar aqui um plano B,C,D,EF,G,H kkkkkkkkkk

  • Curtir 1
Postado

@ViniciusKruz  Manolo eu to usando a estrutura configsubmit do renato aloi, essa até segunda ordem.

 

Ahe na parte eu jogo a string:


 

 String taken = server.arg("txttoken");
 taken.toCharArray(token,50);
  for(int i=0;i<sizeof(token);i++){
    contador++;
    EEPROM.write(i,token[i]);
     
  }
 int contador1=contador/256;
 int contador2=contador%256;
    EEPROM.write(400,contador1);
    EEPROM.write(401,contador2);
  EEPROM.end();

tentei colocar um contador mas ele ta dando erro ,mas com essa manha do caracter nulo creio eu que não irei precisar.

Agora e so usar aquele codigo que voce me ajudou a remontar e zas :)

adicionado 1 minuto depois

Antes que eu me esqueça, nao to conseguindo editar o topico que eu mesmo criei :s

Postado

@ViniciusKruz  fiz o que voce disse mano e so mostra uma chuva de numeros x_x

adicionado 11 minutos depois

VInicius, novamente peço perdao finalmente consegui graças  Deus primeiramente e depois as suas dicas

*musica de fundo We are the champions Queeen*

  • Curtir 1
Postado

Bom dias amigos! O meu irmão me ligou essa semana perguntando se eu sabia fazer um STRUBE com o Arduino ou ESP8266, pois ele queria usar no carnaval onde ficamos.

(Obs: pra quem não sabe, é tipo aquela lâmpada de boate que aparenta que esteja em câmera lenta.... algo assim kkkk)

Eu disse que poderia ver. Procurei e achei apenas exemplos com o arduino, então resolvi fazer com o ESP8266. Está "funcionando", o único bugzinho que acredito que esteja no loop.

 

Poderiam me ajudar??

 

/*
  LED STRUBE
  Criado por Guilherme Lirio Tomasi de Oliveira
*/

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

/* GPIO do Led */
int led = 2;

/* Delay Padrão */
int dd = 500;

/* Define o SSID e Senha do Strube */
const char *ssid = "Strube";
const char *password = "";

/* Porta do WebServer */
ESP8266WebServer server(80);


void handleRoot() {
  String html = "<html><head><title>LED STRUBE</title>";
  html += "<meta http-equiv='Content-Type' content='charset=utf-8'>";
  html += "<meta name='viewport' content='width=device-width, initial-scale=1, user-scalable=no'>";
  html += "<div class='container' align='center'>";
  html += "<a href='/led?valor=mais' class='btn btn-success'>+++</a>";
  html += "<br><br><br>";
  html += "<a href='/led?valor=menos' class='btn btn-danger'>---</a>";
  html += "</div>";
  html += "<div align='center' id='delay'>";
  html += dd;
  html += " ms";
  html += "</div></html>";

  server.send(200, "text/html", html);
}

void pagina()
{
  String recebido = server.arg("valor");
  if (recebido == "mais") {
    dd += 50;
    Serial.println(dd);
  }
  else if (recebido == "menos") {
    dd -= 50;
    Serial.println(dd);
  }
  String html = "<html><head><title>LED STRUBE</title>";
  html += "<meta http-equiv='Content-Type' content='charset=utf-8'>";
  html += "<meta name='viewport' content='width=device-width, initial-scale=1, user-scalable=no'>";
  html += "<div align='center'>";
  html += "<a href='/led?valor=mais'>+++</a>";
  html += "<br><br><br>";
  html += "<a href='/led?valor=menos'>---</a>";
  html += "</div>";
  html += "<div align='center' id='delay'>";
  html += dd;
  html += " ms";
  html += "</div></html>";

  server.send(200, "text/html", html);
}


void strube () {

  digitalWrite(led, LOW);   
  delay(dd);               
  digitalWrite(led, HIGH);    
  delay(dd);               
}

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

  //Declara o LED como saída
  pinMode(led, OUTPUT);
  digitalWrite(led, HIGH);

  Serial.println();
  Serial.print("Abrindo o access point...");
  WiFi.softAP(ssid, password);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP Address: ");
  Serial.println(myIP);

  // Atribuindo urls para funções
  // Quando não especificado método, uma função trata todos
  server.on("/", handleRoot);

  // Chamada do método GET
  server.on("/led", HTTP_GET, pagina);

  server.begin();
  Serial.println("Servidor Iniciado!");
}

void loop() {

  server.handleClient();

  strube();

}

 

Postado

@Papibakigrafo

Acho que encontrei o erro no seu código veja essa linha aqui:

html += dd;

 

voce não pode converter inteiro direto pra string, tem que tratar esse dd antes de colocar ele para "somar" com o html, tenta usar o comando itoa e joga esse dd em outra variável(ddstr por exemplo) e depois joga no html, ou se preferir, nem coloca o valor.

 

vi num blog um cara que fez uma "gambiarra" e acho que vale a pena tentar saca so esse trecho do seu código

-------------

String recebido = server.arg("valor");

if (recebido == "mais") {

dd += 50;

Serial.println(dd);

String leitura=Serial.readString();}

else if (recebido == "menos") {

dd -= 50;

Serial.println(dd);

String leitura=Serial.readString() }

---------------------

E nos html em vez de voce colocar dd voce pode colocar leitura. Tenta e ve se fumfa :)

Postado

@lucianolcoa o código está funcionando normalmente! Desse jeito ai está funcionando, e está aparecendo o valor na página HTML!

 

O problema que relatei, é que quando clico em algum link, a página não abre, mas o código é executado (ele soma ou subtrai 50 da velocidade).

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...