Arduino Code für Bluetooth-I2C-Datenübertragung (Tutorial #21)
Das ist der Arduino-Code und ESP32-Code aus Tutorial 21: “Bluetooth-I2C-Datenübertragung”.
Hier kommt ihr zum Video mit einer ausführlichen Erklärung des Codes:
Ihr findet die Programme auch in unserem Github-Repo
Programm für den ESP32:
/*
* Minimal-Beispiel für ESP32
* Empfang von Daten über Bluetooth von Android Smartphone
* Weiterschicken der Daten über I2C
* Robotic Tutorials, Niko Rosberg, 25.12.2021
*
*/
#include <Wire.h> // library für I2C
#include "BluetoothSerial.h" // library für bluetooth
#define I2C_FREQ 100000 // 100kHz I2C speed
#define SDA_0 21 // SDA pin
#define SCL_0 22 // SCL pin
#define NANO 0x04 // slave I2C Adresse (muss gleich sein wie im Arduino-Sketch)
uint8_t bt_message = 0; // für Bluetooth Empfang
uint8_t i2c_message = 0; // für I2C Nachricht
#define LED 2 // internal LED pin
TwoWire I2C_0 = TwoWire(0); // Initialisierung des I2C bus
BluetoothSerial SerialBT; // Erstellen eines Objekts für die Bluetooth-Übertragung
void setup() {
I2C_0.begin(SDA_0, SCL_0, I2C_FREQ); // begin I2C bus
SerialBT.begin("RoboticTutorials");
pinMode(LED, OUTPUT);
}
void loop() {
// erhalte bluetooth Nachricht
if(SerialBT.available()) {
digitalWrite(LED, HIGH);
bt_message = SerialBT.read();
i2c_message = bt_message;
// sende i2c_message zum Arduino
I2C_0.beginTransmission(NANO);
I2C_0.write(i2c_message);
I2C_0.endTransmission();
digitalWrite(LED, LOW);
}
delay(10);
}
Hier ist das Programm für den Arduino Nano:
/*
* Minimal-Beispiel zum Empfang von I2C-Daten mit dem Arduino Nano vom ESP32.
* Robotic Tutorials, Niko Rosberg, 25.12.2021
*/
#include <Wire.h> // I2C-Library
#define I2C_ADDRESS 0x04 // I2C-Adresse des ESP32
#define LED LED_BUILTIN // Pin-Nummer für interne LED des Arduino
// I2C pins
#define SDA A4
#define SCL A5
volatile uint8_t msg = 0x00; // Variable für I2C-Nachricht
void setup() {
Wire.begin(I2C_ADDRESS); // Initialisierung der I2C-Schnittstelle
Wire.onReceive(readI2Cinput); // Aktivierung der I2C-Interrupt-Funktion
pinMode(LED, OUTPUT);
}
void loop() {
controlLED(msg, 200);
delay(1000);
}
void readI2Cinput(int howMany) {
while(Wire.available() > 0) {
msg = Wire.read();
}
}
void controlLED(uint8_t number, int interval) {
for(int i=0; i<number; i++) {
digitalWrite(LED, HIGH);
delay(interval);
digitalWrite(LED, LOW);
delay(interval);
}
msg = 0;
}