sketch_66_espmaster_I2C_servos_ansteuern   (ESP8266 NodeMCU)

sketch_66_espmaster_I2C_servos_ansteuern
  /*Ueber die I2C serielle Schnittstelle ist ein ESP8266 NodeMCU (Master) mit mehreren Arduino Nano (Slaves) verbunden. 
  SDA (Serial Data):  ESP Pin D2 - Nano Pin A4
  SCL (Serial Clock): ESP Pin D1 - Nano Pin A5
  
  Auf den ESP wird dieser sketch geladen, auf die Nanos sketch_67_nanoslave_I2C_servos_ansteuern.
  Jeder Nano steuert einen Roboter mit jeweils 4 Servos SG90.
  Das Steuerprogramm (Ablauf Ansteuerung der 4 Servos) ist in den Sketchen der Nanos.
  
  Ueber den seriellen Monitor wird im Sketch des Masters eingegeben, welcher Nano (d.h. welcher Roboter) 
  jeweils ueber den I2C Bus angesprochen werden soll: a1 ... a5 (a steht fuer "Aktion").
  
  Im seriellen Monitor der Nanos als auch des ESP erfolgen Anzeigen zum Ablauf, u.a. auch der "Rueckgabewert"
  vom Slave (sollte "0" sein, sonst war keine Uebertragung erfolgt). 
    
  Die Spannungsversorgung vom ESP als auch der Nanos erfolgt ueber die USB-Kabel. 
  Beachte, fuer diesen Sketch muss bei "Werkzeugen" eingetragen sein:
  Board "NodeMCU 1.0 (ESP 12-E Module)".
  */
  int RW;                                   // Variable zur Speicherung des Rueckgabewertes vom Slave
                                            // "0" signalisiert: Uebertragung erfolgt, aber keine Garantie auf Richtigkeit
  byte robot;                               // Variable, bezeichnet die Nr. der Roboter 1...5
  #include <Wire.h>                         
  
  void setup()
  {
   Wire.begin();                            // Initialisierung der Library Wire.h (beim Master keine Angabe einer Busadresse)
   Serial.begin (9600);                     // Start des seriellen Monitors zur Anzeige der vom Slave empfangenen Daten
  }
  
  void loop()
  {
   if (Serial.available() > 0)              // Wenn Daten vom Serial Monitor da sind (d.h.eingegeben worden sind)...
   { 
    int inByte = Serial.read();             // ...dann lies das erste Byte und speichere es in der Variable inByte
    switch (inByte)                         // und nimm den Wert, der uebertragen wurde, genauer unter die Lupe.
    {           
     case 'a':                              // wenn dieser das Zeichen (character) 'a' fuer Aktion ist...
     {
     robot = Serial.parseInt();             // dann lies erstmal eine Zahl ein (wenn irgendetwas anders kam, ist das Ergebnis 0)
     Serial.print ("Aktion Roboter Nr.");
     Serial.println (robot);                // Anzeige der Roboter-Nr.
     /*Senden zum Slave:*/
     Wire.beginTransmission(robot);         // Vorbereiten Senden ; Empfaenger-Adresse des Slave ist festgelegt im sketch_nanoslave
     Wire.write("Aktion Roboter Nr.");      // Schreiben in den Sendepuffer von 18 Bytes Zeichenfolge(String).
     Wire.write(robot);                     // Schreiben in den Sendepuffer von 1 Byte (Roboter-Nr.) 
     RW=Wire.endTransmission();             // Jetzt erst Senden aller Bytes aus dem Sendepuffer des ESP, dann Stop der Uebertragung
     Serial.print("RW vom Slave: ");
     Serial.println(RW);                    // Anzeige des Rueckgabewertes vom Slave, sollte "0" sein
     }
     default:                               // bei unbekannten Kommandos machen wir einfach garnichts...
     break; 
    }
   }
    else
    {
    /*Empfangen vom Slave:*/
    delay (800);
    Wire.requestFrom(robot,14);             // Anfragen und Lesen vom Slave, Busadresse aus Variable robot 
    while(Wire.available())                 // 14 Zeichen(max 32 Zeichen moeglich),Anzahl muß mit Sketch im Slave korrespondieren
    {
     char c = Wire.read();
     Serial.print(c);                       // Anzeigen der Rueckmeldung vom Slave
    }
     Serial.println();
   }
  }