hi i was trying to use the espDMX library i wake it work for som minutes with this code but after i get this errors which result to the restart of the esp.
/*
*/
#include <espDMX.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.
const char* ssid = "@@@@@@";
const char* password = "@@@@!";
const char* mqtt_server = "@@@@@@";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
// Map values 1-5 to dmx channels 101 - 105 on dmxB
dmxA.setChans(payload, 1);
// Map values 1-5 to dmx channels 101 - 105 on dmxB
dmxB.setChans(payload, 101);
}
Serial.println();
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("group1","admin","@@@@@!")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("outlight/dmx1/", "On Dmx Esp");
// ... and resubscribe
client.subscribe("inlight/dmx1/");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
// Start dmxA, status LED on pin 12 with full intensity
dmxA.begin(12);
// Start dmxB, status LED on pin 13 with 75/255 intensity
dmxB.begin(13, 75);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, 75, "On Dmx Esp #%ld", value);
// Serial.print("Publish message: ");
// Serial.println(msg);
client.publish("outlight/dmx1/", msg);
}
}
I'm surprised MQTT can handle the speed & amount of traffic generated by DMX.
If the watchdog is triggering on an ESP8266 (not the ESP32) then it might be your doing to much processing without releasing the processor to handle wi-fi stuff. try putting a delay(1) between the print & publish.
i have a dmx power supply(i dont know the correct word ) which controls the the robotics and the lights throu console but i have some lights that only needs dimming and i want to use the esp to control the lights .
so its only going to be a slider in nodered with the values 0 to 255 that post the values via mqtt ,
I think the callback funktion si destroying it but when i tried to put the dmx commands in the void loop i get the error that the payload is not declared and i am having problems with that cause i dont know to do that with the mqtt the whole char confuses me a lot . Can you guide me with that ?
thanks in advance
chris
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, 75, "On Dmx Esp #%ld", value);
// Serial.print("Publish message: ");
// Serial.println(msg);
client.publish("outlight/dmx1/", msg);
delay(3000);
// Map values 1-5 to dmx channels 101 - 105 on dmxB
dmxA.setChans(payload, 1);
// Map values 1-5 to dmx channels 101 - 105 on dmxB
dmxB.setChans(payload, 101);
}
}
Is node-red sending the payload as a single byte value or as an ASCII string representation of the payload value?
Can you explain in more detail what your setup is.
Do you have a single DMX light on a single DMX channel to control light intensity, several lights on different channels that need setting to different light levels or RGB lights that need 3 or more channels setting to alter light level output?
Why are you using 2 DMX universes. Are the lights on several DMX outputs or is this just copy and paste of the example code?
Hi I am am have 12 led dimmable lights that are on one dmx universe I just have made a protobroard with two dmx outputs that’s why I had the two universes in the code one is not needed .
So I will use only the the dmxa but as I found out the command dmxa.setchans has to be in the void loop and not in the void callback cause in the callback it make the esp restart after some time.
But I don’t know how to write it when I type in the void loop dmxA.setChans(payload ,1 ) it says I haven’t declare it because I don’t know how to save the payload for later use in the code .
The slider is just a basic slider from dashboard nodered with values 10-255 I have changed anything else .
Thanks in advance
Chris
papas_17:
Hi I am am have 12 led dimmable lights that are on one dmx universe I just have made a protobroard with two dmx outputs that’s why I had the two universes in the code one is not needed .
Do all 12 led lights use the same single channel or are they on 12 separate channels?
The slider is just a basic slider from dashboard nodered with values 10-255 I have changed anything else .
Does it continually publish the slider value to MQTT or does it only publish when the value changes?
C:\Users\Chris\Documents\Arduino\EspDmx_Group_fixed\EspDmx_Group_fixed.ino: In function 'void callback(char*, uint8_t*, unsigned int)':
EspDmx_Group_fixed:69: error: invalid conversion from 'uint8_t {aka unsigned char}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
dmxA.setChans(payload[0], 1);
^
In file included from C:\Users\Chris\Documents\Arduino\EspDmx_Group_fixed\EspDmx_Group_fixed.ino:20:0:
C:\Users\Chris\Documents\Arduino\libraries\espDMX/espDMX.h:63:14: error: initializing argument 1 of 'void espDMX::setChans(uint8_t*, uint16_t)' [-fpermissive]
void setChans(byte *data, uint16_t numChans) {
^
exit status 1
invalid conversion from 'uint8_t {aka unsigned char}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
, also you think that keeping the dmx command in the voidcallbackloop and not in the void loop is better ?you dont think that this was reseting the esp ?
thanks in advance for your help
chris
A couple of possibilities of why it crashes are...
Maybe the DMX library does not play well with Serial so try commenting out any Serial prints that happen in your code.
Another possible cause might be that I think DMX protocol has a minimum transmit interval and a single channel will not be long enough. You could set the payload length to 10 or more and still only use the first channel.
ok thanks for your fast response i try it but still the same isue and also something i forgot to mention is that at full brithness 255 in the slider the lights are dimmed always half its like it doents understant the values send to it .
also i was thinking of something like this but i still get this error so i havent compile it yet
/*
*/
#include <espDMX.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.
const char* ssid = "@@@@@";
const char* password = "@@@@@!";
const char* mqtt_server = "192.168.1.177";
volatile char newTopic[100]={0};
volatile byte newPayLoad[100]={0};
volatile int newLength=0;
volatile bool newPayLoadRecieved=false;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// copy new data to volatile variables
void callback(char* topic, byte* payload, unsigned int length) {
strcpy((char*)newTopic, topic);
newLength=length;
for (int i = 0; i < length; i++) {
newPayLoad[i]=payload[i];
}
newPayLoadRecieved=true;
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("group1","admin","@@@@@!")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("outlight/dmx1/", "On Dmx Esp");
// ... and resubscribe
client.subscribe("inlight/dmx1/");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
// Start dmxA, status LED on pin 12 with full intensity
dmxA.begin(12);
// Start dmxB, status LED on pin 13 with 75/255 intensity
dmxB.begin(13, 75);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if(newPayLoadRecieved)
{
Serial.print("Message arrived [");
Serial.print((char *)newTopic);
Serial.print("] ");
for (int i = 0; i < newLength; i++) {
Serial.print(newPayLoad[i]);
// Map values 1-5 to dmx channels 101 - 105 on dmxB
dmxA.setChans(newPayLoad[i], 10, 1);
// Map values 1-5 to dmx channels 101 - 105 on dmxB
dmxB.setChans(newPayLoad[i], 5, 101);
}
}
Serial.println();
newPayLoadRecieved=false;
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, 75, "On Dmx Esp #%ld", value);
// Serial.print("Publish message: ");
// Serial.println(msg);
client.publish("outlight/dmx1/", msg);
// Map values 1-5 to dmx channels 101 - 105 on dmxB
}
}
errors
: In function 'void loop()':
example:104: error: invalid conversion from 'volatile uint8_t* {aka volatile unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
dmxA.setChans(newPayLoad, 10, 1);
^
In file included from C:\Users\Fitness Gym\Documents\Arduino\example\example.ino:4:0:
C:\Users\Fitness Gym\Documents\Arduino\libraries\espDMX/espDMX.h:66:14: error: initializing argument 1 of 'void espDMX::setChans(uint8_t*, uint16_t, uint16_t)' [-fpermissive]
void setChans(byte*, uint16_t, uint16_t);
^
example:106: error: invalid conversion from 'volatile uint8_t* {aka volatile unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
dmxB.setChans(newPayLoad, 5, 101);
^
C:\Users\Fitness Gym\Documents\Arduino\libraries\espDMX/espDMX.h:66:14: error: initializing argument 1 of 'void espDMX::setChans(uint8_t*, uint16_t, uint16_t)' [-fpermissive]
void setChans(byte*, uint16_t, uint16_t);
^
exit status 1
invalid conversion from 'volatile uint8_t* {aka volatile unsigned char*}' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
The code you pasted above is not the code I posted in reply #7. With #7 code it compiled okay after changing from payload[0] to payload.
I was going to suggest you replace the callback code with
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
Serial.print("Length [");
Serial.print(length);
Serial.print("] ");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
to allow us to determine the format of the message received from node-red. I suspect node-red is probably sending the level 0-255 as a string instead of a binary value so will need converting back into an byte value before passing to the dmx function. Also without the dmx function in the callback we can prove that is the cause of reboots.
If I get time on Friday I will try and make time to compile and test the code but without any DMX lights attached.
hi i have checked what you wanted and yes the mqtt value is string and not binary how do i change that ?
One more question do you thing that why it is reseting the esp ? and what about the code i send you do you think we should use it ?
thanks in advance
chris
I have now had chance to test/debug your code and it is attached below.
I switched the output to use dmxB instead of dmxA so I could also use Serial.print commands to do debugging and with a few tweaks the code does not crash in the callback.
If you wish to use dmxA instead (or as well) then you must remove all references to Serial from the sketch as the main problem you was having was contention between DMX and Serial as DMX uses both hardware USART ports of an ESP8266.
I have not tested the output DMX signal though.
Also included at the end of the sketch is the node-red flow I used for testing. You would need to setup the correct username and password in the mqtt node and also put your correct wifi/mqtt details in the sketch.
hi thanks for your help so far .
i tried the code the esp doesnt reset and mqtt works ,but when i send the command to esp say 255 full light it always stay the lights like they are 50% not 100% and what i realized is that you cant change the number-payload after so it doesnt dimm the lights ,whatever value you send its alwys like the lights are at 50% but one good thing is that they can stay open for hours (without the esp reseting),but as i said no control at the dimming .
do you have any idea whats going on ?
thanks in advance
chris
Hi how are you ? Thank you so much for your help I tried the software and it worked fine for 2 days and after it started resetting again every 2 minutes . Do you have any idea why ?
Do you think that the mqtt sending makes the the memory full ?
Do you know how to include in the programm a line that resets the memory every time it gets a mqtt message or make until it reach a specific on time ?
What do you think is best ?
papas_17:
Hi how are you ? Thank you so much for your help I tried the software and it worked fine for 2 days and after it started resetting again every 2 minutes . Do you have any idea why ?
Do you think that the mqtt sending makes the the memory full ?
To check how much memory is being used you could either publish another mqtt value or replace the current outgoing msg with the free memory reading.
Replace
then in node-red put the value on a dashboard graph so you can see a history of memory usage to see if you have a memory leak.
It could also just be something with the ESP8266 board as I have several esp modules send sensor readings to MQTT but one of them will lock up after a few days and pressing reset does not fix the problem so I have to unplug/replug the module to get it working again. I suspected it was because it's plugged into breadboard and finishing the project properly with a circuit board would fix the problem.
Hi again sorry for the long absence I was really busy with work and didn’t have time to test good the esp .
So I am still getting the disconnection( more like resetting ) after a clean install it take about two hours after a couple of days in about half hour or 15 minutes ( the esp is being turned off power everyday and when the lights are not needed , it’s not always on ) .
What I am thing is that ram is running full so I was thing if the mqtt message publish is the problem cause even though I have made the esp send a mqtt meassage “on esp “ every 1 minute every couple or 4 minutes it skips one
.
The first thing I did is delete the count in the mqtt publish loop ( it had a great affect in the time )
So is there any other way than Millis to make a meassage loop that doesn’t get to much memory ? And secondly will the char [50] and the 49 in the spnprintf change it with something lower will it also make any difference ?
Also I am using 4m 3m spiffs will this make the esp les functional for what we need more memory ?
Or what do you think is best what should I do ?
Ps when the power in the esp is turned off does also free memory ? If not is there a way to put it in the code to free memory in everyb boot ?
What do you think ?
Thanks in advance
Chris