sketch_65_nanoslave_I2C_zaehlen   (Arduino Nano)

sketch_65_nanoslave_I2C_zaehlen
  /*Senden (write) von Daten ueber die I2C serielle Schnittstelle von ESP8266 NodeMCU zu Arduino Nano und zurueck.
  ESP fungiert als Master, Nano als Slave.
  ESP sendet jede Sekunde die Zeichenfolge "Wert ist jetzt: " sowie ein Zahlenwert 0...255.
  Im Gegenzug sendet Nano die Zeichenfolge "Hello ESP from Nano! ". 
  Diese Daten werden jeweils im seriellen Monitor angezeigt(fuer die Anzeige das jeweilige COM-Port auswaehlen). 
  SDA (Serial Data):  ESP Pin D2 - Nano Pin A4
  SCL (Serial Clock): ESP Pin D1 - Nano Pin A5
  Auf Nano wird dieser sketch geladen, auf ESP sketch_64_I2C_espmaster_zaehlen.
    
  Die Spannungsversorgung von ESP als auch von Nano erfolgt ueber die USB-Kabel. 
  Beachte, fuer diesen Sketch muss bei "Werkzeugen" eingetragen sein:
  Board "Arduino Nano" / Prozessor:"ATmega 328 Old Bootloader" und das richtige COM-Port.
  */
  #include <Wire.h>                     //Das Bibliotheksprogramm steht unter: arduino-1.8.8\hardware\arduino\avr\libraries\Wire
  
  void setup()
  {
   Wire.begin(8);                       // Anschluss an den I2C-Bus unter der Adresse #8(dezimal); bei Master steht generell nur Wire.begin()
   Wire.onReceive(receiveEvent);        // Interrupt: Byte wurde empfangen und ist abholbereit aus dem Empfangspuffer mit Wire.read (auch Wire.receive)
                                        // Es wird void receiveEvent aufgerufen (siehe unten)
   Wire.onRequest(requestEvent);        // Wenn der Master Daten vom Slave anfordert, wird void requestEvent aufgerufen
   Serial.begin(9600);                  // Starten serieller Monitor (muss auch auf 9600 eingestellt sein) zur kuenftigen Anzeige der empfangenen Werte
  }
  
  void loop()
  {
  delay(100);                           // wird immer wiederholt, warten auf Interrupt-Routine unten
  }
  
  /*Diese Funktion wird immer dann ausgefuehrt, wenn Daten vom Master empfangen wurden (siehe oben Wire.onReceive)*/
  void receiveEvent(int howMany) 
  {
   while (1 < Wire.available())         // wiederhole solange alle ausser das letzte Zeichen ankamen
                                        // Wire.available liefert Anzahl der noch im Empfangspuffer befindlichen Bytes
                                        // Es werden alle 16 Bytes des vom Master gesendeten String "Wert ist jetzt: " abgeholt                                    
   { 
    char c = Wire.read();               // Holt Bytes aus dem Empfangspuffer, solange er noch gefuellt ist (auch: Wire.receive) 
    Serial.print(c);                    // Ausgabe des Wertes (char ... character)
   }
  int wert = Wire.read();               // jetzt wird das letzte Byte geholt, es enthaelt die hochgezaehlte Zahl
  Serial.println(wert);                 // Ausgabe und neue Zeile
  }
  
  /*Diese Funktion wird immer dann ausgefuehrt, wenn der Master Daten vom Slave angefragt hat (siehe oben Wire.onRequest)*/
  void requestEvent()
  {
   Wire.write("Hello ESP from Nano! ");          // Senden dieser Zeichenfolge (string)
  }