mqtt puls uitgang

Arduino specifieke Software
Berichten: 47
Geregistreerd: 24 Nov 2014, 19:47

mqtt puls uitgang

Berichtdoor corolla_g6 » 27 Jan 2017, 10:55

hallo,

ik ben bezig om via mqtt een uitgang te pulsen (relais) nu heb ik een basis sketch waar ik alles eerst in probeer en dan pas toepas in mijn huidige sketch waar het nodig is..

het werkt wel maar niet supernetjes en vloeiend soms reageert hij niet vooral als ik de tijd aanpas naar minder dan 1000ms

ik denk zelf dat het anders moet in het binnenkomen van het mqtt topic??

het gaat om de void pulsout

cpp code
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#include "DHT.h"

#define inbutton 2
#define out1 3
#define out2 4
#define outpuls 7
#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);

//-----------------------------------------timers---------------------------------------//

unsigned long time1;
unsigned long time2;
unsigned long time3;
unsigned long time4;
unsigned long readTime;

boolean puls = 0;
boolean pulsstatus = 0;

uint32_t timer = 0;
boolean timerLoopt = false;
const uint32_t WACHTTIJD = 5000;

byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xBE };
IPAddress ip(192, 168, 2, 90);
IPAddress server(192, 168, 2, 140);

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

EthernetClient ethClient;
PubSubClient client(ethClient);

//---------------------------------------------------------void setup------------------------------------------------//

void setup()
{
Serial.begin(9600);
dht.begin();
lcd.begin(20, 4);

pinMode(OnlineStatus, OUTPUT);
pinMode(out1, OUTPUT);
pinMode(out2, OUTPUT);
pinMode(outpuls, OUTPUT);
pinMode(inbutton, INPUT);

digitalWrite(out1, LOW);
digitalWrite(out2, LOW);
digitalWrite(outpuls, LOW);
digitalWrite(OnlineStatus, LOW);


client.setServer(server, 1883);
client.setCallback(callback);

Ethernet.begin(mac, ip);
// Allow the hardware to sort itself out
delay(1500);

}

//-------------------------------------topic uitlezen-----------------------------------------------------------------------//

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/puls") == 0)
{
switch ((int)(p[0] - '0'))
{
case 0:
Serial.println("0");
puls = 0;
break;
case 1:
Serial.println("1");
puls = 1;
break;
default:

break;
}
}



free(p);// Free the memory
}

//---------------------------------------------void reconnect-------------------------------------------------------//

void reconnect() {

Serial.print("Attempting MQTT connection...");
lcd.setCursor(0, 3);
lcd.print("MQTT Check ");

// Attempt to connect
if (client.connect("arduino1Client"))
{
lcd.setCursor(0, 3);
lcd.print("MQTT Online");
Serial.println("connected");
Serial.print("rc=");
Serial.println(client.state());
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("/arduino1/puls");
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");
lcd.setCursor(0, 3);
lcd.print("MQTT Fail ");

}
}

//-----------------------------------void publish-----------------------------------------------------//

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 loop-----------------------------------------------------------//


void loop()
{
if (!client.connected())
{
if (!timerLoopt)
{
timer = millis();
timerLoopt = true;
}
else
{
if ((millis() - timer) > WACHTTIJD)
{
reconnect();
timerLoopt = false;
}
}
}

else
{
client.loop();
}


Publish();
sensorRead();
regeling();
pulsout();


}

//---------------------------------------------void sensorread-----------------------------------------------------------//


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 ");
}

}

void pulsout()
{
if (puls)
{
pulsstatus = 1;

if (millis() > (time3 + 500))
{
time3 = millis();
pulsstatus = 0;

if (millis() > (time4 +2000))
{
time4 = millis();
puls = 0;
}

}
}

if (pulsstatus)
{
digitalWrite (outpuls, HIGH);
}
else
{
digitalWrite (outpuls, LOW);
}
}


void regeling()
{

}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: mqtt puls uitgang

Berichtdoor Koepel » 27 Jan 2017, 11:20

Er is iets met de globale structuur van het programma, en de timeouts en de structuur van de timeouts kloppen niet.

Om millis() goed te laten werken mag je alleen het huidige moment onthouden; Je mag het verschil berekenen; Maar je mag niet een tijd in de toekomst berekenen.
Code: Alles selecteren
previousMillis = millis();

if( millis() - previousMillis >= 5000)   // always the current millis minus a previous timestamp.
{
  previousMillis = millis();
}
Vaak heb ik een extra variabele 'currentMillis'.

De pulsout() functie begrijp ik niet :(

Als de MQTT niet connected is, dan ga je toch publish functies aanroepen ?

Ik gebruik zelf een paar manieren:
De timing doe ik bij voorkeur in de loop() en niet in de functies. In de loop() wordt dan bepaald op welk moment er wat gebeurt.
Wanneer de timing in een functie zit, dan noem ik die functie vaak iets met "update" in de naam. Die functie wordt dan door de loop() zo vaak mogelijk aangeroepen, en die functie bepaald of er iets moet gebeuren.
Bij verschillende delays achter elkaar, gebruik ik een variabele met "state" in de naam. Die variabele bepaald wat er gebeurt.
Een tweede delay met millis() binnen een andere delay met millis() in de pulsout() functie begrijp ik dan ook niet.


Mijn voorstel: Maak een overzichtelijke tekening van het grote geheel (of probeer het voor je te zien). Wanneer er geen verbinding is, stop dan ook met het aanroepen van de server. Werk vervolgens de afzonderlijke blokken uit waarbij je eventuele speciale timing of delays binnen zo'n blok doet.
Voeg commentaar toe, ik vraag me bijvoorbeeld af wat pulsout() eigenlijk zou moeten doen.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: mqtt puls uitgang

Berichtdoor shooter » 27 Jan 2017, 20:34

ik snap timer=millis() niet, want die wordt niet getest.
paul deelen
shooter@home.nl

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 18 gasten