rgb sketch doet geen rood meer?

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

rgb sketch doet geen rood meer?

Berichtdoor corolla_g6 » 22 Jul 2017, 14:31

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

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: rgb sketch doet geen rood meer?

Berichtdoor nicoverduin » 22 Jul 2017, 15:20

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
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 47
Geregistreerd: 24 Nov 2014, 19:47

Re: rgb sketch doet geen rood meer?

Berichtdoor corolla_g6 » 22 Jul 2017, 18:17

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

}

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

Re: rgb sketch doet geen rood meer?

Berichtdoor shooter » 22 Jul 2017, 22:00

in regel 101 mis ik de toInt in de eerste stuk.
paul deelen
shooter@home.nl

Berichten: 47
Geregistreerd: 24 Nov 2014, 19:47

Re: rgb sketch doet geen rood meer?

Berichtdoor corolla_g6 » 22 Jul 2017, 22:44

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.

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

Re: rgb sketch doet geen rood meer?

Berichtdoor Koepel » 23 Jul 2017, 10:29

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.

Berichten: 47
Geregistreerd: 24 Nov 2014, 19:47

Re: rgb sketch doet geen rood meer?

Berichtdoor corolla_g6 » 23 Jul 2017, 12:19

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?

Berichten: 47
Geregistreerd: 24 Nov 2014, 19:47

Re: rgb sketch doet geen rood meer?

Berichtdoor corolla_g6 » 23 Jul 2017, 12:25

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
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?

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

Re: rgb sketch doet geen rood meer?

Berichtdoor shooter » 24 Jul 2017, 16:24

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

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

Re: rgb sketch doet geen rood meer?

Berichtdoor Koepel » 24 Jul 2017, 18:46

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:
Code: Alles selecteren
memcpy(p, payload, length);

Er wordt een kopie van de payload gemaakt, maar ik zie niet waarom dat nodig zou zijn.

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: RicardoGed en 13 gasten