Arduino Uno + Ethernet Shield V1.1 (ENC28j60) Trava com o tempo

Ola pessoal o seguinte:

estou usando arduino Uno(Original) e Ethernet Shield V1.1 comprada no Ebay

e com sketch do arduino:

#include <enc28j60.h>
#include <etherShield.h>
#include <ip_arp_udp_tcp.h>
#include <net.h>

#include <ETHER_28J60.h>


// A simple web server that turn an LED on or off"

int outputPin = 7;

static uint8_t mac[6] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 

static uint8_t ip[4] = { 192, 168, 1, 122}; // IP address for the webserver

static uint16_t port = 85; // Use port 85 - the standard for HTTP

ETHER_28J60 e;

void setup(){ 
  e.setup(mac, ip, port);
  pinMode(outputPin, OUTPUT);
  
}

void loop(){
  
  char* params = "";
  if (params = e.serviceRequest()){
 
    if (strcmp(params, "?led=on") == 0){
      
      digitalWrite(outputPin, 1);
      delay(200);
      digitalWrite(outputPin, 0);      
      e.print("oks");

    }else{
       e.print("fail");
    }
    
    e.respond();
    
  }
  Sleepy::LoseSomeTime(10); 
}

sendo que estou usando as bibliotecas:

libs

PROBLEMA:

  • Apos um tempo ele simplesmente para de responder
  • Meu Switch Reconhece como 10Mbs

Me ajudem por favor e desde ja Agradeço.

O que é suposto fazer a linha:

  Sleepy::LoseSomeTime(10);

?

Isto estava no programa original?

Recomendo que use esta biblioteca: GitHub - ntruchsess/arduino_uip: UIPEthernet: A plugin-replacement of the stock Arduino Ethernet library for ENC28J60 shields and breakout boards. Full support for persistent (streaming) TCP-connections and UDP (Client and Server each), ARP, ICMP, DHCP and DNS. Build around Adam Dunkels uIP Stack. Further developed version can be found on https://github.com/UIPEthernet/UIPEthernet

luisilva:

e da biblioteca jeelib na qual poe a Arduino para dormir(Economia de bateria) em vez de delay();

Duvido que isso funcione. Para que serve o operador '::' em C++? O que está a fazer essa linha? Não consegue fazer isso de outra forma?

:: e uma chamada de método pelo que parece de uma file especifico(Sleepy). Desculpe mas não tenho certeza em c++ pois estou acostumado com java e estou aprendendo agora c++.

E uma definicao de metodo...

O que pode estar a acontecer e o Arduino ignorar isso. Ja experimentaste aumentar a temporizacao para ver qual o efeito?

Mas o principal problema e que ta congelando com o tempo não sei explicar. Funciona ele responde porem apos um tempo ele para de responder. mesmo removendo o Sleepy::LoseSomeTime(10); ele trava. acho que vou testar o UIPlib postado pelo FernandoGarcia. assim que chegar em casa vou testar espero que funcione.

FernandoGarcia:
Recomendo que use esta biblioteca: GitHub - ntruchsess/arduino_uip: UIPEthernet: A plugin-replacement of the stock Arduino Ethernet library for ENC28J60 shields and breakout boards. Full support for persistent (streaming) TCP-connections and UDP (Client and Server each), ARP, ICMP, DHCP and DNS. Build around Adam Dunkels uIP Stack. Further developed version can be found on https://github.com/UIPEthernet/UIPEthernet

Fernando você poderia me ajudar se não for pedir de mais. gostaria de receber um parâmetro fazer um simples if nele e retornar 'ok' ou 'fail' mas essa biblioteca não consegui fazer.

Não concordo com esta linha:

static uint16_t port = 85; // Use port 85 - the standard for HTTP

tem a certeza que não devia ser 80 em vez de 85?

Eu tenho aqui um exemplo muito parecido a esse que funciona perfeitamente:

// A simple web server that always just says "Hello World"

#include "etherShield.h"
#include "ETHER_28J60.h"

int outputPin = 6;

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 1, 15};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.

static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

ETHER_28J60 e;

void setup()
{ 
  e.setup(mac, ip, port);
  pinMode(outputPin, OUTPUT);
}

void loop()
{
  char* params;
  if (params = e.serviceRequest())
  {
    e.print("<H1>Web Remote</H1>");
    if (strcmp(params, "?cmd=on") == 0)
    {
      digitalWrite(outputPin, HIGH);
      e.print("<A HREF='?cmd=off'>Turn off</A>");
    }
    else if (strcmp(params, "?cmd=off") == 0) // Modified -- 2011 12 15 # Ben Schueler
    {
      digitalWrite(outputPin, LOW);
      e.print("<A HREF='?cmd=on'>Turn on</A>");
    }
    e.respond();
  }
}

luisilva:
Não concordo com esta linha:

static uint16_t port = 85; // Use port 85 - the standard for HTTP

tem a certeza que não devia ser 80 em vez de 85?

Eu tenho aqui um exemplo muito parecido a esse que funciona perfeitamente:

// A simple web server that always just says "Hello World"

#include “etherShield.h”
#include “ETHER_28J60.h”

int outputPin = 6;

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};  // this just needs to be unique for your network,
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                         
static uint8_t ip[4] = {192, 168, 1, 15};                      // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.

static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

ETHER_28J60 e;

void setup()
{
  e.setup(mac, ip, port);
  pinMode(outputPin, OUTPUT);
}

void loop()
{
  char* params;
  if (params = e.serviceRequest())
  {
    e.print(“

Web Remote

”);
    if (strcmp(params, “?cmd=on”) == 0)
    {
      digitalWrite(outputPin, HIGH);
      e.print(“Turn off”);
    }
    else if (strcmp(params, “?cmd=off”) == 0) // Modified – 2011 12 15 # Ben Schueler
    {
      digitalWrite(outputPin, LOW);
      e.print(“Turn on”);
    }
    e.respond();
  }
}

Então essa linha e porque uso a porta 85 e nao a 80 devido ao meu servidor web na mesma rede.

Usando o uipLib

Exemplo:

#include <UIPEthernet.h>

EthernetServer server = EthernetServer(85);

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

  uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
  IPAddress myIP(192,168,1,122);

  Ethernet.begin(mac,myIP);

  server.begin();
}

void loop()
{
  size_t size;

  if (EthernetClient client = server.available())
    {
      while((size = client.available()) > 0)
        {
          uint8_t* msg = (uint8_t*)malloc(size);
          size = client.read(msg,size);
          Serial.write(msg,size);
          free(msg);
        }
      client.println("DATA from Server!");
      client.stop();
    }
}

por exemplo tenho a url 192.168.1.122:85?cmd=on

como faço para saber se esse parâmetro chegou?
tipo um if(cmd==‘on’){}else{}

Por favor me ajudem sou novato com Arduíno e não sei.

Veja se isso ajuda: LED Control with Arduino Ethernet Shield Web Server

Olá Pessoal, estou com o mesmo problema… vocês podem dar uma olhada no meu código… ele funciona bem… mas com o tempo ele para de responder de forma aleatória… chega a funcionar por diversos dias, mas acaba parando… sendo necessário realizar o reset… Estou usando o mega 2560 mini pro.

#include <UIPEthernet.h>
#include "PubSubClient.h" 


#define CLIENT_ID  "xxxxx"
#define PUBLISH_DELAY 2000
#define STATUS_DELAY 60000
#define USERNAME "yyyyyy"
#define PASSWORD "xxxxxx"

String ip = "";

int offset = 15;

uint8_t mac[6] = {0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF};

const int pin1 = A0;
const int pin2 = A2;
const int pin3 = A4; 
const int pin4 = A6;

float t1, t2, t3, t4, m1, m2, m3, m4; 
float res1 = 30000.0; 
float res2 = 7500.0; 

int r1, r2, r3, r4;

char status_iot[] = "working";
int status_1 = 0;
int status_2 = 0;
int status_3 = 0;
int status_4 = 0;

int status_1_old = 1;
int status_2_old = 1;
int status_3_old = 1;
int status_4_old = 1;

EthernetClient ethClient;
PubSubClient mqttClient;

unsigned long previousMillis;
unsigned long previousMillis_status;

void setup() {
  delay(10000);
  pinMode(pin1, INPUT); 
  pinMode(pin2, INPUT); 
  pinMode(pin3, INPUT); 
  pinMode(pin4, INPUT);
  Serial.begin(9600);
  Serial.println("Starting...")
  if (Ethernet.begin(mac) == 0) {
    Serial.println(F("Unable to configure Ethernet using DHCP"));
    for (;;);
  }
  
  Serial.println(F("Ethernet configured via DHCP"));
  Serial.print("IP address: ");
  Serial.println(Ethernet.localIP());
  Serial.println();
 
 //convert ip Array into String
  ip = String (Ethernet.localIP()[0]);
  ip = ip + ".";
  ip = ip + String (Ethernet.localIP()[1]);
  ip = ip + ".";
  ip = ip + String (Ethernet.localIP()[2]);
  ip = ip + ".";
  ip = ip + String (Ethernet.localIP()[3]);
 
  Serial.println(ip);
    
  mqttClient.setClient(ethClient);
  mqttClient.setServer("a.b.c.d", 1883); 
  
  Serial.println();
  Serial.println(F("Ready to send data"));
  
  previousMillis = millis();
  previousMillis_status = millis();
 }

void loop() {
 
   r1 = analogRead(pin1); 
   r2 = analogRead(pin2); 
   r3 = analogRead(pin3); 
   r4 = analogRead(pin4); 
   
   t1 = (r1 * 5.0) / 1024.0; 
   t2 = (r2 * 5.0) / 1024.0; 
   t3 = (r3 * 5.0) / 1024.0; 
   t4 = (r4 * 5.0) / 1024.0; 
   
   m1 = t1 / (res2/(res1+res2)); 
   m2 = t2 / (res2/(res1+res2)); 
   m3 = t3 / (res2/(res1+res2)); 
   m4 = t4 / (res2/(res1+res2));    

    if (m1 > offset) {
      status_1 = 1;
    }
    else status_1 = 0;
     
    if (m2 > offset) {
      status_2 = 1;
    }
    else status_2 = 0;
    
    if (m3 > offset) {
      status_3 = 1;
    }
    else status_3 = 0;
    
    if (m4 > offset) {
      status_4 = 1;
    }
    else status_4 = 0;
  
  if (dif(millis(), previousMillis) > PUBLISH_DELAY) {
    sendData();
    previousMillis = millis();
    if (dif(millis(), previousMillis_status) > STATUS_DELAY) {
    sendStatus();
    previousMillis_status = millis(); 
  }
  }
  
  mqttClient.loop();
}

void sendData() {
  char msgBuffer[20];
  if (mqttClient.connect(CLIENT_ID, USERNAME, PASSWORD)) {
    if (status_1 != status_1_old) {
      mqttClient.publish("/iot_counter_001_a/attrs/s1",dtostrf(status_1, 1, 0, msgBuffer));
      //Serial.print("Counter[1]status: ");
      //Serial.println(status_1);
      status_1_old = status_1;
    }
    if (status_2 != status_2_old) { 
      mqttClient.publish("/iot_counter_001_b/attrs/s1",dtostrf(status_2, 1, 0, msgBuffer));
      //Serial.print("Counter[2]status: ");
      //Serial.println(status_2);
      status_2_old = status_2;
    }
    if (status_3 != status_3_old) {
      mqttClient.publish("/iot_counter_001_c/attrs/s1",dtostrf(status_3, 1, 0, msgBuffer));
      //Serial.print("Counter[3]status: ");
      //Serial.println(status_3);
      status_3_old = status_3;
    }
    if (status_4 != status_4_old) {
      mqttClient.publish("/iot_counter_001_d/attrs/s1",dtostrf(status_4, 1, 0, msgBuffer));
      //Serial.print("Counter[4]status: ");
      //Serial.println(status_4);
      status_4_old = status_4;
    }
  }
}

void sendStatus() {
if (mqttClient.connect(CLIENT_ID, USERNAME, PASSWORD)) {
    if (millis() - previousMillis_status > STATUS_DELAY) {
      mqttClient.publish("/iot_counter_001_hb/attrs/hb",status_iot);
      Serial.print("[iot_counter_001] hb status: ");
      Serial.println(status_iot);
    }
  }
}

unsigned long dif(unsigned long now_millis, unsigned long begin_millis){
   if (now_millis > begin_millis){
    return (now_millis - begin_millis);
   }
   else{
    return (((pow(2,8*sizeof(now_millis))-1) - begin_millis) + now_millis);
   }
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.