mqtt puls uitgang
3 berichten
• Pagina 1 van 1
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
mqtt puls uitgang
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
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
Re: mqtt puls uitgang
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.
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.
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();
}
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.
Re: mqtt puls uitgang
ik snap timer=millis() niet, want die wordt niet getest.
paul deelen
shooter@home.nl
shooter@home.nl
3 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: itedipi, PatrickAbomi en 91 gasten