# Expert: Communicatie met externe apparaten

Aan het einde van dit hoofdstuk kun je:

Uitleggen wat seriële en I2C-communicatie zijn en hoe ze werken met de Arduino.
Data versturen naar en ontvangen van de computer via de seriële monitor.
Sensoren en apparaten aansluiten die gebruikmaken van het I2C-protocol.
Een programma schrijven dat sensorwaarden uitleest via I2C en weergeeft op de computer.


# Wat is seriële communicatie en i2c communicatie?

[![image.png](https://www.digitaallab.nl/uploads/images/gallery/2024-10/scaled-1680-/DCtimage.png)](https://www.digitaallab.nl/uploads/images/gallery/2024-10/DCtimage.png)

### Wat is Seriële Communicatie?

- **Definitie**: Een methode om data één bit per keer te verzenden over een communicatiekanaal.
- **Toepassing**: Veel gebruikt voor communicatie tussen microcontrollers en computers of andere apparaten.
- **Seriële Monitor**: Een ingebouwd hulpmiddel in de Arduino IDE om data te verzenden en ontvangen via de seriële poort.

### De Seriële Monitor Gebruiken

- **Openen**: Ga in de Arduino IDE naar **Hulpmiddelen &gt; Seriële Monitor** of klik op het vergrootglas-icoon.
- **Baudrate instellen**: Zorg ervoor dat de baudrate in de seriële monitor overeenkomt met die in je code (bijv. 9600 baud).

### Wat is I2C-Communicatie?

- **Definitie**: I2C (Inter-Integrated Circuit) is een synchrone, multi-master, multi-slave, seriële communicatiebus.
- **Kenmerken**: 
    - **Twee draden**: SDA (data) en SCL (klok).
    - **Adressering**: Elk apparaat op de bus heeft een uniek adres.
- **Toepassing**: Veel gebruikt voor communicatie met sensoren, displays, en andere randapparatuur.

### Sensoren en Apparaten met I2C

- **Voorbeelden**: 
    - **BMP280/BME280**: Druk- en temperatuursensoren.
    - **OLED-displays**: Kleine schermen voor tekst en grafieken.
    - **RTC (Real-Time Clock) modules**: Voor tijdregistratie.
    - **GY-521 (MPU-6050)**: Versnellingsmeter en gyroscoop.

# i2c scannner

### I2C-Scanner

Voordat je met I2C-apparaten werkt, is het handig om te weten welk adres het apparaat heeft.

**I2C-Scanner Code**:

```c++
#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("I2C Scanner gestart");
}

void loop() {
  byte error, address;
  int nDevices = 0;

  Serial.println("Apparaten zoeken...");

  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("I2C apparaat gevonden op adres 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address, HEX);
      nDevices++;
    } else if (error==4) {
      Serial.print("Onbekende error op adres 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address, HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("Geen I2C apparaten gevonden\n");
  else
    Serial.println("Klaar\n");

  delay(5000);
}

```

**Instructies**:

1. Sluit je I2C-apparaat aan op de Arduino.
2. Verbind SDA met A4 en SCL met A5 (Arduino Uno).
3. Upload de I2C-scanner code.
4. Open de seriële monitor om het I2C-adres van je apparaat te zien.

# Voorbeeld: gebruik van een BMP280 temperatuur- en druksensor

**Componenten**:

- BMP280 module
- Arduino Uno
- Breadboard en jumper wires

**Aansluiting**:

- **VCC** van de sensor naar 3.3V op de Arduino
- **GND** naar GND
- **SDA** naar A4
- **SCL** naar A5

**Let op**: De BMP280 werkt op 3.3V; sluit deze niet aan op 5V.

**Bibliotheek Installeren**:

- Ga naar **Schets &gt; Bibliotheek gebruiken &gt; Bibliotheken beheren**.
- Zoek naar "Adafruit BMP280" en installeer deze bibliotheek.

**Code om de BMP280 uit te lezen**:

```c++
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp; // I2C

void setup() {
  Serial.begin(9600);
  if (!bmp.begin(0x76)) {  // Gebruik het adres dat je met de I2C-scanner hebt gevonden
    Serial.println("BMP280 niet gevonden!");
    while (1);
  }
}

void loop() {
  Serial.print("Temperatuur = ");
  Serial.print(bmp.readTemperature());
  Serial.println(" °C");

  Serial.print("Druk = ");
  Serial.print(bmp.readPressure()/100.0F);
  Serial.println(" hPa");

  Serial.println();
  delay(2000);
}

```

**Uitleg van de Code**:

- `Adafruit_BMP280 bmp;`: Maakt een nieuw BMP280 object aan.
- `bmp.begin(0x76);`: Initialiseert de sensor op het gegeven I2C-adres.
- `bmp.readTemperature()`: Leest de temperatuur uit.
- `bmp.readPressure()`: Leest de luchtdruk uit.

### Data Versturen via Seriële en I2C-Communicatie

- **Serieel**: Data wordt naar de seriële monitor gestuurd voor weergave.
- **I2C**: Data wordt via de I2C-bus opgehaald van de sensor.

### Opdracht

**Doel**: Schrijf een programma dat temperatuur- en drukwaarden uitleest van een BMP280 sensor via I2C en deze weergeeft op de computer via de seriële monitor.

**Instructies**:

1. Bouw de schakeling met de BMP280 sensor zoals hierboven beschreven.
2. Installeer de benodigde bibliotheken.
3. Gebruik de I2C-scanner om het adres van je sensor te bepalen.
4. Pas de code aan met het juiste adres indien nodig.
5. Upload de code naar je Arduino.
6. Open de seriële monitor en observeer de temperatuur- en drukwaarden.
7. Experimenteer met het veranderen van de omgeving (bijv. verwarmen van de sensor) en observeer de veranderingen.

### Extra Uitdagingen

- **Uitbreiding 1**: Voeg een OLED-display toe (I2C) en toon de sensorwaarden op het scherm.
    
    **Hint**: Gebruik de **Adafruit SSD1306** bibliotheek.
- **Uitbreiding 2**: Sluit meerdere I2C-apparaten aan op dezelfde bus en lees data uit van elk apparaat.

**Belangrijk**: Alle I2C-apparaten worden parallel aangesloten op SDA en SCL. Zorg ervoor dat elk apparaat een uniek adres heeft.

### Veelgemaakte Fouten

- **Verkeerde aansluitingen**: Controleer altijd de SDA en SCL pinnen; op een Arduino Uno zijn dit A4 en A5.
- **Verkeerde voedingsspanning**: Sommige sensoren werken op 3.3V in plaats van 5V.
- **Bibliotheken niet geïnstalleerd**: Vergeet niet de benodigde bibliotheken te installeren.

### Veiligheidstips

- Controleer de datasheet van je sensor voor de juiste voedingsspanning.
- Sluit geen 3.3V sensoren aan op 5V; dit kan de sensor beschadigen.
- Gebruik pull-up weerstanden op de SDA en SCL lijnen als je communicatieproblemen ondervindt (meestal 4.7kΩ).