Olá pessoal, estou com um problema em enviar dados para o ethernet shield e não consigo resolver.

SEguinte:

ao abrir a pagina, ele exibe em tempo real a leitura de 2 sensores, porém ao clicar em iniciar, os sensores não são mais exibidos na tela, ela fica estática, porém ainda funcionam no Arduíno, completando o ciclo e, ao terminar, a tela retorna ao estado inicial mostrando novamente a leitura dos sensores. Preciso de ajuda!

SEgue abaixo o código, comentado:

//Inicialização das bibliotecas
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <OneWire.h>
#include <DallasTemperature.h>

//Define pino digital 3 para entrada do sensor de temperatura
#define REQ_BUF_SZ 60
#define ONE_WIRE_BUS 3

// Define uma instancia do oneWire para comunicacao e resgata o valor do sensor de temperatura
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };// MAC address
IPAddress ip(192, 168, 0, 108); // IP address
EthernetServer server(80);
File webFile;
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP
char req_index = 0;
boolean LED_state[4] = {0}; //declara o pino digital 4 para comunicação com o cartão SD

void setup(){
// utiliza pino digital 10 para comunicação com o shield ethernet
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
//inicializa a saida serial
Serial.begin(9600);
sensors.begin();

// Localiza e mostra enderecos dos sensores
Serial.print("Foram encontrados ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" sensores.");
if (!sensors.getAddress(sensor1, 0))
Serial.println("Sensores nao encontrados !");
// Mostra o endereco do sensor encontrado no barramento
Serial.print("Endereco sensor: ");
mostra_endereco_sensor(sensor1);
Serial.println();

// inicializa cartão SD
Serial.println("Inicializando SD...");
if (!SD.begin(4)) {
Serial.println("ERROR - SD card!");// falha na inicialização
return;
}
Serial.println("SUCCESS - SD card inicializado.");
// checa a existência do arquivo index
if (!SD.exists("index.htm")) {
Serial.println("ERROR - index.htm file!");
return; // não encontra o arquivo
}
Serial.println("SUCCESS - ok index.htm file.");

//Saídas digitais
pinMode(6, OUTPUT); //Resistor
pinMode(7, OUTPUT); //Válvula
pinMode(8, OUTPUT); //Bomba de vácuo (demonstrado apenas pelo led)
//Devido a lógica reversa da placa de relés, deve-se inicializar com as saídas em nível alto
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(7,HIGH);

//Inicializa o servidor
Ethernet.begin(mac, ip);
server.begin();
}

//Resgate do endereço hexadecimal do sensor
void mostra_endereco_sensor(DeviceAddress deviceAddress){
for (uint8_t i = 0; i < 8; i++)
{
// Adiciona zeros se necessário
if (deviceAddress[i] < 16) Serial.print("0");
Serial.print(deviceAddress[i], HEX);
}
}

void loop(){
EthernetClient client = server.available(); //Verifica se o cliente está disponível
if (client){
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (req_index < (REQ_BUF_SZ - 1)){
HTTP_req[req_index] = c;
req_index++;
}

if (c == '\n' && currentLineIsBlank){ //Parametros para inicializar o carregamento da página html
client.println("HTTP/1.1 200 OK");
// Ajax request - send XML file
if (StrContains(HTTP_req, "ajax_inputs")) { //send rest of HTTP header
client.println("Content-Type: text/xml");
client.println("Connection: keep-alive");
client.println();
// envia arquivo xml
XML_response(client);
}
else{
client.println("Content-Type: text/html");
client.println("Connection: mantenha");
client.println();
// envia a pag
webFile = SD.open("index.htm"); // abre a página html pelo cartão SD
if (webFile) {
while (webFile.available()) {
client.write(webFile.read()); // send web page to client
}
webFile.close();
}
}
Serial.print(HTTP_req);
req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
break;
}

if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1); // atualiaza de 1 em 1 segundo
client.stop(); //fecha
}
}

void XML_response(EthernetClient cl){ //Inicializa Conversa dos sensores com a página HTML

sensors.requestTemperatures(); //resgata valor da temperatura
float tempC = sensors.getTempC(sensor1); // Coloca temperatura numa variavel
float analog_val; //variavel para armazenar o dado dos sensores
int count;

cl.print("<?xml version = \"1.0\" ?>");
cl.print("<inputs>"); // leitura dos sensores

for (count = 2; count <= 3; count++) { // A2 to A4

if(count==2){
analog_val = tempC; //o primeiro sensor é o de temperatura
}
else {
analog_val = analogRead(count); //o segundo sensor é o de pressão, atrelado ao pino 3 analógico
}
cl.print("<analog>"); //envia para a página HTML a leitura realizada
cl.print(analog_val);
cl.println("</analog>");
}
cl.print("</inputs>"); //encerra a leitura de sensores

delay(100);
if (StrContains(HTTP_req, "Iniciar=1")){
InicioDoCiclo1();
}

}

void InicioDoCiclo1(){

int Tempo = 0; //tempo de permanencia da temperatura em 121 graus (20 minutos)
Retornar:
sensors.requestTemperatures(); //resgata valor da temperatura
float tempA = sensors.getTempC(sensor1); // Coloca temperatura numa variavel
while (Tempo< 20){ // se o tempo for menor que 20 minutos
//Inicia o processo de aquecimento e pressurização da câmara
while (tempA <= 30){ // se a temperatura for menor que 121º C
digitalWrite(6, LOW); // liga a resistencia
delay(1000);
goto Retornar;
}
while (tempA > 30) {
digitalWrite(6, HIGH); //Desliga a resistencia
delay(1000); //conta 1 segundo
Tempo = Tempo+1; //adiciona 1 segundo ao Tempo
goto Retornar;
}
}

delay (100); //quebra as ações do microcontrolador para reduzir leituras simultaneas

while(Tempo >=20 && analogRead(3)>=41 ){ //se o tempo for maior ou igual a 20 minutos
//e a leitura do sensor de pressão for maior ou igual a 1 KPa
digitalWrite(7, LOW); //liga a válvula
digitalWrite(6, HIGH); //desliga a resistência
delay(1000);
goto Retornar;
}

delay (100); //quebra as ações do microcontrolador para reduzir leituras simultaneas

while(Tempo >=20 && analogRead(3)<41 && Tempo <=45){ //se o tempo for maior ou igual a 20 minutos
//e a leitura do sensor de pressã for menor que 1 KPa
//e o tempo for menor ou igual a 45 minutos (15 minutos de secagem)
//inicia o processo de secagem
digitalWrite(6, LOW); //religa a resistência
delay(1000); //conta 1 segundo
Tempo = Tempo+1; //adiciona 1 segundo ao tempo
goto Retornar;
}

if(Tempo>45){ //Se o tempo for maior que 45 minutos
digitalWrite(6, HIGH); //desliga a resistência
digitalWrite(7, HIGH); //desliga a válvula
asm volatile (" jmp 0"); //Reinicia Programa
}
}


void StrClear(char *str, char length){
for (int i = 0; i < length; i++) {
str[i] = 0;
}
}

char 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;
}

Exibições: 491

Responder esta

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço