• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Ethernet - wznawianie połączenia
#1
Napisałem prosty kod, który odczytuje ciśnienie i temperaturę z BMP180 i publikuje na serwerze MQTT ale mam problem - w przypadku odłączenia lan'u arduino nie potrafi wznowić połączenia z serwerem MQTT. Czy jest jakaś funkcja typu auto reconnect?

Kod:
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

float Tc=0;
float Pa=0;
#define MQTT_SERVER "192.168.1.1"
char TcString[6];
char PaString[6];
unsigned long time;

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x38 };
IPAddress ip(192, 168, 1, 2);

Adafruit_BMP085 bmp;

char message_buff[100];

EthernetClient ethClient;
PubSubClient client( MQTT_SERVER, 1883, callback, ethClient);

void setup() {
    byte i;
  Serial.begin(9600);
  delay( 500 );
 
  if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
  }
    while (!Serial) {;
  }

  Ethernet.begin(mac, ip);
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
    if (client.connect("arduinoClient")) {      // connecting to MQTT server
    Serial.println("Connected to MQTT");      // Milestone for connection debugging
  }
}


void callback(char* topic, byte* payload, unsigned int length) {
  int i = 0;
  for(i=0; i<length; i++) {
    message_buff[i] = payload[i];
  }
  message_buff[i] = '\0';
  String msgString = String(message_buff);
  }
}
      
void loop() {

  client.loop();    
  if (millis() > (time + 15000)) {
    time = millis();
  Serial.print("Temperature = ");
    Tc=bmp.readTemperature();
    dtostrf(Tc, 2, 2, TcString);
    Serial.print(Tc);
    Serial.println(" *C");
    client.publish("/test/dom/temp1/",TcString);
       
    Serial.print("Pressure = ");
    Pa=bmp.readPressure()/100;
    if(Pa<1000) {
    dtostrf(Pa, 2, 2, PaString);
    } else {
    dtostrf(Pa, 1, 2, PaString);  
    }
    Serial.print(Pa);
    Serial.println(" hPa");
    client.publish("/test/dom/cisnienie/",PaString);
    Serial.println();
  delay(1000);
}
}
 
Odpowiedź
#2
jak naciśniesz reset w arduino połączy się ??
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#3
(01-11-2015, 22:59)JasQ napisał(a): jak naciśniesz reset w arduino połączy się ??

tak, problem jest tylko jak odłączę kabel lan albo restartuje serwer mqtt
 
Odpowiedź
#4
Teoretycznie powinien się na moim kodzie restartować co minutę sprawdź

Kod:
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

float Tc=0;
float Pa=0;
#define MQTT_SERVER "192.168.1.1"
char TcString[6];
char PaString[6];
unsigned long time;

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x23, 0x38 };
IPAddress ip(192, 168, 1, 2);

Adafruit_BMP085 bmp;

char message_buff[100];

EthernetClient ethClient;
PubSubClient client( MQTT_SERVER, 1883, callback, ethClient);

long restart_ms = 0 ;
long MS = 0;

void setup() {
  
  byte i;
  Serial.begin(9600);
  delay( 500 );

  if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
  }
    while (!Serial) {;
  }

  Ethernet.begin(mac, ip);
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
    if (client.connect("arduinoClient")) {      // connecting to MQTT server
    Serial.println("Connected to MQTT");      // Milestone for connection debugging
  }
}


void callback(char* topic, byte* payload, unsigned int length) {
  int i = 0;
  for(i=0; i<length; i++) {
    message_buff[i] = payload[i];
  }
  message_buff[i] = '\0';
  String msgString = String(message_buff);
  }
}
      
void loop() {

  MS = millis();

  if ( (MS - restart_ms)/1000 > 60 ){restart_ms = MS;restart();}

  client.loop();    
  if (millis() > (time + 15000)) {
    time = millis();
  Serial.print("Temperature = ");
    Tc=bmp.readTemperature();
    dtostrf(Tc, 2, 2, TcString);
    Serial.print(Tc);
    Serial.println(" *C");
    client.publish("/test/dom/temp1/",TcString);
      
    Serial.print("Pressure = ");
    Pa=bmp.readPressure()/100;
    if(Pa<1000) {
    dtostrf(Pa, 2, 2, PaString);
    } else {
    dtostrf(Pa, 1, 2, PaString);  
    }
    Serial.print(Pa);
    Serial.println(" hPa");
    client.publish("/test/dom/cisnienie/",PaString);
    Serial.println();
  delay(1000);
  }
}

void restart(){
  
   byte i;
    if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
  }
    while (!Serial) {;
  }

  Ethernet.begin(mac, ip);
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
    if (client.connect("arduinoClient")) {      // connecting to MQTT server
    Serial.println("Connected to MQTT");      // Milestone for connection debugging
    }
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#5
Znalazłem taki oto kod odpowiadający za weryfikację połączenia ale coś z nim jest nie tak bo u mnie nie działa nawet gdy cały program wrzuciłem na płytkę. Zależy mi na wznawianiu połączenia tylko w przypadku jego przerwania zamiast na stałym resetowaniu.
Cytat:/*
konieczna weryfikacja czy mamy aktywne połączenie
jeśli nie, trzeba je odnowić
*/
boolean connected = mqtt_client.connected();
if (!connected) {
initializeMqtt();
}
char ssid[state.length()+1];
state.toCharArray(ssid, state.length()+1);
boolean publishState = mqtt_client.publish("/houseIn", ssid);
Serial.print(" published: ");
Serial.println(publishState);
}

Cały kod:
http://technika-laika.blogspot.com/2014/...nding.html
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości