Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Bouw een Arduino-afstandsmeter en digitale waterpas – Eenvoudige stapsgewijze handleiding

In deze tutorial leren we hoe we een Arduino-afstandsmeter en een digitale waterpas maken. Je kunt de volgende video bekijken of de geschreven tutorial hieronder lezen.

Overzicht

Het apparaat beschikt over een ultrasone sensor voor het meten van de afstand tot het dichtstbijzijnde object, een accelerometer voor het meten van de hoek ten opzichte van de grond, een LCD-scherm voor het tonen van de resultaten en een op maat ontworpen PCB waarop alle componenten zijn aangesloten.

We kunnen het apparaat bedienen met slechts één knop. Zodra we het apparaat aanzetten, moeten we de meeteenheid selecteren.

Door op de knop te drukken kunnen we door de eenheden toggelen, en als we de knop even ingedrukt houden, komen we in het eerste programma. Hier kunnen we de afstand meten en ook de laatste twee metingen opslaan.

Om in het tweede programma te komen, moeten we weer de knop even ingedrukt houden. In dit programma kunnen we een vierkante oppervlakte meten door twee loodrechte afstandsmetingen te nemen.

Het volgende programma is de digitale waterpas en hier kunnen we de hoek ten opzichte van de grond meten.

Met de knop kunnen we toggelen tussen de twee assen of we kunnen ofwel de Pitch of de Roll meten.

Arduino-afstandsmeter schakelschema

Hier is het schakelschema van dit Arduino-project.

Let op dat ik al gedetailleerde tutorials heb over hoe elk van deze modules werkt, en je kunt ze bekijken via de volgende links: Ultrasone sensor-tutorial, LCD-tutorial, MEMS-accelerometer-tutorial.

Je kunt de benodigde componenten voor dit project via de onderstaande links verkrijgen:

  • Ultrasone sensor HC-SR04
  • MPU6050 3-as gyroscoop accelerometer
  • 16×2 Karakter LCD
  • Arduino Nano

Op maat ontworpen PCB

Volgens het schakelschema moeten we de custom PCB ontwerpen en ik deed dat met de gratis online schakelontwerpsoftware EasyEDA.

Zodra we het ontwerp hier afgerond hebben, kunnen we eenvoudig het Gerber-bestand exporteren dat gebruikt wordt voor de productie van de PCB. Je kunt de EasyEDA-projectbestanden van dit project hier bekijken.

Vervolgens kunnen we onze PCB bestellen bij JLCPCB, wat eigenlijk de sponsor van dit project is.

Hier kunnen we het Gerber-bestand slepen en neerzetten. Eenmaal geüpload kunnen we onze PCB bekijken in de Gerber-viewer. Als alles klopt, kunnen we doorgaan, de eigenschappen selecteren die we voor onze PCB willen, en dan onze PCB bestellen tegen een redelijke prijs. Let op: als het je eerste bestelling is bij JLCPCB, kun je tot 10 PCB's voor slechts $2 krijgen.

Het apparaat monteren

Na enkele dagen zijn de PCB's aangekomen. De kwaliteit is geweldig en alles is precies hetzelfde als in het ontwerp.

Ok, nu kunnen we beginnen met het monteren van de elektronica voor dit project. Ik begon met het solderen van penkoppen op de PCB. Op deze manier kunnen we componenten gemakkelijk aan- en afkoppelen wanneer nodig.

Vervolgens soldeerde ik de drie weerstanden. Twee ervan zijn voor de spanningsdeler voor de contrast van de LCD. De 1k-weerstand moet op R1 geplaatst worden en de 220 ohm op R2. De derde is een pull-up-weerstand voor de knop.

Daarna ging ik door met het maken van de behuizing voor het apparaat. Ik koos voor transparant acrylaat omdat ik de schoonheid van alle elektronische componenten zichtbaar wilde maken. Ik had nog 5 mm dik acrylaat liggen van een oud project, en ik gebruikte een zaagzaag om het op maat te zagen.

Vervolgens moest ik een opening voor de LCD aan de bovenzijde van de behuizing maken, die eigenlijk 4 mm dik is omdat het beter past bij de LCD. Eerst boorde ik twee gaten en steek ik een metaalzaag erdoorheen. Met de metaalzaag maakte ik de opening ruw en maakte ik er met een rasp fijne rechte lijnen van, zodat de LCD strak past.

Daarna maakte ik met een Forstner-boor de openingen voor de voedingsschakelaar, de bedieningsknop en de ultrasone sensor.

Zodra alle stukken klaar waren, gebruikte ik 5-minuten epoxy om de behuizing te monteren. Voor de bovenkant plaatste en lijmde ik twee bouten doorheen waarlangs het bovenpaneel kan worden geschoven en bevestigd met enkele moeren erbovenop.

De behuizing is nu klaar, dus ik ging verder met het solderen van penkoppen aan de LCD zodat ik hem gemakkelijk aan de PCB kan bevestigen. Ik solderde ook penkoppen of jumperdraden aan de voedingsschakelaar, de knop en de batterijconnector.

Ten slotte had ik alles klaar om het apparaat te monteren. Ik begon met het plaatsen van de ultrasone sensor op de PCB, en daarna door de gaten in het zijpaneel. Vervolgens het Arduino-board, de accelerometer-module alsook de batterijconnector.

Op het bovenpaneel bevestigde ik de LCD, de voedingsschakelaar en de knop, en verbond ze met de PCB. Ten slotte plaatste ik de 9V-batterij in de connector en bevestigde het bovenpaneel met de moeren.

En dat is het, het Arduino-afstandsmeter-project is klaar, maar wat er nog overblijft in deze video is uitleggen hoe het programma werkt, dus laten we eens kijken naar de Arduino-code.

Arduino-afstandsmeter en digitale waterpas broncode

Omdat de code wat langer is, voor beter begrip, zal ik de broncode in secties posten met uitleg voor elke sectie. Aan het einde van dit artikel post ik de complete broncode.

Eerst moeten we de Wire.h-bibliotheek includeren voor de I2C-communicatie van de accelerometer, alsook de LiquidCrystal.h-bibliotheek voor het besturen van de LCD. Vervolgens moeten we de LCD definiëren, het I2C-adres van de MPU6050-accelerometer-module, de pinnen van de ultrasone sensor, alsook enkele variabelen die nodig zijn voor het programma.

#include <Wire.h> // I2C-communicatiebibliotheek
#include <LiquidCrystal.h> // bevat de LiquidCrystal-bibliotheek
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Maakt een LCD-object. Parameters: (rs, enable, d4, d5, d6, d7)
const int MPU = 0x68; // I2C-adres van de MPU6050-accelerometer
#define trigPin 8
#define echoPin 9
#define selectButton 10
int16_t AcX, AcY, AcZ;
long duration;
float distance;
int program = 0;
float d = 0;
float d1 = 0;
float d2 = 0;
float area = 0;
int axis = 0;
int angle = 0;
int unitSelect = 0;
String unit = "cm";

In de setup-sectie moeten we zowel de I2C-interface van de accelerometer als het vloeistofkristalscherm initialiseren, alsook de pin-modes definiëren voor de trigger- en echo-pinnen van de ultrasone sensor, en de knop-pin.

void setup() {
  // Initialiseer interface naar de MPU6050
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  lcd.begin(16, 2); // Initialiseert de interface naar het LCD-scherm
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(selectButton, INPUT_PULLUP);
}

In de hoofdlus-sectie hebben we een switch-statement waarmee we kunnen toggelen tussen de verschillende programma's van ons apparaat. In de eerste, of case nummer 0, selecteren we de meeteenheid. Met de lcd.print()-functie printen we de tekst op de LCD en met de if-statements toggelen we door de vier meeteenheden.

switch (program) {
  // Schakel tussen verschillende programma's
  case 0:
    // Selecteer meeteenheid
    lcd.setCursor(0, 0);
    lcd.print("Selecteer eenheid: ");
    lcd.setCursor(13, 0);
    lcd.print(unit);
    lcd.print(" ");
    delay(10);
    // Als knop ingedrukt - verander eenheid
    if (digitalRead(selectButton) == 0) {
      if (unitSelect == 0) {
        unit = "in";
        unitSelect = 1;
      } else if (unitSelect == 1) {
        unit = "m";
        unitSelect = 2;
      } else if (unitSelect == 2) {
        unit = "ft";
        unitSelect = 3;
      } else if (unitSelect == 3) {
        unit = "cm";
        unitSelect = 0;
      }
      // Als knop langer dan half seconde ingedrukt - verander programma
      delay(500);
      if (digitalRead(selectButton) == 0) {
        program = 1;
        lcd.clear();
        delay(500);
      }
    }
    break;

We moeten hier opmerken dat de unitSelect-variabele actie onderneemt in de getDistance()-aangepaste functie, waar hij eigenlijk aangeeft naar welke eenheid we de basis-cm-eenheid die we van de ultrasone sensor krijgen, moeten converteren.

// Eenheden converteren
if (unitSelect == 1) {
  distance = distance; // cm naar cm
  unit = "cm";
} else if (unitSelect == 2) {
  distance = distance * 0.393701; // cm naar in
  unit = "in";
} else if (unitSelect == 3) {
  distance = distance * 0.01; // cm naar m
  unit = "m";
} else if (unitSelect == 0) {
  distance = distance * 0.0328; // cm naar ft
  unit = "ft";
}

Om de meeteenheid te selecteren en ook in het eerste programma van het apparaat te komen, hoeven we de knop alleen langer dan half seconde ingedrukt te houden.

// Als knop langer dan half seconde ingedrukt - verander programma
delay(500);
if (digitalRead(selectButton) == 0) {
  program = 1;
  lcd.clear();
  delay(500);
}
break;

In case nummer 1 of in het afstandsmeetprogramma krijgen we eerst de afstand tot het dichtstbijzijnde object met behulp van de getDistance()-aangepaste functie.

case 1:
  // Afstandsmeetprogramma
  distance = getDistance(); // Afstand tot dichtstbijzijnde object
  lcd.setCursor(0, 0);
  lcd.print("Afst: ");
  lcd.print(distance);
  lcd.print(" ");
  lcd.setCursor(14, 0);
  lcd.print(unit);
  delay(10);
  lcd.setCursor(0, 1);
  lcd.print("d:");
  lcd.setCursor(8, 1);
  lcd.print("d:");
  delay(200);
  // Afstand 1 opslaan
  if (digitalRead(selectButton) == 0) {
    if (d == 0) {
      lcd.setCursor(0, 1);
      lcd.print("d: ");
      lcd.setCursor(2, 1);
      lcd.print(distance);
      d = 1;
      delay(100);
    }
    // Afstand 2 opslaan
    else if (d == 1) {
      lcd.setCursor(8, 1);
      lcd.print("d: ");
      lcd.setCursor(10, 1);
      lcd.print(distance);
      d = 0;
      delay(100);
    }
    // Als knop langer dan half seconde ingedrukt, verander programma
    delay(500);
    if (digitalRead(selectButton) == 0) {
      program = 2;
      d = 0;
      lcd.clear();
      delay(500);
    }
  }
  break;

Laten we eens kijken hoe deze functie werkt.

//===== getDistance - Aangepaste functie
float getDistance() {
  // Wis de trigPin
  digitalWrite(trigPin, LOW);
  // Zet de trigPin op HIGH voor 10 microseconden
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Lees de echoPin, retourneert de geluidsgolftijd in microseconden
  duration = pulseIn(echoPin, HIGH);
  // Afstand berekenen
  distance = duration * 0.034 / 2; // afstand in cm
  // Eenheden converteren
  if (unitSelect == 1) {
    distance = distance;
    unit = "cm";
  } else if (unitSelect == 2) {
    distance = distance * 0.393701;
    unit = "in";
  } else if (unitSelect == 3) {
    distance = distance * 0.01;
    unit = "m";
  } else if (unitSelect == 0) {
    distance = distance * 0.0328;
    unit = "ft";
  }
  return distance;
}

Hier gebruiken we de trigger-pin om de sensor te laten een ultrasone geluidsgolf genereren. Vervolgens meten we met de echo-pin en de pulseIn()-functie de duur die de golf heeft afgelegd van de sensor naar het object en terug. Rekening houdend met de geluidssnelheid en de reistijd kunnen we de afstand gemakkelijk berekenen. We printen de gemeten afstand samen met wat tekst op de LCD en met de "if"-statements, als we de knop indrukken, printen of slaan we de laatste twee metingen op.

Vervolgens is er het programma voor het berekenen van de oppervlakte, waarin we vergelijkbare methoden gebruiken. We moeten twee loodrechte metingen nemen en ze simpelweg vermenigvuldigen om de oppervlakte van het vierkant dat ze vormen te krijgen.

case 2:
  // Oppervlakte-meetprogramma
  distance = getDistance();
  lcd.setCursor(0, 0);
  lcd.print("Oppervlakte: ");
  lcd.print(area);
  lcd.setCursor(12, 0);
  lcd.print(unit);
  lcd.print("^2");
  delay(200);
  if (d == 0) {
    lcd.setCursor(0, 1);
    lcd.print("d1: ");
    lcd.setCursor(3, 1);
    lcd.print(distance);
    delay(200);
  } else if (d == 1) {
    lcd.setCursor(9, 1);
    lcd.print("d2: ");
    lcd.setCursor(12, 1);
    lcd.print(distance);
    delay(200);
  } else if (d == 2) {
    lcd.setCursor(6, 0);
    lcd.print(area);
    delay(200);
  }
  // Afstand 1 opslaan
  if (digitalRead(selectButton) == 0) {
    if (d == 0) {
      lcd.setCursor(0, 1);
      lcd.print("d1: ");
      lcd.setCursor(3, 1);
      lcd.print(distance);
      d = 1;
      d1 = distance;
      delay(100);
    }
    // Afstand 2 opslaan
    else if (d == 1) {
      lcd.setCursor(9, 1);
      lcd.print("d2: ");
      lcd.setCursor(12, 1);
      lcd.print(distance);
      d = 2;
      d2 = distance;
      area = d1 * d2; // Bereken de oppervlakte
      delay(100);
    } else if (d == 2) {
      lcd.clear();
      d = 0;
      area = 0;
      delay(100);
    }
    // Als knop langer dan half seconde ingedrukt, verander programma
    delay(500);
    if (digitalRead(selectButton) == 0) {
      program = 3;
      d = 0;
      lcd.clear();
      delay(500);
    }
  }
  break;

De laatste case is het hoekmeetprogramma. Hier moeten we de accelerometerdata uitlezen, wat eigenlijk de kracht is van het aardse zwaarteveld in drie verschillende assen, X, Y en Z. De waarde van elke as wordt opgeslagen in 2 registers, dus we moeten in totaal 6 registers uitlezen en combineren om de juiste waarde te krijgen.

case 3:
  // Hoekmeetprogramma
  // Lees de accelerometerdata
  Wire.beginTransmission(MPU);
  Wire.write(0x3B); // Start met register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // Lees 6 registers totaal, elke aswaarde zit in 2 registers
  AcX = Wire.read() << 8 | Wire.read(); // X-aswaarde
  AcY = Wire.read() << 8 | Wire.read(); // Y-aswaarde
  AcZ = Wire.read() << 8 | Wire.read(); // Z-aswaarde
  if (axis == 0) {
    // Bereken de Pitch-hoek (rotatie om Y-as)
    angle = atan(-1 * AcX / sqrt(pow(AcY, 2) + pow(AcZ, 2))) * 180 / PI;
    lcd.setCursor(0, 0);
    lcd.print("Pitch");
  } else if (axis == 1) {
    // Bereken de Roll-hoek (rotatie om X-as)
    angle = atan(-1 * AcY / sqrt(pow(AcX, 2) + pow(AcZ, 2))) * 180 / PI;
    lcd.setCursor(0, 0);
    lcd.print("Roll ");
  }
  lcd.setCursor(0, 1);
  lcd.print("Hoek: ");
  lcd.print(abs(angle));
  lcd.print(" ");
  lcd.setCursor(10, 1);
  lcd.print("deg");
  delay(200);
  // As wijzigen
  if (digitalRead(selectButton) == 0) {
    if (axis == 0) {
      axis = 1;
      delay(100);
    }
    else if (axis == 1) {
      axis = 0;
      delay(100);
    }
    // Als knop langer dan half seconde ingedrukt, verander programma
    delay(500);
    if (digitalRead(selectButton) == 0) {
      program = 0;
      lcd.clear();
      delay(500);
    }
  }
  break;

Zodra we de X, Y en Z-waarden van de accelerometer hebben, kunnen we de Pitch-hoek (rotatie om de Y-as) en de Roll-hoek (rotatie om de X-as) berekenen met de twee vergelijkingen. Je kunt meer details over deze vergelijkingen vinden in de Freescale Semiconductor application note, Tilt Sensing Using a Three-Axis Accelerometer. Daarna printen we de waarden met wat tekst op de LCD, en door op de knop te drukken veranderen we wat er op de LCD getoond wordt, ofwel de Pitch of de Roll-hoek.

Hier is de complete broncode voor dit Arduino-afstandsmeter- en waterpas-project:

/* DIY Digitale Afstandsmeter en Waterpas
   by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
const int MPU = 0x68;
#define trigPin 8
#define echoPin 9
#define selectButton 10
int16_t AcX, AcY, AcZ;
long duration;
float distance;
int program = 0;
float d = 0;
float d1 = 0;
float d2 = 0;
float area = 0;
int axis = 0;
int angle = 0;
int unitSelect = 0;
String unit = "cm";

void setup() {
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  lcd.begin(16, 2);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(selectButton, INPUT_PULLUP);
}

void loop() {
  switch (program) {
    case 0:
      lcd.setCursor(0, 0);
      lcd.print("Selecteer eenheid: ");
      lcd.setCursor(13, 0);
      lcd.print(unit);
      lcd.print(" ");
      delay(10);
      if (digitalRead(selectButton) == 0) {
        if (unitSelect == 0) { unit = "in"; unitSelect = 1; }
        else if (unitSelect == 1) { unit = "m"; unitSelect = 2; }
        else if (unitSelect == 2) { unit = "ft"; unitSelect = 3; }
        else if (unitSelect == 3) { unit = "cm"; unitSelect = 0; }
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 1;
          lcd.clear();
          delay(500);
        }
      }
      break;
    case 1:
      distance = getDistance();
      lcd.setCursor(0, 0);
      lcd.print("Afst: ");
      lcd.print(distance);
      lcd.print(" ");
      lcd.setCursor(14, 0);
      lcd.print(unit);
      delay(10);
      lcd.setCursor(0, 1);
      lcd.print("d:");
      lcd.setCursor(8, 1);
      lcd.print("d:");
      delay(200);
      if (digitalRead(selectButton) == 0) {
        if (d == 0) {
          lcd.setCursor(0, 1);
          lcd.print("d: ");
          lcd.setCursor(2, 1);
          lcd.print(distance);
          d = 1;
          delay(100);
        } else if (d == 1) {
          lcd.setCursor(8, 1);
          lcd.print("d: ");
          lcd.setCursor(10, 1);
          lcd.print(distance);
          d = 0;
          delay(100);
        }
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 2;
          d = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;
    case 2:
      distance = getDistance();
      lcd.setCursor(0, 0);
      lcd.print("Oppervlakte: ");
      lcd.print(area);
      lcd.setCursor(12, 0);
      lcd.print(unit);
      lcd.print("^2");
      delay(200);
      if (d == 0) {
        lcd.setCursor(0, 1);
        lcd.print("d1: ");
        lcd.setCursor(3, 1);
        lcd.print(distance);
        delay(200);
      } else if (d == 1) {
        lcd.setCursor(9, 1);
        lcd.print("d2: ");
        lcd.setCursor(12, 1);
        lcd.print(distance);
        delay(200);
      } else if (d == 2) {
        lcd.setCursor(6, 0);
        lcd.print(area);
        delay(200);
      }
      if (digitalRead(selectButton) == 0) {
        if (d == 0) {
          lcd.setCursor(0, 1);
          lcd.print("d1: ");
          lcd.setCursor(3, 1);
          lcd.print(distance);
          d = 1;
          d1 = distance;
          delay(100);
        } else if (d == 1) {
          lcd.setCursor(9, 1);
          lcd.print("d2: ");
          lcd.setCursor(12, 1);
          lcd.print(distance);
          d = 2;
          d2 = distance;
          area = d1 * d2;
          delay(100);
        } else if (d == 2) {
          lcd.clear();
          d = 0;
          area = 0;
          delay(100);
        }
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 3;
          d = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;
    case 3:
      Wire.beginTransmission(MPU);
      Wire.write(0x3B);
      Wire.endTransmission(false);
      Wire.requestFrom(MPU, 6, true);
      AcX = Wire.read() << 8 | Wire.read();
      AcY = Wire.read() << 8 | Wire.read();
      AcZ = Wire.read() << 8 | Wire.read();
      if (axis == 0) {
        angle = atan(-1 * AcX / sqrt(pow(AcY, 2) + pow(AcZ, 2))) * 180 / PI;
        lcd.setCursor(0, 0);
        lcd.print("Pitch");
      } else if (axis == 1) {
        angle = atan(-1 * AcY / sqrt(pow(AcX, 2) + pow(AcZ, 2))) * 180 / PI;
        lcd.setCursor(0, 0);
        lcd.print("Roll ");
      }
      lcd.setCursor(0, 1);
      lcd.print("Hoek: ");
      lcd.print(abs(angle));
      lcd.print(" ");
      lcd.setCursor(10, 1);
      lcd.print("deg");
      delay(200);
      if (digitalRead(selectButton) == 0) {
        if (axis == 0) { axis = 1; delay(100); }
        else if (axis == 1) { axis = 0; delay(100); }
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;
  }
}

float getDistance() {
  digitalWrite(trigPin, LOW);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;
  if (unitSelect == 1) { distance = distance; unit = "cm"; }
  else if (unitSelect == 2) { distance = distance * 0.393701; unit = "in"; }
  else if (unitSelect == 3) { distance = distance * 0.01; unit = "m"; }
  else if (unitSelect == 0) { distance = distance * 0.0328; unit = "ft"; }
  return distance;
}

Dat was het voor deze tutorial, ik hoop dat je ervan hebt genoten en iets nieuws hebt geleerd. Voel je vrij om vragen te stellen in de reacties hieronder.

Productieproces

  1. Bouw een DCC-commando station voor modelspoor met Arduino – gratis app inclusief
  2. Arduino Digitale Dobbelsteen: Bouw Je Eigen LCD-willekeurige Getalgenerator
  3. Bouw Boeiende LCD Animaties & Games met Arduino UNO
  4. Arduino Audio Frequentie Detector – Meet de luidste geluidspieken met hoge gevoeligheid
  5. Bouw Je Eigen Arduino Tamagotchi: Een Digitale Huisdier DIY Project
  6. Arduino Boter-Kaas-Eieren met MAX7219 LED Matrix en Kartonnen Behuizing
  7. Bouw een DIY Voltmeter met Arduino en Nokia 5110 Display – Stap-voor-Stap Handleiding
  8. Bouw een Betrouwbare Arduino Afteltimer met SparkFun 7‑Segment Display
  9. Python 3 naar Arduino UNO: Eenvoudige Commando Besturing en LED Demo
  10. Bouw een compacte FM-radio met Arduino Nano en RDA5807M
  11. DIY Putwater Niveaumonitor met Arduino Nano, MPXV5010DP & OLED Display