Fiz um projeto e está funcionando normal até um determinado momento, quando estoura a memória é necessário reiniciar o arduino. Preciso de ajuda!  Segue o código abaixo

#include <SoftwareSerial.h>
#include <Ethernet.h>
#include <SPI.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <sha1.h>
#include <avr/pgmspace.h>
#include <WString.h>
//#include <avr/dtostrf.h> // Add this for the Due
#include <stdlib.h>
#define PIN_RELAY A1
#define PIN_RELAY2 A2
#define PIN_BUZZER A3

#define gatilho 4
#define echo 5
#define stx 2
#define etx 3
#define ON 1
#define OFF 0
int counter;
byte data[14];
byte mac[] = {
0x8A, 0x06, 0x3F, 0xA8, 0x42, 0x96};
IPAddress ip(192,168,1,6);
byte server_addr[]={
192,168,1,2};// IP address of DB server
EthernetClient cliente;
SoftwareSerial rfidReader(6, 7); // RX, TX
LiquidCrystal_I2C lcd(0x27,16,2);
String caracter="";
char inString[32]; // string for incoming serial data
int stringPos = 0; // string index counter
boolean startRead = false; // is reading?
int id=0;
int total=0;
String acesso="0";
bool conectado = false;
char query[122];
int tempPin = NULL; // variables
int tempID = NULL;
int tempStatus = NULL;
float tempo; // para armazenar o tempo de ida e volta do sinal em microsegundos
float distancia_cm; // para armazenar a distância em centímetros
void setup()
{
lcd.init();
lcd.backlight();
// Informa a area do display lcd
lcd.setCursor(0,0);
Ethernet.begin(mac, ip);
digitalWrite(PIN_RELAY, ON);
digitalWrite(PIN_RELAY2, ON);
digitalWrite(PIN_BUZZER,ON);
digitalWrite(gatilho,LOW);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_RELAY, OUTPUT);
pinMode(PIN_RELAY2, OUTPUT);
pinMode(echo,INPUT);
pinMode(gatilho,OUTPUT);
rfidReader.begin(9600);
Serial.begin(9600);
SPI.begin();
mensageminicial();
}

void loop()
{
if (rfidReader.available() > 0 || rfidReader.available() != 0 ) {
data[counter] = rfidReader.read();
counter++;
if(counter > 13) {
counter = 0;
if(data[0] == stx && data[13] == etx) {
for(int x = 1; x < 11; x++) {
caracter += data[x];
}
digitalWrite(PIN_BUZZER,OFF);
delay(100);
digitalWrite(PIN_BUZZER,ON);
}
}
}
if(caracter!=""){
String pageValue = connectAndRead();
if (pageValue == "0"){
acesso="0";
}else if(pageValue == "1"){
acesso="1";

}
valida();
caracter="";
rfidReader.flush();
acesso="0";
distancia_cm=0;
lcd.clear();
mensageminicial();
cliente.flush();

}

}

void valida(){
//validações
if(acesso.endsWith("1")){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ACESSO LIBERADO");
lcd.setCursor(0,1);// segunda linha do display
lcd.print(" SEJA BEM VINDO ");
delay(1000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" AGUARDE ");
lcd.setCursor(0,1);// segunda linha do display
lcd.print(" A LIBERACAO ");
digitalWrite(PIN_BUZZER,OFF);
digitalWrite(PIN_RELAY, OFF); //Aciona o rele 1
delay(7000);
digitalWrite(PIN_BUZZER,ON);
digitalWrite(PIN_RELAY, ON); //Desliga o rele 1
delay(3000);
while (distancia_cm <300){
distancia_cm=0;
if(distancia_cm>300) break;


digitalWrite(gatilho, LOW);
delayMicroseconds(2);
// disparar pulso ultrassônico
digitalWrite(gatilho, HIGH);
delayMicroseconds(10);
digitalWrite(gatilho, LOW);

// medir tempo de ida e volta do pulso ultrassônico
tempo = pulseIn(echo, HIGH);

// calcular as distâncias em centímetros e polegadas
distancia_cm = (tempo / 29.4) / 2;
Serial.println(distancia_cm);
}
delay(7000);
if(distancia_cm>330){

digitalWrite(PIN_RELAY2, OFF); //Aciona o rele 1
delay(7000);
digitalWrite(PIN_RELAY2, ON); //Desliga o rele 2



}
}
else{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ACESSO BLOQUEADO");
lcd.setCursor(0,1);// segunda linha do display
lcd.print(" PROC. RECEPCAO ");

digitalWrite(PIN_BUZZER,OFF);
delay(1000);
digitalWrite(PIN_BUZZER,ON);
delay(100);
digitalWrite(PIN_BUZZER,OFF);
delay(100);
digitalWrite(PIN_BUZZER,ON);
delay(100);
digitalWrite(PIN_BUZZER,OFF);
delay(100);
digitalWrite(PIN_BUZZER,ON);
delay(1000);
caracter="";
rfidReader.flush();
acesso="0";
lcd.clear();
mensageminicial();
}

}

String connectAndRead(){
//connect to the server


//port 80 is typical of a www page
if (cliente.connect(server_addr, 80)) {
cliente.println("GET /verifica/verificacancela.php?caracter="+caracter+" HTTP/1.1");
cliente.println("Host: 192.168.1.2");
cliente.println("Connection: close");

cliente.println();

//Connected - Read the page
return readPage(); //go and read the output

}
else{
return "connection failed";
}

}

void mensageminicial(){
lcd.clear();
lcd.setCursor(0,0); //primeira linha do display
lcd.print("Controle"); //
lcd.setCursor(0,1);// segunda linha do display
lcd.print(" Encoste o Cartao ");
}


String readPage(){
//read the page, and capture & return everything between '<' and '>'

stringPos = 0;
memset( &inString, 0, 32 ); //clear inString memory

while(true){

if (cliente.available()) {
char c = cliente.read();

if (c == '<' ) { //'<' is our begining character
startRead = true; //Ready to start reading the part
}
else if(startRead){

if(c != '>'){ //'>' is our ending character
inString[stringPos] = c;
stringPos ++;
}
else{
//got what we need here! We can disconnect now
startRead = false;
cliente.stop();
cliente.flush();
return inString;

}

}
}

}

}

Exibições: 344

As respostas para este tópico estão encerradas.

Respostas a este tópico

que certeza vc tem q estoura a memoria? o q acontece ?

Acho que vc vai precisar em breve de um que tenha mais memória, se projeto usa muitas bibliotecas.

Mas alguns detalhes podem melhorar, como:

Saiba que int se refere a um numero de 16 bits. Use sempre que precisar, mas se não precisar é possivel usar de 8 bits.

Muito recentemente foi feita uma postagem falando disso, mas não encontrei agora.

Para numeros de pinos vc pode usar:

const byte

em vez de

int

Isso teoricamente economiza 2 bytes de ram. As vezes não, depende do compilador. Compiladores inteligentes descobrem que o numero não vai variar e automaticamente definem como constante.

no for tb, se sua contagem nao passar de 255 pode usar byte no lugar de int.

Ainda, não vejo pq distancia em cm precisa ser float. Vc pode usar um artificio de acumular em mm por ex na sua variavel e só converter para cm na hora de mostrar no display, adicionando um caracter ",". Assim vc elimina toda a biblioteca de float.

 

Oi DAM, bom dia,

reafirmo o que disse JMF: "que certeza vc tem q estoura a memoria? o q acontece ?"

Sugiro também que você comente as linhas do seu código, pois assim estará auxiliando-nos

a entender o que seu código faz, e assim poderemos pensar em uma solução para o mesmo

Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço