rgb sketch doet geen rood meer?
12 berichten
• Pagina 1 van 2 • 1, 2
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
rgb sketch doet geen rood meer?
hallo,
ik heb laatst deze sketch werkend gehad maar nu doet hij geen rood meer? draai ik rood en blauw om dan doet hij geen blauw dus de uitgang is nog goed..
cpp code
via de seriele monitor komt rood wel binnen maar stuurt hij het niet door naar de uitgang..
ik denk dat het in dit stukje regels zit?
cpp code
ik heb laatst deze sketch werkend gehad maar nu doet hij geen rood meer? draai ik rood en blauw om dan doet hij geen blauw dus de uitgang is nog goed..
cpp code
void callback(char* topic, byte* payload, unsigned int length)
{
byte* p = (byte*)malloc(length);
memcpy(p, payload, length);
if (String(topic) == "/badkamer/rgb") {
String value = String((char*)payload);
OldSwitchStatus = 0;
SoffitR = value.substring(0, value.indexOf(',')).toInt();
SoffitG = value.substring(value.indexOf(',') + 1, value.lastIndexOf(',')).toInt();
SoffitB = value.substring(value.lastIndexOf(',') + 1).toInt();
}
via de seriele monitor komt rood wel binnen maar stuurt hij het niet door naar de uitgang..
ik denk dat het in dit stukje regels zit?
cpp code
SoffitR = value.substring(0, value.indexOf(',')).toInt();
SoffitG = value.substring(value.indexOf(',') + 1, value.lastIndexOf(',')).toInt();
SoffitB = value.substring(value.lastIndexOf(',') + 1).toInt();
Advertisement
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: rgb sketch doet geen rood meer?
Als het al werkt dan houdt het gauw op....tenzij er ergens een free() in staat...
Voor de rest weinig van te zeggen... moet de hele sketch zien
Voor de rest weinig van te zeggen... moet de hele sketch zien
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
Re: rgb sketch doet geen rood meer?
cpp code
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
int RED = 3;
int GREEN = 5;
int BLUE = 6;
int WHITE = 9;
int SoffitR;
int SoffitG;
int SoffitB;
int SoffitW;
int valWhite = 0;
#define OnlineStatus 7
#define inSwitch 8
boolean SwitchStatus = 0;
boolean OldSwitchStatus = 1;
byte mqtt[8] =
{
B00000,
B00000,
B01110,
B01010,
B01110,
B00000,
B00000,
};
int blinkState = LOW;
const long interval = 1000;
unsigned long previousMillis = 0;
uint32_t timer = 0;
boolean timerLoopt = false;
const uint32_t WACHTTIJD = 5000;
//byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x48, 0x69 };
//IPAddress ip(192, 168, 2, 95);
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x48, 0x03 };
IPAddress ip(192, 168, 2, 145);
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);
lcd.begin(16, 2);
pinMode(OnlineStatus, OUTPUT);
pinMode(inSwitch, INPUT);
digitalWrite(OnlineStatus, LOW);
lcd.createChar(4, mqtt);
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);
memcpy(p, payload, length);
if (String(topic) == "/badkamer/rgb") {
String value = String((char*)payload);
OldSwitchStatus = 0;
SoffitR = value.substring(0, value.indexOf(',')).toInt();
SoffitG = value.substring(value.indexOf(',') + 1, value.lastIndexOf(',')).toInt();
SoffitB = value.substring(value.lastIndexOf(',') + 1).toInt();
}
if (String(topic) == "/badkamer/white")
{
String valueWhite = String((char*)payload);
valWhite = map(valueWhite.toInt(), -0, 100, 0, 255);
}
if (strcmp(topic, "/arduinos/ping") == 0)
{
switch ((int)(p[0] - '0'))
{
case 1:
client.publish("/arduinos/ping", "Badkamer Online");
client.publish("/badkamer/status", "ONLINE");
break;
default:
break;
}
}
free(p);// Free the memory
}
//---------------------------------------------void reconnect-------------------------------------------------------//
void reconnect() {
Serial.print("Attempting MQTT connection...");
lcd.setCursor(0, 1);
lcd.print("MQTT Check ");
// Attempt to connect
if (client.connect("BadkamerClient"))
{
lcd.setCursor(0, 1);
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", "Badkamer Online");
// ... and resubscribe
//--------------------------------------------------hieronder de gebruikte topics zetten----------------------------------------//
client.subscribe("/badkamer/rgb");
client.subscribe("/badkamer/white");
client.subscribe("/badkamer/switch/status");
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, 1);
lcd.print("MQTT Fail ");
}
}
//-----------------------------------------void loop-----------------------------------------------------------//
void loop()
{
if (!client.connected())
{
if (!timerLoopt)
{
timer = millis();
timerLoopt = true;
}
else
{
if ((millis() - timer) > WACHTTIJD)
{
reconnect();
timerLoopt = false;
}
}
}
else
{
client.loop();
}
regeling();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (blinkState == LOW)
{
blinkState = HIGH;
lcd.setCursor(11, 1);
lcd.write(byte(4));
}
else
{
blinkState = LOW;
lcd.setCursor(11, 1);
lcd.write(" ");
}
}
}
//---------------------------------------------void sensorread-----------------------------------------------------------//
void regeling()
{
SwitchStatus = digitalRead(inSwitch);
if ((SwitchStatus == true) && (OldSwitchStatus == false))
{
client.publish("/badkamer/switch/status", "ON");
analogWrite(GREEN, SoffitG);
analogWrite(RED, SoffitR);
analogWrite(BLUE, SoffitB);
//analogWrite(WHITE, valWhite);
lcd.setCursor(13, 1);
lcd.print("ON ");
}
if ((SwitchStatus == false) && (OldSwitchStatus == true))
{
client.publish("/badkamer/switch/status", "OFF");
analogWrite(GREEN, 0);
analogWrite(RED, 0);
analogWrite(BLUE, 0);
analogWrite(WHITE, 0);
lcd.setCursor(13, 1);
lcd.print("OFF");
}
OldSwitchStatus = SwitchStatus;
lcd.setCursor(0, 0);
lcd.print(SoffitR);
lcd.setCursor(4, 0);
lcd.print(SoffitG);
lcd.setCursor(8, 0);
lcd.print(SoffitB);
lcd.setCursor(12, 0);
lcd.print(valWhite);
}
Re: rgb sketch doet geen rood meer?
in regel 101 mis ik de toInt in de eerste stuk.
paul deelen
shooter@home.nl
shooter@home.nl
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
Re: rgb sketch doet geen rood meer?
oke, eerlijk gezegd zou ik niet weten wat daar staat. misschien kan je mij uitleggen wat de regels 100 101 en 102 nou precies betekenen? ik weet dat ze van een string converten naar 3x een integer maar hoe het precies gebeurt weet ik niet.
hoe zouden die 3 regels er dan uit moeten zien? en het is dus fout in het stukje wat groen maakt maar het probleem ligt bij rood? of wordt dat veroorzaakt door de fout in het groene gedeelte?
nou heb ik ook gevonden dat er een verschil is met een uno of een mega? ivm 16 of 32 bits? en dan het rood kan wegvallen? ik wil dit werkend hebben op een uno.
hoe zouden die 3 regels er dan uit moeten zien? en het is dus fout in het stukje wat groen maakt maar het probleem ligt bij rood? of wordt dat veroorzaakt door de fout in het groene gedeelte?
nou heb ik ook gevonden dat er een verschil is met een uno of een mega? ivm 16 of 32 bits? en dan het rood kan wegvallen? ik wil dit werkend hebben op een uno.
Re: rgb sketch doet geen rood meer?
Wat is het formaat/protocol van de payload ? Ik bedoel: wat is de tekst die binnen komt ? Ik neem aan een zero-terminated tekst met komma's er in ? Kun je daar een paar voorbeelden van geven ?
Je draait dit op een Arduino Mega 2560 ?
Op een Arduino Uno zou ik liever geen String object gebruiken.
Het lijkt wel alsof je alles driedubbel heen en weer zit te converteren omdat je String objecten wilt gebruiken. Vroegah hadden wij strcmp, strtok, sscanf en atoi en werkte alles achter elkaar door zonder problemen
Waarom maak je een kopie van de payload in de callback functie ?
Kun je aangeven waar je de code vandaan hebt ?
Als ik een sketch maak en stukken code en voorbeelden van internet pluk, dan zet ik in de header waar het vandaan komt. Dan kan ik daar later nog eens naar kijken.
De Arduino Mega 2560 is nog steeds een 8-bit microcontroller van de AVR familie. Het is dus zo'n beetje hetzelfde als de Arduino Uno, maar dan met meer geheugen en meer pinnen.
De Arduino Due, Zero, M0 hebben een 32-bits processor.
Je draait dit op een Arduino Mega 2560 ?
Op een Arduino Uno zou ik liever geen String object gebruiken.
Het lijkt wel alsof je alles driedubbel heen en weer zit te converteren omdat je String objecten wilt gebruiken. Vroegah hadden wij strcmp, strtok, sscanf en atoi en werkte alles achter elkaar door zonder problemen
Waarom maak je een kopie van de payload in de callback functie ?
Kun je aangeven waar je de code vandaan hebt ?
Als ik een sketch maak en stukken code en voorbeelden van internet pluk, dan zet ik in de header waar het vandaan komt. Dan kan ik daar later nog eens naar kijken.
De Arduino Mega 2560 is nog steeds een 8-bit microcontroller van de AVR familie. Het is dus zo'n beetje hetzelfde als de Arduino Uno, maar dan met meer geheugen en meer pinnen.
De Arduino Due, Zero, M0 hebben een 32-bits processor.
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
Re: rgb sketch doet geen rood meer?
er komt een rgb signaal binnen in de vorm van 255,255,255 bijvoorbeeld.
ik heb de tekst van internet gehaald, https://community.openhab.org/t/rgb-led ... -mqtt/4366 en dit wil ik werkend hebben op een uno, wel een goed idee om dit in de toekomst bovenaan te zetten!
vanochtend getest op een mega en inderdaad dit maakt geen verschil.
wat bedoel je met kopie? ik kan dat nergens vinden?
ik heb de tekst van internet gehaald, https://community.openhab.org/t/rgb-led ... -mqtt/4366 en dit wil ik werkend hebben op een uno, wel een goed idee om dit in de toekomst bovenaan te zetten!
vanochtend getest op een mega en inderdaad dit maakt geen verschil.
wat bedoel je met kopie? ik kan dat nergens vinden?
- corolla_g6
- Berichten: 47
- Geregistreerd: 24 Nov 2014, 19:47
Re: rgb sketch doet geen rood meer?
ik ben erachter wat het is, via mqtt lens stuur ik handmatig 255,255,255 maar via een app op android kan je een colorpicker gebruiken en die stuurt rgb(255,255,255) nu werkt het wel als ik gewoon handmatig 255,255,255 verstuurd
maar nu heb ik nog een vraag...
cpp code
dit stukje werkt ook niet echt lekker, hier stuur ik echt 0 tot 100 maar het verloop is niet evenredig en bij 100 gaat hij uit?
maar nu heb ik nog een vraag...
cpp code
if (String(topic) == "/badkamer/white")
{
String valueWhite = String((char*)payload);
valWhite = map(valueWhite.toInt(), -0, 100, 0, 255);
}
dit stukje werkt ook niet echt lekker, hier stuur ik echt 0 tot 100 maar het verloop is niet evenredig en bij 100 gaat hij uit?
Re: rgb sketch doet geen rood meer?
maak eens van die 255 eens 254 map is een floatwaarde en kan dus best eens iets te veel zijn.
paul deelen
shooter@home.nl
shooter@home.nl
Re: rgb sketch doet geen rood meer?
map() staat hier onderaan: https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/WMath.cpp
Het is bedoeld voor gewone integers, en om te voorkomen dat de vermenigvuldiging te hoog uitvalt, worden long integers gebruikt voor de berekening.
Daarom hebben sommigen een 'mapf()' gemaakt voor floating point getallen.
https://www.arduino.cc/en/Reference/Map
https://github.com/adduxa/LightWave/blob/master/arduino/mapf.c
Ik gebruik meestal geen map(), het is te onduidelijk voor me. Dan maar gewoon een paar berekeningen.
Met een kopie bedoel ik dit:
Er wordt een kopie van de payload gemaakt, maar ik zie niet waarom dat nodig zou zijn.
Het is bedoeld voor gewone integers, en om te voorkomen dat de vermenigvuldiging te hoog uitvalt, worden long integers gebruikt voor de berekening.
Daarom hebben sommigen een 'mapf()' gemaakt voor floating point getallen.
https://www.arduino.cc/en/Reference/Map
https://github.com/adduxa/LightWave/blob/master/arduino/mapf.c
Ik gebruik meestal geen map(), het is te onduidelijk voor me. Dan maar gewoon een paar berekeningen.
Met een kopie bedoel ik dit:
- Code: Alles selecteren
memcpy(p, payload, length);
Er wordt een kopie van de payload gemaakt, maar ik zie niet waarom dat nodig zou zijn.
12 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 85 gasten