PC (HEX) Code über Wemos an Seriellen Port (MAX232) senden Bitte umHilfe

Hallo liebe µC gemeinde…

Meine Letzte Idee war leider ne schlechte und daher kommt ne neue Idee…
Leider brauche ich Hilfe zum Programmieren da mir die Programmiersprache nicht geläufig ist. Bitte als absoluten Neuling behandeln in sache Code…

Wunsch meines Projektes:

Alexa (Amazon Echo) soll via Wemos D1 mini und RS232-TTl Modul meinen Beamer steuern.

Ich habe schon einen Code wo Alexa via IRLed’s meinen Fernseher steuert und darüber würde ich gerne auch den Beamer einschalten und ausschalten. Ich habe eine Liste mit den PC Steuercodes vom Beamer sowie das Kommunikationsprotokoll.

PC-Steuercodes:

POWER ON : 02H 00H 00H 00H 00H 02H
POWER OFF : 02H 01H 00H 00H 00H 03H

Kommunikationsprotokoll:

Baudrate … 38400 bps
Datenlänge … 8 Bits
Parität … Keine Parität
Stoppbit … Ein Bit
X ein/aus … Keine
Kommunikationsverfahren … Vollduplex

das ist mein Funktionierender Code für Alexa sodass, die Sachen als SMARTHOME gerät erfasst werden.

/*
   Autor:   Christian Kronen
   Video:   https://youtu.be/48RW4JHMXUA , https://youtu.be/9KPloCNosIk
   Datum:   25.März 2017
   Version: 1.0
   Ort:     Aachen

   Verwendetes Board: NodeMCU.
   Weitere Teile: 433 MHZ Funksender und Empfängermodul MX-FM-5V
                  IR LED mit 940nm
                  IR Empfänger V38238
                  1 Widerstand (muss individuell berechnet werden - ca. 150 OHM)
                  Breadboard und Steckbrücken
                  Amazon Echo


   Ich bin nicht der Autor der verwendeten Bibliotheken:

      https://github.com/sui77/rc-switch/archive/master.zip
      https://github.com/me-no-dev/ESPAsyncTCP/archive/master.zip
      https://github.com/me-no-dev/ESPAsyncUDP/archive/master.zip
      https://github.com/me-no-dev/ESPAsyncWebServer/archive/master.zip
      https://bitbucket.org/xoseperez/fauxmoesp/downloads
      https://github.com/markszabo/IRremoteESP8266 by Ken Shirriff (C)

   Treiber für das Board: http://sparks.gogo.co.nz/ch340.html

   Ich übernehme keine Gewähr für die Richtigkeit, Vollständigkeit und Aktualität der bereitgestellten Inhalte.
   Die Nutzung und das nachmachen der Inhalte aus dem Video& der Beschreibung erfolgt auf eigene Gefahr des Nutzers.
   Schaue niemals in die IR LED!


*/

#include <ESP8266WiFi.h>
#include "fauxmoESP.h"

#include <IRremoteESP8266.h> //by Ken Shirriff (C) NEU

#define WIFI_SSID "++++++++++"
#define WIFI_PASS "++++++++++"

fauxmoESP alexawifi;


IRsend IRLED(4); // IRLED angeschlossen am D2 Pin (GPIO4) - NEU


void wifiSetup() {

                           //******************************************************
                           //****                  W-Lan Setup                 ****
                           //******************************************************

  WiFi.mode(WIFI_STA);

  Serial.printf("Verbindung zu %s wird aufgebaut......Bitte Warten! ", WIFI_SSID);
  Serial.println("");
  
  WiFi.begin(WIFI_SSID, WIFI_PASS);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print("*");
    delay(100);
  }
  Serial.println("");
  Serial.printf("Verbunden mit: %s, IP Adresse: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
}

void anfrage(uint8_t device_id, const char * device_name, bool state) {
  Serial.print("Gerät: ");
  Serial.println(device_name);
  Serial.print("Status: ");
//-----------------------------------------------------------------------------------------------------------------------------------------------
                           //*******************************************************
                           //****             Geräte EIN Schalten               ****
                           //*******************************************************

 if (state) {   
   if(device_id == 0) { //Beispiel IR Geräte schalten - NEU
    Serial.println("AN");

    //Samsung
    IRLED.sendSAMSUNG(0xE0E040BF, 32);        //Samsung Fernseher AN Schalten

    delay(50);
  }
else if (device_id == 1) { 
    Serial.println("AN");

    //Samsung
    IRLED.sendSAMSUNG(0xE0E0E01F, 32);        //Samsung Fernseher lauter

    delay(50);
  }
 else if (device_id == 2) { 
    Serial.println("AN");

    //Samsung
    IRLED.sendSAMSUNG(0xE0E0D02F, 32);        //Samsung Fernseher leiser

    delay(50);
  }
  else if (device_id == 3) { 
    Serial.println("AN");

   // Hier müsste dann irgendwie die Ausgabe des Steuercodes passieren 
   //
  }
 else if (device_id == 4) { 
    Serial.println("AN");

    //AV Receiver Radio
    IRLED.sendNEC(0x10E817, 32);             //AV Receiver AM/FM

    delay(50);
  }
 }

                           //*******************************************************
                           //****             Geräte AUS Schalten               ****
                           //*******************************************************
else { 


  if(device_id == 0) { //IR Geräte ausschalten
    Serial.println("AUS");

  //Samsung
  IRLED.sendSAMSUNG(0xE0E040BF, 32);             // Samsung Fernseher AUS Schalten

  delay(50);
  }
else if(device_id == 3) { //IR Geräte ausschalten
    Serial.println("AUS");

  //NEC BEamer
  IRLED.sendNEC(0x189728D7, 32);                // NEC Beamer AUS Schalten

  delay(50);
   }
else if(device_id == 4){  
  //AV Receiver Radio
  IRLED.sendNEC(0x10E03FC, 32);                // AV Receiver OFF
  delay(50);
  }
 }
}

void setup() {

  Serial.begin(115200,SERIAL_8N1,SERIAL_TX_ONLY);
  Serial.println("Nach dem Verbinden, sage 'Alexa, schalte <Gerät> an' oder 'aus'");

//  mySwitch.enableTransmit(5);

  IRLED.begin(); // NEU

  wifiSetup();
  geraete();
                //***************************************************
                //****             Geräteliste                   ****
                //***************************************************
 } 
void geraete() {
   
  alexawifi.addDevice("Fernseher Wohnzimmer"); //ID 0  
  alexawifi.addDevice("Fernseher Lauter"); //ID 1 
  alexawifi.addDevice("Fernseher Leiser"); //ID 2 
  alexawifi.addDevice("Beamer"); //ID 3
  alexawifi.addDevice("Wohnzimmer Radio"); //ID 4 
  
  alexawifi.onMessage(anfrage);
  
 }
void loop(){ 

  alexawifi.handle();
}

Kann mir jemand bei diesem Projekt Helfen?

Versteh ich das richtig: Jetzt nicht mehr über Ethernet ?

Was heißt bei dir "PC-Steuercode" ?

Ich habe schon einen Code wo Alexa via IRLed's meinen Fernseher steuert

Dein Beamer hat keine Infrarotfernsteuerung?
Grüße Uwe

uwefed:
Dein Beamer hat keine Infrarotfernsteuerung?
Grüße Uwe

Das hat der TO ja in seinem letzten Thread schon aufgegeben.

@Bluelinux
Mein Tipp: Versuche es mit IR und einem Arduino Uno. Das ist deutlich einfacher und du kannst bei Erfolg den Sketch für den Wemos weiter nutzen. Für den Anfang ist ein Uno viel einfacher zu händeln.

Mein Tipp:
Das WLAN Passwort nicht posten.

Danke für den Tipp... habe ich natürlich gleich geändert.

Kann mir denn keiner einen Code nennen womit ich diese Steuercodes senden kann?

PC-Steuercodes: so steht es in der Anleitung meines Beamers. mehr kann ich dazu leider nicht sagen...

wäre cool wenn sich mal jemand meldet der das programmieren im schlaf kann....

Trotzdem Danke für die Hilfe

Soo ich habe jetzt mal etwas geschrieben und probiert …erkennt jemand einen fehler??? es geht um den seriellen part???

der Code:

#include <ESP8266WiFi.h>
#include "fauxmoESP.h"
#include <IRremoteESP8266.h> //by Ken Shirriff (C) NEU
#include <SoftwareSerial.h>

const int rx = 12;
const int tx = 13;

SoftwareSerial mySerial (rx, tx);

#define WIFI_SSID "$$$$$$"
#define WIFI_PASS "$$$$$$"

fauxmoESP alexawifi;


IRsend IRLED(4); // IRLED angeschlossen am D2 Pin (GPIO4) - NEU


void wifiSetup() {

                           //******************************************************
                           //****                  W-Lan Setup                 ****
                           //******************************************************

  WiFi.mode(WIFI_STA);

  Serial.printf("Verbindung zu %s wird aufgebaut......Bitte Warten! ", WIFI_SSID);
  Serial.println("");
  
  WiFi.begin(WIFI_SSID, WIFI_PASS);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print("*");
    delay(100);
  }
  Serial.println("");
  Serial.printf("Verbunden mit: %s, IP Adresse: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
}

void anfrage(uint8_t device_id, const char * device_name, bool state) {
  Serial.print("Gerät: ");
  Serial.println(device_name);
  Serial.print("Status: ");
//-----------------------------------------------------------------------------------------------------------------------------------------------
                           //*******************************************************
                           //****             Geräte EIN Schalten               ****
                           //*******************************************************

 if (state) {   
   if(device_id == 0) { //Beispiel IR Geräte schalten - NEU
    Serial.println("AN");

    //Samsung
    IRLED.sendSAMSUNG(0xE0E040BF, 32);        //Samsung Fernseher AN Schalten

    delay(50);
  }
else if (device_id == 1) { 
    Serial.println("AN");

    //Samsung
    IRLED.sendSAMSUNG(0xE0E0E01F, 32);        //Samsung Fernseher lauter

    delay(50);
  }
 else if (device_id == 2) { 
    Serial.println("AN");

    //Samsung
    IRLED.sendSAMSUNG(0xE0E0D02F, 32);        //Samsung Fernseher leiser

    delay(50);
  }
  else if (device_id == 3) { 
    Serial.println("AN");

    //NEC Beamer
    mySerial.print(0x02,HEX);                   //###############################################
    mySerial.print(0x00,HEX);                   //# Das ist der Teil den ich angepasst habe.    # 
    mySerial.print(0x00,HEX);                   //# bei "Beamer AN" soll an den MAX232 diese    # 
    mySerial.print(0x00,HEX);                   //# 02 00 00 00 00 02 HEX code gesendet         #
    mySerial.print(0x00,HEX);                   //# werden!                                     #
    mySerial.print(0x02,HEX);                   //############################################### 
    
    delay(50);
  }
 else if (device_id == 4) { 
    Serial.println("AN");

    //AV Receiver Radio
    IRLED.sendNEC(0x10E817, 32);             //AV Receiver AM/FM

    delay(50);
  }
 }

                           //*******************************************************
                           //****             Geräte AUS Schalten               ****
                           //*******************************************************
else { 


  if(device_id == 0) { //IR Geräte ausschalten
    Serial.println("AUS");

  //Samsung
  IRLED.sendSAMSUNG(0xE0E040BF, 32);             // Samsung Fernseher AUS Schalten

  delay(50);
  }
else if(device_id == 3) { //IR Geräte ausschalten
    Serial.println("AUS");
    Serial.println(mySerial.read());

  //NEC BEamer
    mySerial.print(0x02,HEX);                   //###############################################
    mySerial.print(0x01,HEX);                   //# Das ist der Teil den ich angepasst habe.    # 
    mySerial.print(0x00,HEX);                   //# bei "Beamer Aus" soll an den MAX232 diese   # 
    mySerial.print(0x00,HEX);                   //# 02 01 00 00 00 03 HEX code gesendet         #
    mySerial.print(0x00,HEX);                   //# werden!                                     #
    mySerial.print(0x03,HEX);                   //############################################### 
    
       
  delay(50);
   }
else if(device_id == 4){  
  //AV Receiver Radio
  IRLED.sendNEC(0x10E03FC, 32);                // AV Receiver OFF
  delay(50);
  }
 }
}

void setup() {

  Serial.begin(115200,SERIAL_8N1,SERIAL_TX_ONLY);
  mySerial.begin(38400);
  Serial.println("Nach dem Verbinden, sage 'Alexa, schalte <Gerät> an' oder 'aus'");

//  mySwitch.enableTransmit(5);

  IRLED.begin(); // NEU

  wifiSetup();
  geraete();
                //***************************************************
                //****             Geräteliste                   ****
                //***************************************************
 } 
void geraete() {
   
  alexawifi.addDevice("Fernseher Wohnzimmer"); //ID 0  
  alexawifi.addDevice("Fernseher Lauter"); //ID 1 
  alexawifi.addDevice("Fernseher Leiser"); //ID 2 
  alexawifi.addDevice("Beamer"); //ID 3
  alexawifi.addDevice("Wohnzimmer Radio"); //ID 4 
  
  alexawifi.onMessage(anfrage);
  
 }
void loop(){ 

  alexawifi.handle();
}

es tut leider noch nicht das was es soll…

Das Problem liegt im Verständnis zum Hex.

Zum Beispiel einfach..
Hex 0x31 ist gleichzeitig Als Char oder String eine "1", als Byte 0x31, als int die 49.

Also könnte Dir helfen:
Serial.print((byte)0x01);
......

Deine Konsole sendet '01', ich vermute mal der Beamer wartet auf 6 Bytes und nicht 12 Hex Ziffern als String. Kommt drauf an wie es genau beschrieben ist.

Schuppeste:
Das Problem liegt im Verständnis zum Hex.

Zum Beispiel einfach…
Hex 0x31 ist gleichzeitig Als Char oder String eine “1”, als Byte 0x31, als int die 49.

Also könnte Dir helfen:
Serial.print((byte)0x01);

Deine Konsole sendet ‘01’, ich vermute mal der Beamer wartet auf 6 Bytes und nicht 12 Hex Ziffern als String. Kommt drauf an wie es genau beschrieben ist.

Hey danke Jr. Member…
also ich denke mal der wartet wenn ich das dem hier richtig entnehme
"

PC-Steuercodes:

POWER ON : 02H 00H 00H 00H 00H 02H
POWER OFF : 02H 01H 00H 00H 00H 03H

Kommunikationsprotokoll:

Baudrate … 38400 bps
Datenlänge … 8 Bits
Parität … Keine Parität
Stoppbit … Ein Bit
X ein/aus … Keine
Kommunikationsverfahren … Vollduplex
"

auf 8 bit oder? ich habe schon mal versucht diese HEX kette aneinander zu hängen aber mir scheint da echt die Ahnung zu fehlen wie es geht. Leider kam dann immer nur Fehler beim Kompilieren.

Sollte ich es dann mal so probieren:

Serial.print((8)0x01, 0x00, 0x00, 0x00, 0x00, 0x02); <-----------zum einschalten
oder
Serial.print((byte)0x01, 0x00, 0x00, 0x00, 0x00, 0x02);
oder
Serial.print((8)0x01);
Serial.print((8)0x00);
Serial.print((8)0x00);
Serial.print((8)0x00);
Serial.print((8)0x00);
Serial.print((8)0x02);
oder
Serial.print((byte)0x01);
Serial.print((byte)0x00);
Serial.print((byte)0x00);
Serial.print((byte)0x00);
Serial.print((byte)0x00);
Serial.print((byte)0x02);

Das wäre jetzt was mir einfallen würde…

Bluelinux:
auf 8 bit oder? ich habe schon mal versucht diese HEX kette aneinander zu hängen aber mir scheint da echt die Ahnung zu fehlen wie es geht. Leider kam dann immer nur Fehler beim Kompilieren.

Sollte ich es dann mal so probieren:

Serial.print((8)0x01, 0x00, 0x00, 0x00, 0x00, 0x02);

Lass es sein sowas einfach auf Verdacht zu probieren wenn du dir nicht sicher bist. Solche Sachen können kompilieren aber etwas völlig anderes machen als du denkst. Dann wirst du verwirrt weil keine Fehler kommen

Und vergiss das ( 8 ) sofort wieder. Für den Compiler ist das Datenformat der seriellen Schnittstelle vollkommen irrelevant. () ist ein Cast (von "type casting" -> Typumwandlung). Das ist eine Anweisung an den Compiler wie er die Daten interpretieren soll. z.B. also int, byte oder sonstwas.

Wenn du etwas in einer Zeile schicken willst, musst du die Daten in ein Array packen und per write() senden:
https://www.arduino.cc/en/Serial/Write

byte data[] = { ... };
Serial.write(data, sizeof(data));

hi,

Wenn du etwas in einer Zeile schicken willst, musst du die Daten in ein Array packen und per write() senden:

und genau das würde ich in einem sonst leeren sketch in die setup-routine packen, also

Serial.begin, dann ein delay von ner sekunde und dann das Serial.write

wenn Dein beamer darauf anspricht, kannst Du es dann in Deinen "großen" sketch packen.

gruß stefan

Bluelinux:
PC-Steuercodes:

POWER ON : 02H 00H 00H 00H 00H 02H
POWER OFF : 02H 01H 00H 00H 00H 03H

Serial.print((8 )0x01, 0x00, 0x00, 0x00, 0x00, 0x02); <-----------zum einschalten
oder
Serial.print((byte)0x01, 0x00, 0x00, 0x00, 0x00, 0x02);
oder
Serial.print((8)0x01);
Serial.print((8)0x00);
Serial.print((8)0x00);
Serial.print((8)0x00);
Serial.print((8)0x00);
Serial.print((8)0x02);
oder
Serial.print((byte)0x01);
Serial.print((byte)0x00);
Serial.print((byte)0x00);
Serial.print((byte)0x00);
Serial.print((byte)0x00);
Serial.print((byte)0x02);

Das wäre jetzt was mir einfallen würde…

Nicht dass du an einem simplen Tippfehler scheiterst…

Ich würde als Testcode nicht On/Off verwenden, sondern die Codes für Picture Mute. Dann kannst du beliebig herumprobieren ohne unnötig die Lampe des Beamers zu belasten. Funktioniert das, kannst du die Codes auf On/Off umstellen.

Serial.print((8 )0x01, 0x00, 0x00, 0x00, 0x00, 0x02);

Was für eine Programmiersprache ist das?
Und in welcher Library ist diese Variante der print Methode definiert?

Vorschlag:

const byte msg10002 [] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x02};
Serial.write(msg10002, sizeof(msg10002));

Nicht dass es vergessen wird:

Serenifly:
vergiss das ( 8 ) sofort

Sooooo es klappt ich kann endlich den Beamer dank Alexa via Sprache steuern.... hab es alleine hin bekommen allerdings habe ich nich ein schönheitsfehler und hoffe ihr könnt mir da helfen.

const byte BeamerAN [] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x02};      //das mein Hex Code einschalten
const byte Video3 [] = {0x01, 0x02, 0x00, 0x00, 0x00, 0x02};          //das der Code zum umschalten auf Video3


else if (device_id == 2) {
    Serial.println("AN");

    //Beamer
    
    Serial.write(BeamerAN, sizeof(BeamerAN));                                //das ist die Asuführung Beamer an

    delay(20000);                                         //Sollte die Pause sein die nicht Funktioniert

    Serial.write(Video3, sizeof(Video3));                                        //soll auf Video3 schalten
 }

das was jetzt noch nicht klappt ist die Pause zwischen "BeamerAN" und "Video3". Der Beamer Soll jedesmal wenn ich Ihn einschalte auf Video 3 Stellen . Leider wird meine Pause offensichtlich so null beachtet. wo liegt denn mein Fehler????

Danke für euren Support

Bluelinux:
Sooooo es klappt.....hab es alleine hin bekommen allerdings habe ich nich ein schönheitsfehler und hoffe ihr könnt mir da helfen.

Ach ja ?
Du hast ja auch eine ganze Menge Informationen und Hilfestellungen bekommen.
Z.B. michael_x usw.

Ein vollständiger Sketch wäre hilfreicher. Fragmente sind immer Mist.

Das aktuelle Problem liegt evtl. am "delay();". Setze da mal die Funktion mit "millis()" mit entsprechender Zeitverzögerung ein oder Timerfunktionen. Dann wird das sicher auch funktionieren.