rc switch sturen via upd command

beste forum leden,
ik doe een poging om mijn rc switch te sturen via upd,
echter lukt het mij om udp command te zien in de serial monitor maar het lukt niet dan de RC commands te verstruren.

upd_switch_elro.ino (4.63 KB)

Hoi Stimpyke, welkom.

Ik kan in je sketch zien wat je wil ontvangen en jij vertelt dat je in je tests ook datgene voorbij ziet komen.
Maar wat ik mis, is wat de bron verzendt.

Dus: stuur je een èèn en een nul karakter ?
Of stuur je het karakter 10 ?

Dat is namelijk van belang voor je vergelijking, en kan de reden zijn waarom het niet goed gaat.

Dus wat zijn je UDP commands ?

Het sturen van het udo commando lukt perfect,
en kan het ook zien in de serial monitor,
maar nu wil ik echter dit ook sturen naar een draadloos contact,
vb ik stuur een '10' contact 1 on
stuur '11' contact 1 off ..
maar het lijkt erop dat als ik enkel het RC gedeelte test mijn rc contact schakeld,
en als ik dan het netwerk gedeelte bijvoeg er geen singaal gestuurd word..

Sorry, ik zie geen hierboven niet het antwoord op mijn vraag.
Die vraag was dus wat er precies verstuurd word.

Stuur je de karakters '1' en '0', of stuur je het karakter 10 ?

In deze vraag maakt het gebruik van de leestekens veel verschil, en is in dezelfde wijze als hoe het gebruikt dient te worden in C (al dan niet met plusjes).

ik stuur gewoon het karakter '10'

Dank je wel, dit schept duidelijkheid.

In je code doe je dit:

 if (strcmp( ch, "10") == 0 ) {

strcmp was mij tot nog toe onbekend.
Het vergelijkt een string met het tweede argument dat je meegeeft bij dit commando, en het antwoord is 0 (nul) als ze overeen komen.
Een string is een aaneenrijging (vandaar dat woord) van waarden.
Eerder stop je de inhoud van de buffer uit je netwerkverbinding in zo'n string, en die sluit je netjes af met een nul karakter:

    char ch[] = { packetBuffer[0], packetBuffer[1], '\0'};

Je zegt hierboven dat je het karakter 10 verzend, dus een LF (LineFeed) (klik !).

Maar je vergelijkt het vervolgens met de karakters 49 (de 1) en 48 (de 0).
Als wat je vertelde correct is, dan doet je code dus wat het moet doen, want "10" komt niet overeen met 10 in C.

"10" tussen dubbele aanhalingsteken staat voor meerdere karakters die in dit geval bestaan uit de waardes 49, 48 en 0, de nul geeft aan dat de string beëindigd is en moet er bij zitten.
Als je maar 1 karakter wil controleren, dan kun je het tussen enkele aanhalingsteken ( ' ) zetten.

Aangezien een LF wat lastig te controleren is (is wel mogelijk hoor , dan doe je /n voor new line), kun je net zo goed controleren op de inhoud van (10), dus zonder enig aanhalingsteken maar uiteraard wel tussen ().

Toch twijfel ik nog of ik dit hele verhaal niet voor niks heb getypt.
Want waarom vul je anders variabele ch met de 2 eerste waardes uit je netwerk buffer en de afsluitende nul.
Das helemaal niet nodig als je maar 1 karakter hoeft te beoordelen.

Wil je anders eens posten wat je ziet in de serial monitor.
Dat kun je gewoon kopiëren, en hier dan weer in code tags neerzetten.

hoi,
hier de serial output van de udp commands

SYSTEM BOOT
10
zender1 ON start
zender1 ON end
10
zender1 ON start
zender1 ON end
11
zender1 off start
zender1 off end
/* programma dat pin op arduino stuurt door gewoon een getal te sturen
 10 hoog pin 2 11 laag pin 2
 20 hoog pin 3 21 laag pin 3µ


 */

#include <SPI.h>                                             // needed for Arduino versions later than 0018
#include <Ethernet.h>                                        // Ethernet board connected - Uses A0, A1, (D2 or D4), D10, D11, D12, D13
#include <EthernetUdp.h>                                     // UDP library from: bjoern@cs.stanford.edu 12/30/2008
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };         // MAC Address
IPAddress ip(192, 168, 0, 130);                               // IP Address
unsigned int localPort = 8888;                               // Local IP port to listen on
byte gateway[] = { 192, 168, 0, 1 };                         // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                        // Subnet Address

/*int PinA = 2;                                              // Switch Pin 1
int PinB = 3;                                                // Switch Pin 2
int PinC = 4;                                                // Switch Pin 3
int PinD = 5;                                                // Switch Pin 4
int PinE = 6;                                                // Switch Pin 5
int PinF = 7;                                                // Switch Pin 6
int PinG = 8;                                                // Switch Pin 7
int PinH = 9;                                                // Switch Pin 8
*/
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];                   // buffer to hold incoming packet
EthernetUDP Udp;                                             // An EthernetUDP instance to let us send and receive packets over UDP

void setup() {                                               // run setup only once on boot
    mySwitch.enableTransmit(13);
    Ethernet.begin(mac,ip);                                    // Enable Ethernet
    Udp.begin(localPort);                                      // Start UDP Connection
  
  Serial.begin(9600);                                        // Start Serial Output
  Serial.write("SYSTEM BOOT");                               // Send Power on to serial
}                                                            

void loop()                                                  // Start Running System
{
  int packetSize = Udp.parsePacket();                        // if there's data available, read a packet
  if(packetSize)
  {
  int read = Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);  // read the packet into packetBufffer
    packetBuffer[read] = 0;
    // char ch1 = packetBuffer[0];
    // char ch2 = packetBuffer[1];
    char ch[] = { packetBuffer[0], packetBuffer[1], '\0'};
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ch);
    Udp.endPacket();
    Serial.println(ch);

  

  if (strcmp( ch, "10") == 0 ) {
    Serial.println("zender1 ON start");
    mySwitch.send("000100010000010101010001");// Device 1 ON
      delay(1000);
   // Serial.println(PinA,HIGH);
    Serial.println("zender1 ON end");
    
  }
  else if (strcmp( ch, "11") == 0 ) {
    Serial.println("zender1 off start");
    mySwitch.send("000100010000010101010100");// Device 1 off
    delay(1000);
    Serial.println("zender1 off end");
   // Serial.println(PinA,LOW);
  }
 /* else if (strcmp( ch, "20") == 0 ) {
    digitalWrite(PinB,HIGH);
    Serial.println(PinB,HIGH);
  }
  else if (strcmp( ch, "21") == 0 ) {
    digitalWrite(PinB,LOW);
    Serial.println(PinB,LOW);
  }
  else if (strcmp( ch, "30") == 0 ) {
    digitalWrite(PinC,HIGH);
    Serial.println(PinC,HIGH);
  }
  else if (strcmp( ch, "31") == 0 ) {
    digitalWrite(PinC,LOW);
    Serial.println(PinC,LOW);
  }
  else if (strcmp( ch, "40") == 0 ) {
    digitalWrite(PinD,HIGH);
  }
  else if (strcmp( ch, "41") == 0 ) {
    digitalWrite(PinD,LOW);
  }
  else if (strcmp( ch, "50") == 0 ) {
    digitalWrite(PinE,HIGH);
  }
  else if (strcmp( ch, "51") == 0 ) {
    digitalWrite(PinE,LOW);
  }
  else if (strcmp( ch, "60") == 0 ) {
    digitalWrite(PinF,HIGH);
  }
  else if (strcmp( ch, "61") == 0 ) {
    digitalWrite(PinF,LOW);
  }
  else if (strcmp( ch, "70") == 0 ) {
    digitalWrite(PinG,HIGH);
  }
  else if (strcmp( ch, "71") == 0 ) {
    digitalWrite(PinG,LOW);
  }
  else if (strcmp( ch, "80") == 0 ) {
    digitalWrite(PinH,HIGH);
  }
  else if (strcmp( ch, "81") == 0 ) {
    digitalWrite(PinH,LOW);
  }*/
  
  }
  delay(20);                                                 // waits 15ms for udp input wait ...
 
}                                                            // end system run, but now loop and start system run again

Stimpyke:
maar het lijkt erop dat als ik enkel het RC gedeelte test mijn rc contact schakeld,
en als ik dan het netwerk gedeelte bijvoeg er geen singaal gestuurd word..

Betekent dat dat voorbeeld programmas van de bibliotheek (bv SendDemo als ik de juiste van het web heb gehaald) werken? Welke bibliotheek gebruik je? GitHub - sui77/rc-switch: Arduino lib to operate 433/315Mhz devices like power outlet sockets.</ti?

yep
de voorbeeld programmas van de bibliotheek werken.
SendDemo heb ik een aanpassing gedaan om de juiste switch aan te sturen.

Hmm, dus toch..

Nou, je stuurt niet het karakter 10, maar de karakters die samen "10" vormen via die seriële verbinding.
Ik snap nog steeds niet waarom je dan strcmp nodig hebt, maar als je dat wil gebruiken is dat je goed recht.
Wellicht wil je op deze wijze nog hele andere dingen gaan doen..

Ik heb je de ASCII waardes voor de 0 en de 1 al aangereikt, dus hier moet je iets mee kunnen denk ik.
Dat zou dan je strcmp moeten vervangen.

Ik heb elders al vaker aangegeven dat ik erg gecharmeerd ben van switch...case, met een beetje nadenken kun je daarmee je sketch wel wat verfijnen, maar das nog even toekomstmuziek.

Ik heb de hardware niet om dit te testen zo kan alleen een theoretische benadering doen.

Van je programma

#include <Ethernet.h>                                        // Ethernet board connected - Uses A0, A1, (D2 or D4), D10, D11, D12, [color=red][b]D13[/b][/color]
void setup() {                                               // run setup only once on boot
  mySwitch.enableTransmit([color=red][b]13[/b][/color]);

Lijkt er op dat je pin 13 twee keer gebruikt.

Je kunt testen door bv in eerste instantie de seriele poort te gebruiken in plaats van UDP en kijken of dat werkt. Of simpelweg een ongebruikte pin gebruiken voor the rc switch.

Als dat het probleem niet oplost:
1)
Heb je een link voor het ethernet shield dat je gebruikt?
2)
Welke ethernet bibliotheek gebruik je?

Ik denk dat sterretje gelijk heeft :). Als je SPI gebruikt (de ethernet kaart) moet je wel van de pinnen 10-13 afblijven.

Thanks,
inderdaad mocht ik pin 13 niet gebruiken om de sturing te doen,
heb pin 9 geprogrammeerd en het werkt zoals ik wil.