MQTT stopt het programma
21 berichten
• Pagina 1 van 3 • 1, 2, 3
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
MQTT stopt het programma
hallo,
ik heb een programma gemaakt om met mqtt te communiceren, en ook rfid te gebruiken.
als mqtt offline is dan werkt mijn rfid niet meer.
ik denk zelf dat het komt door de delay(5000); welke in de reconnect verwerkt is van de mqtt verbinding
hieronder mijn sketch en misschien dat iemand mijn kan helpen om de delay te vervangen voor millis?
cpp code
void display ben ik nog mee bezig deze werkt nog niet helemaal lekker
ik heb een programma gemaakt om met mqtt te communiceren, en ook rfid te gebruiken.
als mqtt offline is dan werkt mijn rfid niet meer.
ik denk zelf dat het komt door de delay(5000); welke in de reconnect verwerkt is van de mqtt verbinding
hieronder mijn sketch en misschien dat iemand mijn kan helpen om de delay te vervangen voor millis?
cpp code
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#define outRed 32
#define outGreen 33
#define outBlue 34
#define outLock 30
#define OnlineStatus 31
#define RST_PIN 49
#define SS_PIN 53
boolean MQTTLockStatus = 0;
boolean MasterCardLockStatus = 0;
unsigned long locktime;
int DisplayStatus = 0;
MFRC522 mfrc522(SS_PIN, RST_PIN);
char message_buff[100];
const int cardArrSize = 10;
const int cardSize = 4;
byte cardArr[cardArrSize][cardSize];
byte masterCard[cardSize] = {190, 144, 143, 171}; // dit is de witte pinpaskaart
byte readCard[cardSize];
// Update these with values suitable for your network.
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xBE };
IPAddress ip(192, 168, 2, 82);
IPAddress server(192, 168, 2, 140);
EthernetClient ethClient;
PubSubClient client(ethClient);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
SPI.begin();// Init SPI bus
mfrc522.PCD_Init();// Init MFRC522 card
Serial.println("Initialiased RFID reader");
Wire.begin();
pinMode(OnlineStatus, OUTPUT);
pinMode(outLock, OUTPUT);
pinMode(outRed, OUTPUT);
pinMode(outGreen, OUTPUT);
pinMode(outBlue, OUTPUT);
digitalWrite(OnlineStatus, HIGH);
digitalWrite(outRed, HIGH);
digitalWrite(outGreen, HIGH);
digitalWrite(outBlue, HIGH);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("RFID Scanner");
lcd.setCursor(3, 1);
lcd.print("Opstarten");
delay(2000);
digitalWrite(OnlineStatus, LOW);
digitalWrite(outLock, LOW);
digitalWrite(outRed, LOW);
digitalWrite(outGreen, LOW);
digitalWrite(outBlue, LOW);
client.setServer(server, 1883);
client.setCallback(callback);
Ethernet.begin(mac, ip);
Serial.print("Ethernet is at ");
Serial.println(Ethernet.localIP());
delay(1500);
}
//----------------------------------------------------------------------------------------------------//
void loop()
{
if (!client.connected()) {
reconnect();
}
client.loop();
lock();
readRfid();
display();
}
//-------------------------------------------------------------------------------------------------------//
void callback(char* topic, byte* payload, unsigned int length)
{
byte* p = (byte*)malloc(length);
// Copy the payload to the new buffer
memcpy(p, payload, length);
//----------------------------------------------------------signaal vanaf een topic---------------------------------------//
//iets komt binnen op topic "arduino1/out1", check of het 0 of 1 is
if (strcmp(topic, "/deuropener1/lock") == 0)
{
switch ((int)(p[0] - '0'))
{
case 0:
MQTTLockStatus = 0;
break;
case 1:
MQTTLockStatus = 1;
break;
default:
break;
}
}
//------------------------------------------------------------------------------------------------//
free(p);// Free the memory
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("deuropener")) {
Serial.println("connected");
digitalWrite (OnlineStatus, HIGH);
DisplayStatus = 0;
/*
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQTT Connection");
lcd.setCursor(5, 1);
lcd.print("Online");
*/
// Once connected, publish an announcement...
client.publish("/arduino/message", "deuropener Online");
// ... and resubscribe
//--------------------------------------------------hieronder de gebruikte topics zetten----------------------------------------//
client.subscribe("inTopic");
client.subscribe("/deuropener1/lock");
client.subscribe("/rfid/uid");
client.subscribe("/arduino/message");
client.subscribe("/arduinos/ping");
//------------------------------------------------------------------------------------------------------------------------------//
} else {
digitalWrite (OnlineStatus, LOW);
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQTT Connection");
lcd.setCursor(5, 1);
lcd.print("Offline");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void readRfid()
{
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())return;
String rfidUid = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
rfidUid += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
rfidUid += String(mfrc522.uid.uidByte[i], HEX);
}
Serial.print("Tap card key: ");
Serial.println(rfidUid);
rfidUid.toCharArray(message_buff, rfidUid.length() + 1);
client.publish("/rfid/uid", message_buff);
DisplayStatus = 2;
if (rfidUid.indexOf("be908fab") >= 0) {
DisplayStatus = 1;
delay(1000);
MasterCardLockStatus = 1;
}
mfrc522.PICC_HaltA(); // Halt PICC
mfrc522.PCD_StopCrypto1();// Stop encryption on PCD
}
//--------------------------------------------------------------//
void lock()
{
if (MQTTLockStatus || MasterCardLockStatus)
{
digitalWrite(outLock, HIGH);
DisplayStatus = 3;
delay(3000);
client.publish("/deuropener1/lock", "0");
MasterCardLockStatus = 0;
}
else
{
digitalWrite(outLock, LOW);
DisplayStatus = 0;
}
}
void display()
{
switch (DisplayStatus) {
case 0:
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("System Standby");
lcd.setCursor(2, 1);
lcd.print("Swipe Card");
break;
case 1:
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Mastercard");
lcd.setCursor(3, 1);
lcd.print("Valid Card");
break;
case 2:
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Waiting.....");
lcd.setCursor(0, 1);
lcd.print("Check Database");
break;
case 3:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Toegeng Verleend");
lcd.setCursor(2, 1);
lcd.print("Door Unlocked");
break;
default:
break;
}
delay(100);
}
void display ben ik nog mee bezig deze werkt nog niet helemaal lekker
Advertisement
- nicoverduin
-
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: MQTT stopt het programma
Het is niet alleen de delay die het veroorzaakt:
cpp code
Je blijft sowieso in de functie loopen omdat je wacht tot je een reconnect hebt. Zie regel 3.
De delay kun je sowieso eruit knikkeren.
En dan millis toevoegen:
cpp code
loop() wijzigen in :
cpp code
En uit de reconnect() de eerste loop (regel3) en sluit accolade eruit halen
cpp code
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("deuropener")) {
Serial.println("connected");
digitalWrite (OnlineStatus, HIGH);
DisplayStatus = 0;
/*
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQTT Connection");
lcd.setCursor(5, 1);
lcd.print("Online");
*/
// Once connected, publish an announcement...
client.publish("/arduino/message", "deuropener Online");
// ... and resubscribe
//--------------------------------------------------hieronder de gebruikte topics zetten----------------------------------------//
client.subscribe("inTopic");
client.subscribe("/deuropener1/lock");
client.subscribe("/rfid/uid");
client.subscribe("/arduino/message");
client.subscribe("/arduinos/ping");
//------------------------------------------------------------------------------------------------------------------------------//
} else {
digitalWrite (OnlineStatus, LOW);
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQTT Connection");
lcd.setCursor(5, 1);
lcd.print("Offline");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
Je blijft sowieso in de functie loopen omdat je wacht tot je een reconnect hebt. Zie regel 3.
De delay kun je sowieso eruit knikkeren.
En dan millis toevoegen:
cpp code
uint32_t timer = 0; // deze 3 regels bij de globale variabelen toevoegen
boolean timerLoopt = false;
const uint32_t WACHTTIJD = 5000;
loop() wijzigen in :
cpp code
void loop()
{
if (!client.connected()) {
if (!timerLoopt) { // timer loopt nog niet dus start de timer
timer = millis(); // start de timer
timerLoopt = true;
} else {
//
// timer loopt al dus kijk of we voorbij de wachttijd zijn
//
if ((millis() - timer) > WACHTTIJD) {
reconnect(); // kijk of we kunnen reconnecten
timerLoopt = false; // en zet de timer weer uit
}
} else {
client.loop(); // alleen de client loop doen als je een connectie hebt
}
lock();
readRfid();
display();
}
En uit de reconnect() de eerste loop (regel3) en sluit accolade eruit halen
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
Re: MQTT stopt het programma
hallo nico
bedankt voor je reactie, ik snap alleen niet wat jij bedoelt met wat ik uit reconnect() moet halen?
cpp code
moet ik hier ook delay weghalen?
bedankt voor je reactie, ik snap alleen niet wat jij bedoelt met wat ik uit reconnect() moet halen?
cpp code
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("deuropener")) {
Serial.println("connected");
digitalWrite (OnlineStatus, HIGH);
// Once connected, publish an announcement...
client.publish("/arduino/message", "deuropener Online");
// ... and resubscribe
//--------------------------------------------------hieronder de gebruikte topics zetten----------------------------------------//
client.subscribe("inTopic");
client.subscribe("/deuropener1/lock");
client.subscribe("/rfid/uid");
client.subscribe("/arduino/message");
client.subscribe("/arduinos/ping");
//------------------------------------------------------------------------------------------------------------------------------//
} else {
digitalWrite (OnlineStatus, LOW);
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQTT Connection");
lcd.setCursor(5, 1);
lcd.print("Offline");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
moet ik hier ook delay weghalen?
- nicoverduin
-
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: MQTT stopt het programma
Yep
Dit zou de functie nu worden :
cpp code
Dit zou de functie nu worden :
cpp code
void reconnect() {
// Loop until we're reconnected
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("deuropener")) {
Serial.println("connected");
digitalWrite (OnlineStatus, HIGH);
// Once connected, publish an announcement...
client.publish("/arduino/message", "deuropener Online");
// ... and resubscribe
//--------------------------------------------------hieronder de gebruikte topics zetten----------------------------------------//
client.subscribe("inTopic");
client.subscribe("/deuropener1/lock");
client.subscribe("/rfid/uid");
client.subscribe("/arduino/message");
client.subscribe("/arduinos/ping");
//------------------------------------------------------------------------------------------------------------------------------//
} else {
digitalWrite (OnlineStatus, LOW);
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQTT Connection");
lcd.setCursor(5, 1);
lcd.print("Offline");
}
}
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
Re: MQTT stopt het programma
geprobeerd maar het werkte er eigenlijk alleen maar minder door...
hieronder een sketch wat ik gebruik als basis en aangezien hier al de fout ligt pas ik liever deze eerst aan
cpp code
als ik doe zoals nico het zegt dan zorgt hij ervoor dat bijna de broker vast loopt.... en ik kan geen commandos meer sturen dat een uitgang hoog of laag gaat.
hij komt nog wel online maar als ik de utp eruit haal nadat hij online is gekomen dan gaat hij niet meer offline en een reconnect proberen
hieronder een sketch wat ik gebruik als basis en aangezien hier al de fout ligt pas ik liever deze eerst aan
cpp code
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include "DHT.h"
#define inbutton 2
#define out1 3
#define out2 4
#define OnlineStatus 5
#define DHTPIN 6
// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
unsigned long time1;
unsigned long time2;
unsigned long readTime;
// Update these with values suitable for your network.
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xDE };
IPAddress ip(192, 168, 2, 81);
IPAddress server(192, 168, 2, 140);
EthernetClient ethClient;
PubSubClient client(ethClient);
void setup()
{
Serial.begin(9600);
dht.begin();
pinMode(OnlineStatus, OUTPUT);
pinMode(out1, OUTPUT);
pinMode(out2, OUTPUT);
pinMode(inbutton, INPUT);
digitalWrite(out1, LOW);
digitalWrite(out2, LOW);
digitalWrite(OnlineStatus, LOW);
client.setServer(server, 1883);
client.setCallback(callback);
Ethernet.begin(mac, ip);
// Allow the hardware to sort itself out
delay(1500);
}
void loop()
{
if (!client.connected()) {
reconnect();
}
client.loop();
Publish();
sensorRead();
}
void callback(char* topic, byte* payload, unsigned int length)
{
byte* p = (byte*)malloc(length);
// Copy the payload to the new buffer
memcpy(p, payload, length);
//----------------------------------------------------------signaal vanaf een topic---------------------------------------//
//iets komt binnen op topic "arduino1/out1", check of het 0 of 1 is
if (strcmp(topic, "/arduino1/out1") == 0)
{
switch ((int)(p[0] - '0'))
{
case 0:
digitalWrite(out1, LOW);
client.publish("/arduino1/out1/status", "0");
break;
case 1:
digitalWrite(out1, HIGH);
client.publish("/arduino1/out1/status", "1");
break;
default:
break;
}
}
//iets komt binnen op topic "arduino1/out2", check of het 0 of 1 is
if (strcmp(topic, "/arduino1/out2") == 0)
{
switch ((int)(p[0] - '0'))
{
case 0:
digitalWrite(out2, LOW);
client.publish("/arduino1/out2/status", "0");
break;
case 1:
digitalWrite(out2, HIGH);
client.publish("/arduino1/out2/status", "1");
break;
default:
break;
}
}
//iets komt binnen op topic "arduino1/scene", check of het 0, 1 of 2 is
if (strcmp(topic, "/arduino1/scene") == 0)
{
switch ((int)(p[0] - '0'))
{
case 0:
Serial.println("0");
client.publish("/arduino1/scene/status", "0");
break;
case 1:
Serial.println("1");
client.publish("/arduino1/scene/status", "1");
break;
case 2:
Serial.println("2");
client.publish("/arduino1/scene/status", "2");
break;
default:
break;
}
}
//------------------------------------------------------------------------------------------------//
free(p);// Free the memory
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("arduino1Client")) {
Serial.println("connected");
digitalWrite (OnlineStatus, HIGH);
// Once connected, publish an announcement...
client.publish("/arduino/message", "arduino1 Online");
// ... and resubscribe
//--------------------------------------------------hieronder de gebruikte topics zetten----------------------------------------//
client.subscribe("inTopic");
client.subscribe("/arduino1/in");
client.subscribe("/arduino1/out1");
client.subscribe("/arduino1/out2");
client.subscribe("/arduino2/out1");
client.subscribe("/arduino1/scene");
client.subscribe("/arduino1/dht/temperature");
client.subscribe("/arduino1/dht/humidity");
client.subscribe("/arduino/message");
client.subscribe("/arduinos/ping");
//------------------------------------------------------------------------------------------------------------------------------//
}
else
{
digitalWrite (OnlineStatus, LOW);
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void Publish()
{
if (millis() > (time1 + 1000))
{
time1 = millis();
if (digitalRead(inbutton))
{
client.publish("/arduino2/out1", "1");
//Serial.println("input 1 = 1");
}
else
{
client.publish("/arduino2/out1", "0");
//Serial.println("input 1 = 0");
}
}
}
void sensorRead()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
float hic = dht.computeHeatIndex(t, h, false);
if (millis() > (time2 + 10000))
{
time2 = millis();
char buffer[10];
dtostrf(t, 0, 0, buffer);
client.publish("/arduino1/dht/temperature", buffer);
dtostrf(h, 0, 0, buffer);
client.publish("/arduino1/dht/humidity", buffer);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
}
}
als ik doe zoals nico het zegt dan zorgt hij ervoor dat bijna de broker vast loopt.... en ik kan geen commandos meer sturen dat een uitgang hoog of laag gaat.
hij komt nog wel online maar als ik de utp eruit haal nadat hij online is gekomen dan gaat hij niet meer offline en een reconnect proberen
- nicoverduin
-
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: MQTT stopt het programma
Dus je hebt ons eerst een andere sketch voorgeschoteld?
Re: MQTT stopt het programma
Je gebruikt van millis() is verkeerd.
Onthoudt het huidige tijdstip met: unsigned long previousMillis = millis();
Bereken het verschil met: millis() - previousMillis
Check of de tijd verstreken is met: millis() - previousMillis > 1000
De functies in de loop() draaien zomaar zonder vast interval, afhankelijk van de delay() in de functies.
Ik zou liever iedere functie laten draaien op een interval die nodig is.
Bijvoorbeeld de MQTT 2 keer per seconde uploaden, en de DHT11 maar één keer per twee seconden opvragen.
Het is toegestaan om meer meerdere millis() te gebruiken en zelfs in meerdere lagen onder elkaar, maar het is nu onduidelijk.
Onthoudt het huidige tijdstip met: unsigned long previousMillis = millis();
Bereken het verschil met: millis() - previousMillis
Check of de tijd verstreken is met: millis() - previousMillis > 1000
De functies in de loop() draaien zomaar zonder vast interval, afhankelijk van de delay() in de functies.
Ik zou liever iedere functie laten draaien op een interval die nodig is.
Bijvoorbeeld de MQTT 2 keer per seconde uploaden, en de DHT11 maar één keer per twee seconden opvragen.
Het is toegestaan om meer meerdere millis() te gebruiken en zelfs in meerdere lagen onder elkaar, maar het is nu onduidelijk.
- nicoverduin
-
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: MQTT stopt het programma
De wijzigingen op zich waren goed. Je zou alleen nog een timer kunnen toevoegen wanneer je naar de MQTT schrijft. Bijv. 1x per seconde oid. Nu zou hij inderdaad continu blijven pompen met data. Maar de wijzigingen zijn dus niet anders als in die andere sketch. Dus leef je uit. En de opmerkingen van Koepel zijn juist mbt de toepassing van millis() zoals je in jouw laatste sketch doet. In mijn voorbeeld (loop()) kun je de correcte wijze vinden.
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
Re: MQTT stopt het programma
nico, zoals ik in mijn vorige post begonnen ben staat daar dat ik een basis sketch heb gebouwd welke juist werkt, behalve als mqtt verbindin weg is... maar hier kwam ik toen niet achter omdat ik alleen maar mqtt functies had (afgezien van serial.print)
de DHT sensor wordt 1x per 10 seconden geupload en dit werkt ''perfect'' in mijn ogen mischien wat schoonheidsfoutjes maar daar kan ik van leren
de ingang waar een button op aangesloten is upload 1x per seconden... lijkt mij dan toch de juiste manier?
ik ga vanavond even aan de slag met de eerdere uitleg van nico, als ik deze dan heb dan post ik hem wel hoe of wat er misschien fout aan is?
de DHT sensor wordt 1x per 10 seconden geupload en dit werkt ''perfect'' in mijn ogen mischien wat schoonheidsfoutjes maar daar kan ik van leren
de ingang waar een button op aangesloten is upload 1x per seconden... lijkt mij dan toch de juiste manier?
ik ga vanavond even aan de slag met de eerdere uitleg van nico, als ik deze dan heb dan post ik hem wel hoe of wat er misschien fout aan is?
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
Re: MQTT stopt het programma
ik heb nu deze sketch aangepast en hij blijft bij het checken hangen op de loop dat daar een fout in zou zitten
cpp code
ik heb de accolades gechecked en ik denk dat er 1 mist.... maar dan nog doet hij het niet (regel 80)
cpp code
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include "DHT.h"
#define inbutton 2
#define out1 3
#define out2 4
#define OnlineStatus 5
#define DHTPIN 6
// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
unsigned long time1;
unsigned long time2;
unsigned long readTime;
uint32_t timer = 0; // deze 3 regels bij de globale variabelen toevoegen
boolean timerLoopt = false;
const uint32_t WACHTTIJD = 5000;
// Update these with values suitable for your network.
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xDE };
IPAddress ip(192, 168, 2, 81);
IPAddress server(192, 168, 2, 140);
EthernetClient ethClient;
PubSubClient client(ethClient);
void setup()
{
Serial.begin(9600);
dht.begin();
pinMode(OnlineStatus, OUTPUT);
pinMode(out1, OUTPUT);
pinMode(out2, OUTPUT);
pinMode(inbutton, INPUT);
digitalWrite(out1, LOW);
digitalWrite(out2, LOW);
digitalWrite(OnlineStatus, LOW);
client.setServer(server, 1883);
client.setCallback(callback);
Ethernet.begin(mac, ip);
// Allow the hardware to sort itself out
delay(1500);
}
void loop()
{
if (!client.connected()) {
if (!timerLoopt) { // timer loopt nog niet dus start de timer
timer = millis(); // start de timer
timerLoopt = true;
} else {
//
// timer loopt al dus kijk of we voorbij de wachttijd zijn
//
if ((millis() - timer) > WACHTTIJD) {
reconnect(); // kijk of we kunnen reconnecten
timerLoopt = false; // en zet de timer weer uit
}
} else {
client.loop(); // alleen de client loop doen als je een connectie hebt
} //deze accolade mis ik denk ik? maar dan nog zegt hij bij de uploaden expected '}' before else (regel 78)
}
Publish();
sensorRead();
}
void callback(char* topic, byte * payload, unsigned int length)
{
byte* p = (byte*)malloc(length);
// Copy the payload to the new buffer
memcpy(p, payload, length);
//----------------------------------------------------------signaal vanaf een topic---------------------------------------//
//iets komt binnen op topic "arduino1/out1", check of het 0 of 1 is
if (strcmp(topic, "/arduino1/out1") == 0)
{
switch ((int)(p[0] - '0'))
{
case 0:
digitalWrite(out1, LOW);
client.publish("/arduino1/out1/status", "0");
break;
case 1:
digitalWrite(out1, HIGH);
client.publish("/arduino1/out1/status", "1");
break;
default:
break;
}
}
//iets komt binnen op topic "arduino1/out2", check of het 0 of 1 is
if (strcmp(topic, "/arduino1/out2") == 0)
{
switch ((int)(p[0] - '0'))
{
case 0:
digitalWrite(out2, LOW);
client.publish("/arduino1/out2/status", "0");
break;
case 1:
digitalWrite(out2, HIGH);
client.publish("/arduino1/out2/status", "1");
break;
default:
break;
}
}
//iets komt binnen op topic "arduino1/scene", check of het 0, 1 of 2 is
if (strcmp(topic, "/arduino1/scene") == 0)
{
switch ((int)(p[0] - '0'))
{
case 0:
Serial.println("0");
client.publish("/arduino1/scene/status", "0");
break;
case 1:
Serial.println("1");
client.publish("/arduino1/scene/status", "1");
break;
case 2:
Serial.println("2");
client.publish("/arduino1/scene/status", "2");
break;
default:
break;
}
}
//------------------------------------------------------------------------------------------------//
free(p);// Free the memory
}
void reconnect() {
// Loop until we're reconnected
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("arduino1Client")) {
Serial.println("connected");
digitalWrite (OnlineStatus, HIGH);
// Once connected, publish an announcement...
client.publish("/arduino/message", "arduino1 Online");
// ... and resubscribe
//--------------------------------------------------hieronder de gebruikte topics zetten----------------------------------------//
client.subscribe("inTopic");
client.subscribe("/arduino1/in");
client.subscribe("/arduino1/out1");
client.subscribe("/arduino1/out2");
client.subscribe("/arduino2/out1");
client.subscribe("/arduino1/scene");
client.subscribe("/arduino1/dht/temperature");
client.subscribe("/arduino1/dht/humidity");
client.subscribe("/arduino/message");
client.subscribe("/arduinos/ping");
//------------------------------------------------------------------------------------------------------------------------------//
}
else
{
digitalWrite (OnlineStatus, LOW);
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
}
}
void Publish()
{
if (millis() > (time1 + 1000))
{
time1 = millis();
if (digitalRead(inbutton))
{
client.publish("/arduino2/out1", "1");
client.publish("/arduino1/in", "1");
//Serial.println("input 1 = 1");
}
else
{
client.publish("/arduino2/out1", "0");
client.publish("/arduino1/in", "0");
//Serial.println("input 1 = 0");
}
}
}
void sensorRead()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
float hic = dht.computeHeatIndex(t, h, false);
if (millis() > (time2 + 10000))
{
time2 = millis();
char buffer[10];
dtostrf(t, 0, 0, buffer);
client.publish("/arduino1/dht/temperature", buffer);
dtostrf(h, 0, 0, buffer);
client.publish("/arduino1/dht/humidity", buffer);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
}
}
ik heb de accolades gechecked en ik denk dat er 1 mist.... maar dan nog doet hij het niet (regel 80)
21 berichten
• Pagina 1 van 3 • 1, 2, 3
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 92 gasten