Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

In diesem Tutorial lernen wir, wie man einen Arduino Entfernungsmesser und eine digitale Wasserwaage baut. Sie können das folgende Video ansehen oder die schriftliche Anleitung unten lesen.

Überblick

Das Gerät verfügt über einen Ultraschallsensor zur Messung der Entfernung zum nächsten Objekt, einen Beschleunigungssensor zur Messung des Winkels zum Boden, ein LCD-Display zur Anzeige der Ergebnisse und eine benutzerdefinierte PCB, auf der alle Komponenten verbunden sind.

Wir können das Gerät mit nur einem einzigen Taster bedienen. Sobald wir das Gerät einschalten, müssen wir die Maßeinheit auswählen.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Durch Drücken des Tasters können wir durch die Einheiten schalten, und wenn wir den Taster eine Weile gedrückt halten, gelangen wir in das erste Programm. Hier können wir die Entfernung messen und auch die letzten beiden Messungen speichern.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Für den Eintritt in das zweite Programm müssen wir den Taster wieder eine Weile gedrückt halten. In diesem Programm können wir eine quadratische Fläche messen, indem wir zwei senkrechte Entfernungsmessungen durchführen.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Das nächste Programm ist die digitale Wasserwaage, hier können wir den Winkel zum Boden messen.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Mit dem Taster können wir zwischen den beiden Achsen umschalten oder entweder den Pitch- oder Roll-Winkel messen.

Schaltplan des Arduino Entfernungsmessers

Hier ist der Schaltplan dieses Arduino-Projekts.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Beachten Sie, dass ich bereits detaillierte Tutorials zu jedem dieser Module habe, die Sie auf den folgenden Links überprüfen können: Ultraschallsensor Tutorial, LCD Tutorial, MEMS Beschleunigungssensor Tutorial.

Sie erhalten die für dieses Projekt benötigten Komponenten über die Links unten:

  • Ultraschallsensor HC-SR04
  • MPU6050 3-Achsen Gyroscope Beschleunigungssensor
  • 16×2 Character LCD
  • Arduino Nano

Custom Design PCB

Gemäß dem Schaltplan müssen wir die benutzerdefinierte PCB entwerfen, was ich mit der kostenlosen Online-Schaltungsdesign-Software EasyEDA getan habe.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Nach Abschluss des Designs können wir einfach die Gerber-Datei exportieren, die für die PCB-Fertigung verwendet wird. Sie können die EasyEDA-Projektdateien dieses Projekts hier überprüfen.

Dann können wir unsere PCB bei JLCPCB bestellen, was tatsächlich der Sponsor dieses Projekts ist.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Hier können wir einfach die Gerber-Datei per Drag & Drop hochladen. Nach dem Hochladen können wir unser PCB im Gerber-Viewer prüfen. Wenn alles in Ordnung ist, können wir fortfahren, die gewünschten Eigenschaften für unsere PCB auswählen und sie zu einem vernünftigen Preis bestellen. Beachten Sie, dass Sie bei Ihrer ersten Bestellung bei JLCPCB bis zu 10 PCBs für nur 2$ erhalten können.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Gerät zusammenbauen

Nach einigen Tagen sind die PCBs angekommen. Die Qualität ist hervorragend und alles entspricht genau dem Design.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Okay, jetzt können wir mit dem Zusammenbau der Elektronik für dieses Projekt beginnen. Ich begann damit, Pin-Header auf die PCB zu löten. So können wir die Komponenten bei Bedarf einfach anschließen und trennen.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Dann lötete ich die drei Widerstände ein. Zwei davon sind für den Spannungsteiler für den Kontrast des LCD. Der 1k-Widerstand sollte an R1 und der 220-Ohm-Widerstand an R2 platziert werden. Der dritte ist ein Pull-Up-Widerstand für den Taster.

Als Nächstes ging ich zum Bau des Gehäuses über. Ich entschied mich für transparentes Acryl, weil ich die Schönheit aller elektronischen Komponenten sichtbar machen wollte. Ich hatte noch 5mm dickes Acryl von einem alten Projekt und verwendete eine Kreissäge, um es zuzuschneiden.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Dann musste ich eine Öffnung für das LCD auf der Oberseite des Gehäuses machen, die eigentlich 4mm dick ist, weil sie besser zum LCD passt. Zuerst bohrte ich zwei Löcher und führte dann eine Metallsäge hindurch. Mit der Metallsäge schnitt ich die Öffnung grob aus und feilte dann feine gerade Linien, damit das LCD fest sitzt.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Dann bohrte ich mit einem Forstner-Bohrer die Öffnungen für den Netzschalter, den Steuerknopf und den Ultraschallsensor.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Sobald alle Teile bereit waren, montierte ich das Gehäuse mit 5-Minuten-Epoxidharz. Für den Deckel steckte ich zwei Bolzen ein und klebte sie, durch die die obere Platte eingeschoben und mit Muttern oben gesichert werden kann.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Das Gehäuse ist nun fertig, und so fuhr ich fort, Pin-Header an das LCD zu löten, damit ich es einfach an die PCB anschließen kann. Ich lötete auch Pin-Header oder Jumper-Kabel an den Netzschalter, den Taster und den Batterieanschluss.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Schließlich hatte ich alles bereit, um das Gerät zusammenzubauen. Ich begann damit, den Ultraschallsensor auf der PCB einzusetzen und durch die Löcher in der Seitenwand. Als Nächstes kamen das Arduino-Board, das Beschleunigungsmesser-Modul sowie der Batterieanschluss.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Auf der oberen Platte befestigte ich das LCD, den Netzschalter und den Taster und verband sie dann mit der PCB. Zuletzt steckte ich die 9V-Batterie in den Anschluss und sicherte die obere Platte mit den Muttern.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Und das war's – das Arduino Entfernungsmesser-Projekt ist fertig, aber was in diesem Video noch bleibt, ist die Erklärung der Programmierung. Sehen wir uns also den Arduino-Code an.

Arduino Entfernungsmesser und Digitale Wasserwaage Quellcode

Da der Code etwas länger ist, werde ich ihn für ein besseres Verständnis in Abschnitten mit Beschreibung für jeden Abschnitt posten. Am Ende dieses Artikels poste ich den vollständigen Quellcode.

Zuerst müssen wir die Wire.h-Bibliothek für die I2C-Kommunikation des Beschleunigungssensors sowie die LiquidCrystal.h-Bibliothek für die Steuerung des LCDs einbinden. Dann definieren wir das LCD, die I2C-Adresse des MPU6050-Beschleunigungsmesser-Moduls, die Pins des Ultraschallsensors sowie einige für das nachfolgende Programm benötigte Variablen.

#include<Wire.h> // I2C communication library
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
const int MPU = 0x68; // I2C address of the 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";

Im Setup initialisieren wir sowohl die I2C-Schnittstelle des Beschleunigungssensors als auch das Flüssigkristall-Display sowie die Pin-Modi für die Trigger- und Echo-Pins des Ultraschallsensors und den Taster-Pin.

void setup() {
  // Initialize interface to the MPU6050
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  lcd.begin(16, 2); // Initializes the interface to the LCD screen
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(selectButton, INPUT_PULLUP);
}

Im Haupt-Loop haben wir eine switch-Anweisung, mit der wir zwischen den verschiedenen Programmen unseres Geräts umschalten können. Im ersten Fall, Case 0, wählen wir die Maßeinheit. Mit der lcd.print()-Funktion geben wir den Text auf dem LCD aus und schalten mit if-Anweisungen durch die vier Maßeinheiten.

switch (program) {
  // Switch between different programs
  case 0: // Select unit of measurement
    lcd.setCursor(0, 0); // Sets the location at which subsequent text written to the LCD will be displayed
    lcd.print("Select Unit: ");
    lcd.setCursor(13, 0);
    lcd.print(unit);
    lcd.print(" ");
    delay(10);
    // If button is pressed - change unit
    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; }
      // If button is held longer then half a second - change program
      delay(500);
      if (digitalRead(selectButton) == 0) {
        program = 1;
        lcd.clear();
        delay(500);
      }
    }
    break;

Wir sollten hier beachten, dass die unitSelect-Variable in der getDistance()-Benutzerfunktion wirkt, wo sie tatsächlich angibt, in welche Einheit wir die grundlegende cm-Einheit umrechnen sollen, die wir vom Ultraschallsensor erhalten.

// Converting the units
if (unitSelect == 1) { distance = distance; unit = "cm"; } // cm to cm
else if (unitSelect == 2) { distance = distance * 0.393701; unit = "in"; } // cm to in
else if (unitSelect == 3) { distance = distance * 0.01; unit = "m"; } // cm to m
else if (unitSelect == 0) { distance = distance * 0.0328; unit = "ft"; } // cm to ft

Um die Maßeinheit auszuwählen und auch in das erste Programm des Geräts zu gelangen, müssen wir den Taster einfach länger als eine halbe Sekunde gedrückt halten.

// If button is held longer then half a second - change program
delay(500);
if (digitalRead(selectButton) == 0) {
  program = 1;
  lcd.clear();
  delay(500);
}
break;

In Case 1, dem Entfernungsmessprogramm, erhalten wir zuerst die Entfernung zum nächsten Objekt mit der benutzerdefinierten getDistance()-Funktion.

case 1: // Distance measuring program
  distance = getDistance(); // Distance to the nearest object
  lcd.setCursor(0, 0);
  lcd.print("Dist: ");
  lcd.print(distance); // Prints the distance value from the sensor
  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);
  // Save distance 1
  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);
    }
    // Save distance 2
    else if (d == 1) {
      lcd.setCursor(8, 1);
      lcd.print("d: ");
      lcd.setCursor(10, 1);
      lcd.print(distance);
      d = 0;
      delay(100);
    }
    // If button is held longer then half second change program
    delay(500);
    if (digitalRead(selectButton) == 0) {
      program = 2;
      d = 0;
      lcd.clear();
      delay(500);
    }
  }
  break;

Sehen wir uns an, wie diese Funktion funktioniert.

//===== getDistance - Custom Function
float getDistance() {
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  // Calculating the distance
  distance = duration * 0.034 / 2; // distance in cm
  // Converting the units
  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 sagen wir mit dem Trigger-Pin dem Sensor, eine Ultraschallwelle zu erzeugen.

Arduino Entfernungsmesser und Digitale Wasserwaage bauen – Einfache Schritt-für-Schritt-Anleitung

Dann messen wir mit dem Echo-Pin und der pulseIn()-Funktion die Dauer, die die Welle vom Sensor zum Objekt und zurück benötigt. Berücksichtigt man die Schallgeschwindigkeit und die Laufzeit, kann man die Entfernung leicht berechnen. So geben wir die gemessene Entfernung zusammen mit etwas Text auf dem LCD aus und verwenden „if“-Anweisungen: Wenn wir den Taster drücken, geben wir die letzten beiden Messungen aus oder speichern sie.

Als Nächstes kommt das Programm zur Flächenberechnung, in dem wir ähnliche Methoden verwenden. Wir müssen zwei senkrechte Messungen durchführen und sie einfach multiplizieren, um die Fläche des Quadrats zu erhalten, das sie bilden.

case 2: // Area measuring program
  distance = getDistance();
  lcd.setCursor(0, 0);
  lcd.print("Area: ");
  lcd.print(area); // Prints the calculated area from the two measurements
  lcd.setCursor(12, 0);
  lcd.print(unit); // Prints the selected unit and the square sign below
  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);
  }
  // Save distance 1
  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);
    }
    // Save distance 2
    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; // Calculate the area
      delay(100);
    }
    else if (d == 2) {
      lcd.clear();
      d = 0;
      area = 0;
      delay(100);
    }
    // If button is held longer then half second change program
    delay(500);
    if (digitalRead(selectButton) == 0) {
      program = 3;
      d = 0;
      lcd.clear();
      delay(500);
    }
  }
  break;

Der letzte Fall ist das Winkelmessprogramm. Hier müssen wir die Beschleunigungsmesser-Daten lesen, die eigentlich die Stärke des Erdgravitationsfeldes in drei verschiedenen Achsen X, Y und Z sind. Der Wert jeder Achse wird in 2 Registern gespeichert, daher müssen wir insgesamt 6 Register lesen und kombinieren, um den richtigen Wert zu erhalten.

case 3: // Angle measuring program
  // Read the accelerometer data
  Wire.beginTransmission(MPU);
  Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
  AcX = Wire.read() << 8 | Wire.read(); // X-axis value
  AcY = Wire.read() << 8 | Wire.read(); // Y-axis value
  AcZ = Wire.read() << 8 | Wire.read(); // Z-axis value
  if ( axis == 0) {
    // Calculating the Pitch angle (rotation around Y-axis)
    angle = atan(-1 * AcX / sqrt(pow(AcY, 2) + pow(AcZ, 2))) * 180 / PI;
    lcd.setCursor(0, 0);
    lcd.print("Pitch");
  }
  else if (axis == 1) {
    // Calculating the Roll angle (rotation around X-axis)
    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("Angle: ");
  lcd.print(abs(angle));
  lcd.print(" ");
  lcd.setCursor(10, 1);
  lcd.print("deg");
  delay(200);
  // Change axis
  if (digitalRead(selectButton) == 0) {
    if (axis == 0) { axis = 1; delay(100); }
    else if (axis == 1) { axis = 0; delay(100); }
    // If button is held longer then half second change program
    delay(500);
    if (digitalRead(selectButton) == 0) {
      program = 0;
      lcd.clear();
      delay(500);
    }
  }
  break;
}

Sobald wir die X-, Y- und Z-Werte des Beschleunigungssensors haben, können wir den Pitch-Winkel (Rotation um die Y-Achse) sowie den Roll-Winkel (Rotation um die X-Achse) mit den beiden Gleichungen berechnen. Weitere Details zu diesen Gleichungen finden Sie in der Anwendungshinweis von Freescale Semiconductor, Tilt Sensing Using a Three-Axis Accelerometer. Danach geben wir die Werte zusammen mit etwas Text auf dem LCD aus, und durch Drücken des Tasters ändern wir, was auf dem LCD angezeigt wird – ob Pitch- oder Roll-Winkel.

Hier ist der vollständige Quellcode für dieses Arduino Entfernungsmesser- und Wasserwaage-Projekt:

/* DIY Digital Range Measurer and Spirit Level by Dejan Nedelkovski, www.HowToMechatronics.com */
#include<Wire.h> // I2C communication library
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
const int MPU = 0x68; // I2C address of the 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";

void setup() {
  // Initialize interface to the MPU6050
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  lcd.begin(16, 2); // Initializes the interface to the LCD screen
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(selectButton, INPUT_PULLUP);
}

void loop() {
  switch (program) {
    // Switch between different programs
    case 0: // Select unit of measurement
      lcd.setCursor(0, 0);
      lcd.print("Select Unit: ");
      lcd.setCursor(13, 0);
      lcd.print(unit);
      lcd.print(" ");
      delay(10);
      // If button is pressed - change unit
      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; }
        // If button is held longer then half a second - change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 1;
          lcd.clear();
          delay(500);
        }
      }
      break;
    case 1: // Distance measuring program
      distance = getDistance(); // Distance to the nearest object
      lcd.setCursor(0, 0);
      lcd.print("Dist: ");
      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);
      // Save distance 1
      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);
        }
        // Save distance 2
        else if (d == 1) {
          lcd.setCursor(8, 1);
          lcd.print("d: ");
          lcd.setCursor(10, 1);
          lcd.print(distance);
          d = 0;
          delay(100);
        }
        // If button is held longer then half second change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 2;
          d = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;
    case 2: // Area measuring program
      distance = getDistance();
      lcd.setCursor(0, 0);
      lcd.print("Area: ");
      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);
      }
      // Save distance 1
      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);
        }
        // Save distance 2
        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; // Calculate the area
          delay(100);
        }
        else if (d == 2) {
          lcd.clear();
          d = 0;
          area = 0;
          delay(100);
        }
        // If button is held longer then half second change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 3;
          d = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;
    case 3: // Angle measuring program
      // Read the accelerometer data
      Wire.beginTransmission(MPU);
      Wire.write(0x3B); // Start with register 0x3B (ACCEL_XOUT_H)
      Wire.endTransmission(false);
      Wire.requestFrom(MPU, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
      AcX = Wire.read() << 8 | Wire.read(); // X-axis value
      AcY = Wire.read() << 8 | Wire.read(); // Y-axis value
      AcZ = Wire.read() << 8 | Wire.read(); // Z-axis value
      if ( axis == 0) {
        // Calculating the Pitch angle (rotation around Y-axis)
        angle = atan(-1 * AcX / sqrt(pow(AcY, 2) + pow(AcZ, 2))) * 180 / PI;
        lcd.setCursor(0, 0);
        lcd.print("Pitch");
      }
      else if (axis == 1) {
        // Calculating the Roll angle (rotation around X-axis)
        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("Angle: ");
      lcd.print(abs(angle));
      lcd.print(" ");
      lcd.setCursor(10, 1);
      lcd.print("deg");
      delay(200);
      // Change axis
      if (digitalRead(selectButton) == 0) {
        if (axis == 0) { axis = 1; delay(100); }
        else if (axis == 1) { axis = 0; delay(100); }
        // If button is held longer then half second change program
        delay(500);
        if (digitalRead(selectButton) == 0) {
          program = 0;
          lcd.clear();
          delay(500);
        }
      }
      break;
  }
}

//===== getDistance - Custom Function
float getDistance() {
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  // Calculating the distance
  distance = duration * 0.034 / 2; // distance in cm
  // Converting the units
  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;
}

Das war's für dieses Arduino-Projekt. Ich hoffe, es hat Ihnen gefallen und Sie haben etwas Neues gelernt. Stellen Sie gerne Fragen im Kommentarbereich unten.

Herstellungsprozess

  1. Modellbahn DCC-Zentrale selbst bauen mit Arduino – Kostenlose App inklusive
  2. Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
  3. LCD-Animationen & Spiele mit Arduino UNO erstellen
  4. Arduino Audio-Frequenz-Detektor – Lauteste Schallpeaks mit hochsensiblem Modul messen
  5. Selbstbau-Tamagotchi: Digitales Haustier mit Arduino
  6. Arduino Tic Tac Toe mit MAX7219 LED-Matrix und Karton-Gehäuse
  7. DIY-Voltmeter mit Arduino und Nokia 5110 Display – Schritt-für-Schritt-Anleitung
  8. Zuverlässigen Arduino-Countdown-Timer mit SparkFun 7-Segment-Display bauen
  9. Python 3 zu Arduino UNO: Einfache Steuerung & LED-Demo
  10. Kompaktes FM-Radio mit Arduino Nano und RDA5807M selbst bauen