Kommunikation zwischen Arduino Uno und Attiny85

Das Händi möchte unbedingt ins WWW: "Die Qualität Ihrer Internetverbindung wird überprüft". Das braucht unnötig Zeit.

Beide Zeilen funktionieren:

uint8_t button_M; // =1 if button pressed, else =0 
bool button_M; // =1 if button pressed, else =0 

Allerdings wird die Struktur bei einer Änderung der GUI auch neu erstellt, weshalb ich keinen Sinn darin sehe, an dieser Stelle einzugreifen. Alles bis END RemoteXY include würde ich einfach so lassen, wie es vom Editor erzeugt wird.

1 Like

Yau.
Danke!

Angelehnt an #113 habe ich dies aufgespielt:

// https://forum.arduino.cc/t/kommunikation-zwischen-arduino-uno-und-attiny85/926563/145?u=agmue
// Kommunikation zwischen Arduino Uno und Attiny85
// getestet mit ESP32; siehe auch f:/Arduino/ESP32/ESP_RemoteXY/

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

/*
  // RemoteXY select connection mode and include library
  #define REMOTEXY_MODE__ESP8266_HARDSERIAL

  #include <RemoteXY.h>

  // RemoteXY connection settings
  #define REMOTEXY_SERIAL Serial
  #define REMOTEXY_SERIAL_SPEED 115200
  #define REMOTEXY_WIFI_SSID "LKW"
  #define REMOTEXY_WIFI_PASSWORD "Teslasucks"
  #define REMOTEXY_SERVER_PORT 6377
*/

// *** ESP32 Anfang
// RemoteXY select connection mode and include library
#define REMOTEXY_MODE__ESP32CORE_WIFI_POINT
#include <WiFi.h>

#include <RemoteXY.h>

// RemoteXY connection settings
#define REMOTEXY_WIFI_SSID "ESP32_Naturmaterialien"
#define REMOTEXY_WIFI_PASSWORD "12345678"
#define REMOTEXY_SERVER_PORT 6377
// *** ESP32 Ende

// RemoteXY configurate
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
{ 255, 5, 0, 0, 0, 70, 0, 13, 19, 1,
  1, 0, 8, 9, 12, 12, 12, 31, 76, 0,
  1, 0, 24, 9, 12, 12, 5, 31, 77, 0,
  1, 0, 40, 9, 12, 12, 12, 31, 82, 0,
  1, 0, 33, 28, 12, 12, 1, 31, 87, 97,
  114, 110, 98, 108, 105, 110, 107, 101, 114, 0,
  2, 1, 18, 47, 22, 11, 0, 26, 31, 31,
  65, 110, 0, 65, 117, 115, 0
};

// this structure defines all the variables and events of your control interface
struct {

  // input variables
  uint8_t button_L; // =1 if button pressed, else =0
  uint8_t button_M; // =1 if button pressed, else =0
  uint8_t button_R; // =1 if button pressed, else =0
  uint8_t button_W; // =1 if button pressed, else =0
  uint8_t switch_1; // =1 if switch ON and =0 if OFF

  // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////

const byte pinL = 13;
const byte pinM = 25;
const byte pinR = 27;
const byte pinW = 14;
const byte pinS = 12;

const unsigned long frequenz = 500;
const byte rot[]   = {15, 99};
const byte gruen[] = {16, 99};
const byte blau[]  = {17, 99};

#define RGBein LOW
#define RGBaus HIGH

unsigned long blinkmillis[] = {0, 0};
enum {rigthSite, leftSite};

bool rechtsBut;
bool mitteBut;
bool linksBut;
bool warnBut;
bool lichtSwi;
bool nachRechts;
bool nachLinks;
bool nachMitte;

// DurchlaufMessung:
unsigned long xmillis;
unsigned long ymillis;
unsigned int durchlauf;

void setup()
{
  RemoteXY_Init ();
  pinMode(pinL, OUTPUT);
  pinMode(pinM, OUTPUT);
  pinMode(pinR, OUTPUT);
  pinMode(pinW, OUTPUT);
  pinMode(pinS, OUTPUT);

  Serial.begin(115200);
  Serial.println(F("Start..."));
  for (byte b = 0; b < 2; b++)
  {
    pinMode(blau[b], OUTPUT);
    pinMode(rot[b], OUTPUT);
    pinMode(gruen[b], OUTPUT);
    aus(b);
  }
  xmillis = millis();
}

void loop()
{
  RemoteXY_Handler ();

  digitalWrite(pinL, RemoteXY.button_L);
  digitalWrite(pinM, RemoteXY.button_M);
  digitalWrite(pinR, RemoteXY.button_R);
  digitalWrite(pinW, RemoteXY.button_W);
  digitalWrite(pinS, RemoteXY.switch_1);

  durchlauf++;
  if (durchlauf >= 10000)
  {
    ymillis = millis();
    Serial.print(F("Anzahl Durchläufe: ")); Serial.print(durchlauf);
    Serial.print(F("\tZeit in ms: ")); Serial.print(ymillis - xmillis);
    Serial.print(F("\tZeit pro Durchlauf: ")); Serial.println( (ymillis - xmillis) * 1.0 / durchlauf, 4);
    xmillis = millis();
    durchlauf = 0;
  }

  frageJoy();
  setzeLicht();
}
void frageJoy()
{
  rechtsBut = RemoteXY.button_R;
  mitteBut =  RemoteXY.button_M;
  linksBut =  RemoteXY.button_L;
  warnBut =   RemoteXY.button_W;
  lichtSwi =  RemoteXY.switch_1;
  if (rechtsBut)
  {
    Serial.println(F("nach Rechts erkannt"));
    nachRechts = true;
    nachLinks = false;
    nachMitte = false;
  }
  if (linksBut)
  {
    Serial.println(F("nach links erkannt"));
    nachRechts = false;
    nachLinks = true;
    nachMitte = false;
  }
  if (mitteBut)
  {
    Serial.println(F("geradeaus erkannt"));
    nachRechts = false;
    nachLinks = false;
    nachMitte = true;
  }
}

void setzeLicht()
{
  if (nachRechts)        // es geht nach rechts
  {
    if (lichtSwi)           // mit licht
    {
      blinken(rigthSite, true);   // rechts, blinken mit Licht
      an(leftSite);    // links, nur Licht
    }
    else                 // ohne Licht
    {
      blinken(rigthSite, false);   // rechts, nur blinken
      aus(leftSite);    // links, alles aus
    }
  }
  if (nachLinks)
  {
    if (lichtSwi)           // mit licht
    {
      blinken(leftSite, true);   // links, blinken mit Licht
      an(rigthSite);   // rechts, nur Licht
    }
    else                 // ohne Licht
    {
      blinken(leftSite, false);    // links, nur blinken
      aus(rigthSite);   // rechts, alles aus
    }
  }
  if (nachMitte)
  {
    if (lichtSwi)           // mit licht
    {
      an(rigthSite);   // rechts, nur Licht
      an(leftSite);    // links, nur Licht
    }
    else                 // ohne Licht
    {
      aus(rigthSite);   // rechts, alles aus
      aus(leftSite);    // links, alles aus
    }
  }
}

void blinken(const byte seite, const bool licht)
{
  if (millis() - blinkmillis[seite] < frequenz)
  {
    orange(seite);
  }
  else if (!licht)
  {
    aus(seite);
  }
  else
  {
    an(seite);
  }
  if (millis() - blinkmillis[seite] > (frequenz * 2))
  {
    blinkmillis[seite] = millis();
  }
}
void aus(const byte seite)
{
  digitalWrite(rot[seite], RGBaus);
  digitalWrite(gruen[seite], RGBaus);
  digitalWrite(blau[seite], RGBaus);
}
void an(const byte seite)
{
  digitalWrite(rot[seite], RGBein);
  digitalWrite(gruen[seite], RGBein);
  digitalWrite(blau[seite], RGBein);
}
void orange(const byte seite)
{
  digitalWrite(rot[seite], RGBein);
  digitalWrite(gruen[seite], RGBaus);
  digitalWrite(blau[seite], RGBaus);
}

Was ich sehe:

  1. Der Text "nach links erkannt" wird so lange angezeigt, wie der Knopf gedrückt wird. Ist ja nicht verkehrt, oder?
  2. Bei dieser Anzeige mußte ich nachbessern: "Anzahl Durchläufe: 10000 Zeit in ms: 632 Zeit pro Durchlauf: 0.0632" ohne und "Anzahl Durchläufe: 10000 Zeit in ms: 650 Zeit pro Durchlauf: 0.0650" mit Blinken. Also kein Grund für einen ATtiny85!
1 Like

Ne ist es nicht. Die ursprüngliche Idee war ja, durch (kurzes) drücken des Button einen Switch darzustellen, der gegenseitig zurückgestellt werden kann.

Na mal sehen - Schule ist ja gerade aus :wink:

Das sind dann beispielsweise 65 Durchläufe, eher mehr. Der µC ist eben fix :slightly_smiling_face:

Das funktioniert, denn M stellt L und R zurück.

Etwas merkwürdig ist das Blinken zwischen Gelb und Weiß. Sollte bei TFL nach meiner Beobachtung eher Blinken zwischen Gelb und Aus, abgelöst von Weiß Dauerlicht sein.

Na momentan ist es nur rot und nicht Gelb :slight_smile:
Ich hab Deinen mal nur für'n UNO kompiliert. da war viel warning bei. Kannst Du das mal auflösen? - das war bisher nicht.

Detecting libraries used...
/arduino-1.8.15/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10815 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I/arduino-1.8.15/hardware/arduino/avr/cores/arduino -I/arduino-1.8.15/hardware/arduino/avr/variants/standard /tmp/arduino_build_480645/sketch/sketch_nov23g.ino.cpp -o /dev/null
Alternatives for WiFi.h: [WiFi@1.2.7]
ResolveLibrary(WiFi.h)
  -> candidates: [WiFi@1.2.7]
/arduino-1.8.15/hardware/tools/avr/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10815 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I/arduino-1.8.15/hardware/arduino/avr/cores/arduino -I/arduino-1.8.15/hardware/arduino/avr/variants/standard -I/arduino-1.8.15/libraries/WiFi/src /tmp/arduino_build_480645/sketch/sketch_nov23g.ino.cpp -o /dev/null
Alternatives for RemoteXY.h: [RemoteXY-Arduino-library-master@3.1.7]
ResolveLibrary(RemoteXY.h)
  -> candidates: [RemoteXY-Arduino-library-master@3.1.7]
Alternatives for SPI.h: [SPI@1.0]
ResolveLibrary(SPI.h)
  -> candidates: [SPI@1.0]

Sketch wird kompiliert...
/arduino-1.8.15/hardware/tools/avr/bin/avr-g++ -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10815 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I/arduino-1.8.15/hardware/arduino/avr/cores/arduino -I/arduino-1.8.15/hardware/arduino/avr/variants/standard -I/arduino-1.8.15/libraries/WiFi/src -I/Arduino/libraries/RemoteXY-Arduino-library-master/src -I/arduino-1.8.15/hardware/arduino/avr/libraries/SPI/src /tmp/arduino_build_480645/sketch/sketch_nov23g.ino.cpp -o /tmp/arduino_build_480645/sketch/sketch_nov23g.ino.cpp.o
In file included from /Arduino/libraries/RemoteXY-Arduino-library-master/src/RemoteXY.h:141:0,
                 from /tmp/arduino_modified_sketch_650010/sketch_nov23g.ino:28:
/Arduino/libraries/RemoteXY-Arduino-library-master/src/RemoteXYComm_WiFi.h: In constructor 'CRemoteXYComm_WiFiPoint::CRemoteXYComm_WiFiPoint(const char*, const char*)':
/Arduino/libraries/RemoteXY-Arduino-library-master/src/RemoteXYComm_WiFi.h:215:41: warning: unused parameter '_wifiSsid' [-Wunused-parameter]
   CRemoteXYComm_WiFiPoint (const char * _wifiSsid, const char * _wifiPassword) : CRemoteXYComm () {
                                         ^~~~~~~~~
/Arduino/libraries/RemoteXY-Arduino-library-master/src/RemoteXYComm_WiFi.h:215:65: warning: unused parameter '_wifiPassword' [-Wunused-parameter]
   CRemoteXYComm_WiFiPoint (const char * _wifiSsid, const char * _wifiPassword) : CRemoteXYComm () {
                                                                 ^~~~~~~~~~~~~
Compiling libraries...
/arduino-1.8.15/libraries/WiFi/src/WiFiUdp.cpp: In member function 'virtual int WiFiUDP::read(unsigned char*, size_t)':
/arduino-1.8.15/libraries/WiFi/src/WiFiUdp.cpp:132:49: warning: unused parameter 'len' [-Wunused-parameter]
 int WiFiUDP::read(unsigned char* buffer, size_t len)
                                                 ^~~
/arduino-1.8.15/libraries/WiFi/src/utility/spi_drv.cpp: In static member function 'static int SpiDrv::waitResponseCmd(uint8_t, uint8_t, uint8_t*, uint8_t*)':
/arduino-1.8.15/libraries/WiFi/src/utility/spi_drv.cpp:160:36: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
         CHECK_DATA(numParam, _data);
                                    ^
/arduino-1.8.15/libraries/WiFi/src/utility/spi_drv.cpp:127:10: warning: this 'else' clause does not guard... [-Wmisleading-indentation]
         }else                                           \
          ^
/arduino-1.8.15/libraries/WiFi/src/utility/spi_drv.cpp:160:9: note: in expansion of macro 'CHECK_DATA'
         CHECK_DATA(numParam, _data);
         ^~~~~~~~~~
/arduino-1.8.15/libraries/WiFi/src/utility/spi_drv.cpp:161:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'else'
         {
         ^
In file included from /arduino-1.8.15/libraries/WiFi/src/utility/spi_drv.cpp:22:0:
/arduino-1.8.15/libraries/WiFi/src/utility/spi_drv.h: At global scope:
/arduino-1.8.15/libraries/WiFi/src/utility/spi_drv.h:41:13: warning: 'initialized' defined but not used [-Wunused-variable]
 static bool initialized = false;
             ^~~~~~~~~~~
/arduino-1.8.15/libraries/WiFi/src/utility/wifi_drv.cpp: In static member function 'static int8_t WiFiDrv::startScanNetworks()':
/arduino-1.8.15/libraries/WiFi/src/utility/wifi_drv.cpp:417:19: warning: comparison is always false due to limited range of data type [-Wtype-limits]
     return (_data == WL_FAILURE)? _data : WL_SUCCESS;
             ~~~~~~^~~~~~~~~~~~~
/arduino-1.8.15/libraries/WiFi/src/utility/wifi_drv.cpp:417:33: warning: enumeral and non-enumeral type in conditional expression [-Wextra]
     return (_data == WL_FAILURE)? _data : WL_SUCCESS;
            ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
/arduino-1.8.15/libraries/WiFi/src/utility/wifi_drv.cpp: In static member function 'static uint8_t WiFiDrv::getEncTypeNetowrks(uint8_t)':
/arduino-1.8.15/libraries/WiFi/src/utility/wifi_drv.cpp:451:10: warning: converting to non-pointer type 'uint8_t {aka unsigned char}' from NULL [-Wconversion-null]
   return NULL;
          ^~~~
/arduino-1.8.15/libraries/WiFi/src/utility/wifi_drv.cpp: In static member function 'static int32_t WiFiDrv::getRSSINetoworks(uint8_t)':
/arduino-1.8.15/libraries/WiFi/src/utility/wifi_drv.cpp:476:10: warning: converting to non-pointer type 'int32_t {aka long int}' from NULL [-Wconversion-null]
   return NULL;
          ^~~~

Der aus #170 läuft auch neu angelegt ohne Probleme. - Was haben wir da blos aufgemacht :wink:

Stimmt, erwischt :roll_eyes:

So ist der Kompiler für den UNO glücklich:

// https://forum.arduino.cc/t/kommunikation-zwischen-arduino-uno-und-attiny85/926563/145?u=agmue
// Kommunikation zwischen Arduino Uno und Attiny85
// getestet mit ESP32; siehe auch f:/Arduino/ESP32/ESP_RemoteXY/

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////


  // RemoteXY select connection mode and include library
  #define REMOTEXY_MODE__ESP8266_HARDSERIAL

  #include <RemoteXY.h>

  // RemoteXY connection settings
  #define REMOTEXY_SERIAL Serial
  #define REMOTEXY_SERIAL_SPEED 115200
  #define REMOTEXY_WIFI_SSID "LKW"
  #define REMOTEXY_WIFI_PASSWORD "Teslasucks"
  #define REMOTEXY_SERVER_PORT 6377

/*
// *** ESP32 Anfang
// RemoteXY select connection mode and include library
#define REMOTEXY_MODE__ESP32CORE_WIFI_POINT
#include <WiFi.h>

#include <RemoteXY.h>

// RemoteXY connection settings
#define REMOTEXY_WIFI_SSID "ESP32_Naturmaterialien"
#define REMOTEXY_WIFI_PASSWORD "12345678"
#define REMOTEXY_SERVER_PORT 6377
// *** ESP32 Ende
*/
// RemoteXY configurate
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
{ 255, 5, 0, 0, 0, 70, 0, 13, 19, 1,
  1, 0, 8, 9, 12, 12, 12, 31, 76, 0,
  1, 0, 24, 9, 12, 12, 5, 31, 77, 0,
  1, 0, 40, 9, 12, 12, 12, 31, 82, 0,
  1, 0, 33, 28, 12, 12, 1, 31, 87, 97,
  114, 110, 98, 108, 105, 110, 107, 101, 114, 0,
  2, 1, 18, 47, 22, 11, 0, 26, 31, 31,
  65, 110, 0, 65, 117, 115, 0
};

// this structure defines all the variables and events of your control interface
struct {

  // input variables
  uint8_t button_L; // =1 if button pressed, else =0
  uint8_t button_M; // =1 if button pressed, else =0
  uint8_t button_R; // =1 if button pressed, else =0
  uint8_t button_W; // =1 if button pressed, else =0
  uint8_t switch_1; // =1 if switch ON and =0 if OFF

  // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////

const byte pinL = 2;
const byte pinM = 3;
const byte pinR = 4;
const byte pinW = 5;
const byte pinS = 6;

const unsigned long frequenz = 500;
const byte rot[]   = {7, 99};
const byte gruen[] = {9, 99};
const byte blau[]  = {8, 99};

#define RGBein LOW
#define RGBaus HIGH

unsigned long blinkmillis[] = {0, 0};
enum {rigthSite, leftSite};

bool rechtsBut;
bool mitteBut;
bool linksBut;
bool warnBut;
bool lichtSwi;
bool nachRechts;
bool nachLinks;
bool nachMitte;

// DurchlaufMessung:
unsigned long xmillis;
unsigned long ymillis;
unsigned int durchlauf;

void setup()
{
  RemoteXY_Init ();
  pinMode(pinL, OUTPUT);
  pinMode(pinM, OUTPUT);
  pinMode(pinR, OUTPUT);
  pinMode(pinW, OUTPUT);
  pinMode(pinS, OUTPUT);

  Serial.begin(115200);
  Serial.println(F("Start..."));
  for (byte b = 0; b < 2; b++)
  {
    pinMode(blau[b], OUTPUT);
    pinMode(rot[b], OUTPUT);
    pinMode(gruen[b], OUTPUT);
    aus(b);
  }
  xmillis = millis();
}

void loop()
{
  RemoteXY_Handler ();

  digitalWrite(pinL, RemoteXY.button_L);
  digitalWrite(pinM, RemoteXY.button_M);
  digitalWrite(pinR, RemoteXY.button_R);
  digitalWrite(pinW, RemoteXY.button_W);
  digitalWrite(pinS, RemoteXY.switch_1);

  durchlauf++;
  if (durchlauf >= 10000)
  {
    ymillis = millis();
    Serial.print(F("Anzahl Durchläufe: ")); Serial.print(durchlauf);
    Serial.print(F("\tZeit in ms: ")); Serial.print(ymillis - xmillis);
    Serial.print(F("\tZeit pro Durchlauf: ")); Serial.println( (ymillis - xmillis) * 1.0 / durchlauf, 4);
    xmillis = millis();
    durchlauf = 0;
  }

  frageJoy();
  setzeLicht();
}
void frageJoy()
{
  rechtsBut = RemoteXY.button_R;
  mitteBut =  RemoteXY.button_M;
  linksBut =  RemoteXY.button_L;
  warnBut =   RemoteXY.button_W;
  lichtSwi =  RemoteXY.switch_1;
  if (rechtsBut)
  {
    Serial.println(F("nach Rechts erkannt"));
    nachRechts = true;
    nachLinks = false;
    nachMitte = false;
  }
  if (linksBut)
  {
    Serial.println(F("nach links erkannt"));
    nachRechts = false;
    nachLinks = true;
    nachMitte = false;
  }
  if (mitteBut)
  {
    Serial.println(F("geradeaus erkannt"));
    nachRechts = false;
    nachLinks = false;
    nachMitte = true;
  }
}

void setzeLicht()
{
  if (nachRechts)        // es geht nach rechts
  {
    if (lichtSwi)           // mit licht
    {
      blinken(rigthSite, true);   // rechts, blinken mit Licht
      an(leftSite);    // links, nur Licht
    }
    else                 // ohne Licht
    {
      blinken(rigthSite, false);   // rechts, nur blinken
      aus(leftSite);    // links, alles aus
    }
  }
  if (nachLinks)
  {
    if (lichtSwi)           // mit licht
    {
      blinken(leftSite, true);   // links, blinken mit Licht
      an(rigthSite);   // rechts, nur Licht
    }
    else                 // ohne Licht
    {
      blinken(leftSite, false);    // links, nur blinken
      aus(rigthSite);   // rechts, alles aus
    }
  }
  if (nachMitte)
  {
    if (lichtSwi)           // mit licht
    {
      an(rigthSite);   // rechts, nur Licht
      an(leftSite);    // links, nur Licht
    }
    else                 // ohne Licht
    {
      aus(rigthSite);   // rechts, alles aus
      aus(leftSite);    // links, alles aus
    }
  }
}

void blinken(const byte seite, const bool licht)
{
  if (millis() - blinkmillis[seite] < frequenz)
  {
    orange(seite);
  }
  else if (!licht)
  {
    aus(seite);
  }
  else
  {
    an(seite);
  }
  if (millis() - blinkmillis[seite] > (frequenz * 2))
  {
    blinkmillis[seite] = millis();
  }
}
void aus(const byte seite)
{
  digitalWrite(rot[seite], RGBaus);
  digitalWrite(gruen[seite], RGBaus);
  digitalWrite(blau[seite], RGBaus);
}
void an(const byte seite)
{
  digitalWrite(rot[seite], RGBein);
  digitalWrite(gruen[seite], RGBein);
  digitalWrite(blau[seite], RGBein);
}
void orange(const byte seite)
{
  digitalWrite(rot[seite], RGBein);
  digitalWrite(gruen[seite], RGBaus);
  digitalWrite(blau[seite], RGBaus);
}

Ausgabe:

Der Sketch verwendet 13744 Bytes (42%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 714 Bytes (34%) des dynamischen Speichers, 1334 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Dem UNO einen Access Point zu entlocken, funktioniert halt nicht und auch Pins jenseits der 19 (A5) sind problematisch :joy:

Der UNO war in #1 gesetzt. Und ja, das geht. ABER: Der ESP-01 braucht externVersorgung.

Ich hatte überlegt ob ein ESP-12E-Shield passt... Bin dann aber gestern ganz von ab gekommen. Ich mache derzeit RS485-Versuche.

Aehm..
Warum hast Du den virtuellen Pins tatsächliche HardwarePins zugeordnet? (und benutzt trotzdem die boolschen Vars)
Nehmen wir an

  digitalWrite(pinL, RemoteXY.button_L);

Das ist doch das selbe wie

  linksBut =  RemoteXY.button_L;

Schlußendlich läuft es doch auf den Teil heraus:

  if (RemoteXY.button_L)
  {
    Serial.println(F("nach links erkannt"));
    nachRechts = false;
    nachLinks = true;
    nachMitte = false;
  }

Ich würde auf die ganzen boolschen Var's

linksBut

etc.... verzichten und das direkt vergleichen.

  if (RemoteXY.button_L)
  {
    Serial.println(F("nach links erkannt"));
    nachRechts = false;
    nachLinks = true;
    nachMitte = false;
  }

(überflüssige ; entfernt)

Der ESP32 kann ganz alleine ein Access Point sein:
#define REMOTEXY_MODE__ESP32CORE_WIFI_POINT
Beim UNO geht das nur mit zusätzlicher Hardware. Was @struppi2508 genau verwendet, konnte ich noch nicht ergründen, möglicherweise ein UNO mit ESP2866, der per AT-Befehlen angesteuert wird. Danach hatte ich in #198 gefragt, aber noch keine Antwort erhalten. Für mich kommentiere ich die Konfiguration aus und verwende meine eigene nur für den ESP32. Dazu muß aber der Core für den ESP32 installiert sein. Ist das bei Dir der Fall? Wenn nicht wird auf nicht vorhandene Verzeichnisse und Dateien zugegriffen, was nicht funktionieren kann.

Verständlich?

Weil ich ahnungslos bin und mich versuche, systematisch an ein Thema heranzuarbeiten. Da mir die RemoteXY-Bibliothek bislang unbekannt war, nehme ich mir die Ausgabe des Editors vor und erforsche, was ich an Infos erhalte. Mit digitalWrite(pinL, RemoteXY.button_L);sehe ich, ob nur ein kurzer Impuls kommt oder das Signal HIGH ist, solange ich den Knopf drücke. Ist ja nicht ganz unwichtig. Dadurch sehe ich auch, ob die Übertragung Händi - ESP32 funktioniert oder ob eine Fehlfunktion in meiner Programmlogik steckt. Später fliegen solche Fehlersuchsachen natürlich raus.

Den Rest habe ich so übernommen. Da schwanke ich immer zwischen gleich richtig machen oder nicht zu viel verändern, damit der TO sein Programm wiedererkennt.

Ja. Natürlich.
Allerdings: ich bin mittlerweile angepisst von den neuen Änderungen in der Forensoftware; das scrollen ist eine Zumutung und mich würde nicht wundern, wenn es vermehrt zu unsinnigen Nachfragen kommt....

Sorry, aber das war der Ausgangspost.

Du verstehst, was ich oben meinte?

Na dann.

Richtig, aber der UNO alleine kann sich nicht mit einem Händi verbinden. Die Konfiguration #define REMOTEXY_MODE__ESP8266_HARDSERIAL deutet auf einen UNO mit "ESP8266 WiFi module" hin. Habe es gerade mal im Editor probiert.

Nun wünsche ich schöne Träume :sleeping:

Ja, da bin ich ganz Deiner Meinung. Also frisch in die Tasten gegriffen.

Da ich nur eine einzige RGB-LED ohne Controller habe, jetzt mal eine Variante mit RGB-LEDs mit Controller (APA106-F5 also 5 mm Durchmesser). Anordnung der LEDs:

0 Blinker links vorne
1 Fahrlicht vorne
2 Fahrlicht vorne
3 Blinker rechts vorne
4 Blinker links hinten
5 Rücklicht hinten
6 Rücklicht hinten
7 Blinker rechts hinten

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

/*
  // RemoteXY select connection mode and include library
  #define REMOTEXY_MODE__ESP8266_HARDSERIAL

  #include <RemoteXY.h>

  // RemoteXY connection settings
  #define REMOTEXY_SERIAL Serial
  #define REMOTEXY_SERIAL_SPEED 115200
  #define REMOTEXY_WIFI_SSID "LKW"
  #define REMOTEXY_WIFI_PASSWORD "Teslasucks"
  #define REMOTEXY_SERVER_PORT 6377
*/

// *** ESP32 Anfang
// RemoteXY select connection mode and include library
#define REMOTEXY_MODE__ESP32CORE_WIFI_POINT
#include <WiFi.h>
#include <RemoteXY.h>

// RemoteXY connection settings
#define REMOTEXY_WIFI_SSID "ESP32_Naturmaterialien"
#define REMOTEXY_WIFI_PASSWORD "12345678"
#define REMOTEXY_SERVER_PORT 6377
// *** ESP32 Ende

// RemoteXY configurate
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
{ 255, 5, 0, 0, 0, 70, 0, 13, 19, 1,
  1, 0, 8, 9, 12, 12, 12, 31, 76, 0,
  1, 0, 24, 9, 12, 12, 5, 31, 77, 0,
  1, 0, 40, 9, 12, 12, 12, 31, 82, 0,
  1, 0, 33, 28, 12, 12, 1, 31, 87, 97,
  114, 110, 98, 108, 105, 110, 107, 101, 114, 0,
  2, 1, 18, 47, 22, 11, 0, 26, 31, 31,
  65, 110, 0, 65, 117, 115, 0
};

// this structure defines all the variables and events of your control interface
struct {

  // input variables
  uint8_t button_L; // =1 if button pressed, else =0
  uint8_t button_M; // =1 if button pressed, else =0
  uint8_t button_R; // =1 if button pressed, else =0
  uint8_t button_W; // =1 if button pressed, else =0
  uint8_t switch_1; // =1 if switch ON and =0 if OFF

  // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////

#include <FastLED.h>
#define NUM_LEDS 9
CRGB leds[NUM_LEDS];
const byte ledDataPin = 4;

const unsigned long BLINKZEIT = 500;
const byte blinker[2][2]   = { {0, 4}, {3, 7} }; // Blinker links vorne, Blinker links hinten, Blinker rechts vorne, Blinker rechts hinten
const byte fahrlicht[]  = {1, 2};  // vorne
const byte ruecklicht[] = {5, 6};  // hinten

enum {leftSite, rigthSite};
bool nachRechts = false;
bool nachLinks  = false;
bool neu = false;

void setup()
{
  RemoteXY_Init ();

  FastLED.addLeds<WS2812B, ledDataPin, RGB> (leds, NUM_LEDS);
  FastLED.show();

  Serial.begin(115200);
  Serial.println(F("Start..."));
}

void loop()
{
  RemoteXY_Handler ();

  // DurchlaufMessung:
  unsigned long jetzt = millis();
  static unsigned long xmillis = jetzt;
  static unsigned int durchlauf = 0;
  durchlauf++;
  if (durchlauf >= 10000)
  {
    unsigned long ymillis = jetzt;
    Serial.print(F("Anzahl Durchläufe: ")); Serial.print(durchlauf);
    Serial.print(F("\tZeit in ms: ")); Serial.print(ymillis - xmillis);
    Serial.print(F("\tZeit pro Durchlauf: ")); Serial.println( (ymillis - xmillis) * 1.0 / durchlauf, 4);
    xmillis = millis();
    durchlauf = 0;
  }

  frageJoy();
  setzeLicht();

  static unsigned long vorhin = 0;
  if (jetzt - vorhin >= 100)  // besser wäre bei Bedarf
  {
    vorhin = jetzt;
    FastLED.show();
  }
}

void frageJoy()
{
  if (RemoteXY.button_L)
  {
    Serial.println(F("Taste L erkannt"));
    nachRechts = false;
    nachLinks  = true;
  }
  if (RemoteXY.button_M)
  {
    Serial.println(F("Taste M erkannt"));
    nachRechts = false;
    nachLinks  = false;
  }
  if (RemoteXY.button_R)
  {
    Serial.println(F("Taste R erkannt"));
    nachRechts = true;
    nachLinks  = false;
  }
  if (RemoteXY.switch_1)
  {
    fahrlichtEin();
  } else {
    fahrlichtAus();
  }
}

void setzeLicht()
{
  if (nachLinks)
  {
    blinken(leftSite);
  } else {
    blinkerAus(leftSite);
  }
  if (nachRechts)
  {
    blinken(rigthSite);
  } else {
    blinkerAus(rigthSite);
  }
}

void blinken(const byte seite)
{
  unsigned long jetzt = millis();
  static unsigned long blinkmillis = 0;
  static bool EINaus = false;

  if (jetzt - blinkmillis >= BLINKZEIT)
  {
    blinkmillis = jetzt;
    EINaus = !EINaus;
    if (EINaus)
    {
      blinkerEin(seite);
    } else {
      blinkerAus(seite);
    }
  }
}

void blinkerAus(const byte seite)
{
  leds[blinker[seite][0]] = CRGB::Black;
  leds[blinker[seite][1]] = CRGB::Black;
}

void blinkerEin(const byte seite)
{
  leds[blinker[seite][0]] = CRGB::Yellow;
  leds[blinker[seite][1]] = CRGB::Yellow;
}

void fahrlichtAus()
{
  leds[fahrlicht[0]] = CRGB::Black;
  leds[fahrlicht[1]] = CRGB::Black;
  leds[ruecklicht[0]] = CRGB::Black;
  leds[ruecklicht[1]] = CRGB::Black;
}

void fahrlichtEin()
{
  leds[fahrlicht[0]] = CRGB::White;
  leds[fahrlicht[1]] = CRGB::White;
  leds[ruecklicht[0]] = CRGB::Red;
  leds[ruecklicht[1]] = CRGB::Red;
}

TODO:

  1. FastLED.show nicht zeitgesteuert, sondern bei Bedarf.
  2. Warnblinkfunktion

Na schick..
Nu blos noch überzeugen, das die Löcher gebohrt werden.

Nee, das habe ich nur für uns beide gemacht, einfach so :innocent:


Jetzt mit Tagfahrlicht in den vorderen Blinkern, Warnblinkfunktion und LED-Update nach Zeit und Bedarf:

// getestet mit ESP32

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

/*
  // RemoteXY select connection mode and include library
  #define REMOTEXY_MODE__ESP8266_HARDSERIAL

  #include <RemoteXY.h>

  // RemoteXY connection settings
  #define REMOTEXY_SERIAL Serial
  #define REMOTEXY_SERIAL_SPEED 115200
  #define REMOTEXY_WIFI_SSID "LKW"
  #define REMOTEXY_WIFI_PASSWORD "Teslasucks"
  #define REMOTEXY_SERVER_PORT 6377
*/

// *** ESP32 Anfang
// RemoteXY select connection mode and include library
#define REMOTEXY_MODE__ESP32CORE_WIFI_POINT
#include <WiFi.h>
#include <RemoteXY.h>

// RemoteXY connection settings
#define REMOTEXY_WIFI_SSID "ESP32_Naturmaterialien"
#define REMOTEXY_WIFI_PASSWORD "12345678"
#define REMOTEXY_SERVER_PORT 6377
// *** ESP32 Ende

// RemoteXY configurate
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
{ 255, 5, 0, 0, 0, 70, 0, 13, 19, 1,
  1, 0, 8, 9, 12, 12, 12, 31, 76, 0,
  1, 0, 24, 9, 12, 12, 5, 31, 77, 0,
  1, 0, 40, 9, 12, 12, 12, 31, 82, 0,
  1, 0, 33, 28, 12, 12, 1, 31, 87, 97,
  114, 110, 98, 108, 105, 110, 107, 101, 114, 0,
  2, 1, 18, 47, 22, 11, 0, 26, 31, 31,
  65, 110, 0, 65, 117, 115, 0
};

// this structure defines all the variables and events of your control interface
struct {

  // input variables
  uint8_t button_L; // =1 if button pressed, else =0
  uint8_t button_M; // =1 if button pressed, else =0
  uint8_t button_R; // =1 if button pressed, else =0
  uint8_t button_W; // =1 if button pressed, else =0
  uint8_t switch_1; // =1 if switch ON and =0 if OFF

  // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////

#include <FastLED.h>
#define NUM_LEDS 9
CRGB leds[NUM_LEDS];
const byte ledDataPin = 4;

const uint32_t FARBE_TFL = 0x2F2F2F;
const unsigned long BLINKZEIT = 500;
const byte blinker[2][2]   = { {0, 4}, {3, 7} }; // Blinker links vorne, Blinker links hinten, Blinker rechts vorne, Blinker rechts hinten
const byte fahrlicht[]  = {1, 2};  // vorne
const byte ruecklicht[] = {5, 6};  // hinten

enum {leftSite, rigthSite, both};
bool nachRechts = false;
bool nachLinks  = false;
bool warnblinken = false;
bool ledupdate = false;

void setup()
{
  RemoteXY_Init ();

  FastLED.addLeds<WS2812B, ledDataPin, RGB> (leds, NUM_LEDS);
  FastLED.show();

  Serial.begin(115200);
  Serial.println(F("Start..."));
}

void loop()
{
  RemoteXY_Handler ();

  // DurchlaufMessung:
  unsigned long jetzt = millis();
  static unsigned long xmillis = jetzt;
  static unsigned int durchlauf = 0;
  durchlauf++;
  if (durchlauf >= 10000)
  {
    unsigned long ymillis = jetzt;
    Serial.print(F("Anzahl Durchläufe: ")); Serial.print(durchlauf);
    Serial.print(F("\tZeit in ms: ")); Serial.print(ymillis - xmillis);
    Serial.print(F("\tZeit pro Durchlauf: ")); Serial.println( (ymillis - xmillis) * 1.0 / durchlauf, 4);
    xmillis = millis();
    durchlauf = 0;
  }

  frageJoy();
  setzeLicht();

  static unsigned long vorhin = 0;
  if ( ledupdate || (jetzt - vorhin >= 100) )  // nach Zeit und Bedarf gesteuert
  {
    vorhin = jetzt;
    FastLED.show();
  }
}

void frageJoy()
{
  if (RemoteXY.button_M)
  {
    Serial.println(F("Taste M erkannt"));
    nachRechts = false;
    nachLinks  = false;
    warnblinken = false;
  }
  if (RemoteXY.button_L)
  {
    Serial.println(F("Taste L erkannt"));
    nachRechts = false;
    nachLinks  = true;
    warnblinken = false;
  }
  if (RemoteXY.button_R)
  {
    Serial.println(F("Taste R erkannt"));
    nachRechts = true;
    nachLinks  = false;
    warnblinken = false;
  }
  if (RemoteXY.button_W)
  {
    nachRechts = false;
    nachLinks  = false;
    warnblinken = true;
  }
  if (RemoteXY.switch_1)
  {
    fahrlichtEin();
  } else {
    fahrlichtAus();
  }
}

void setzeLicht()
{
  if (warnblinken)
  {
    blinken(both);
  } else {
    if (nachLinks)
    {
      blinken(leftSite);
    } else {
      blinkerTFL(leftSite);
    }
    if (nachRechts)
    {
      blinken(rigthSite);
    } else {
      blinkerTFL(rigthSite);
    }
  }
}

void blinken(const byte seite)
{
  unsigned long jetzt = millis();
  static unsigned long blinkmillis = 0;
  static bool EINaus = false;

  if (jetzt - blinkmillis >= BLINKZEIT)
  {
    blinkmillis = jetzt;
    EINaus = !EINaus;
    if (EINaus)
    {
      if (seite == both)        // Warnblinker
      {
        blinkerEin(leftSite);
        blinkerEin(rigthSite);
      } else {                  // normal
        blinkerEin(seite);
      }
    } else {
      if (seite == both)        // Warnblinker
      {
        blinkerAus(leftSite);
        blinkerAus(rigthSite);
      } else {                  // normal
        blinkerAus(seite);
      }
    }
  }
}

void blinkerTFL(const byte seite)
{
  leds[blinker[seite][0]] = FARBE_TFL;
  leds[blinker[seite][1]] = CRGB::Black;
  ledupdate = true;
}

void blinkerAus(const byte seite)
{
  leds[blinker[seite][0]] = CRGB::Black;
  leds[blinker[seite][1]] = CRGB::Black;
  ledupdate = true;
}

void blinkerEin(const byte seite)
{
  leds[blinker[seite][0]] = CRGB::Yellow;
  leds[blinker[seite][1]] = CRGB::Yellow;
  ledupdate = true;
}

void fahrlichtAus()
{
  leds[fahrlicht[0]] = CRGB::Black;
  leds[fahrlicht[1]] = CRGB::Black;
  leds[ruecklicht[0]] = CRGB::Black;
  leds[ruecklicht[1]] = CRGB::Black;
}

void fahrlichtEin()
{
  leds[fahrlicht[0]] = CRGB::White;
  leds[fahrlicht[1]] = CRGB::White;
  leds[ruecklicht[0]] = CRGB::Red;
  leds[ruecklicht[1]] = CRGB::Red;
}