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

Wandertracker

Komponenten und Verbrauchsmaterialien

Arduino 101
× 1
AA-Batterien
× 1
4xAA Batteriehalter
× 1
Zubehör Shiled
× 1
Adafruit BMP180 Drucksensor
× 1
Adafruit Ultimate GPS Breakout
× 1
Adafruit - 3-Achsen-Magnet
× 1
Adafruit AM2320 Feuchtigkeitssensor
× 1
Adafruit-Knopfzelle CR2012
× 2
Widerstand 10k Ohm
× 1
Widerstand 3,9 k
× 1

Notwendige Werkzeuge und Maschinen

Heißklebepistole (generisch)
Lötkolben (generisch)

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Was ist ein Wander-Tracker?

Der Wander-Tracker ist ein Gerät, um die Veränderung der Umgebung eines Wanderers während des Wanderns zu erfassen.

Die Idee ist, die Änderung von Temperatur, Druck, Luftfeuchtigkeit, Höhe, Lage, Richtung usw. zu beobachten. Dies gibt einige interessante Einblicke in das Wandern.

In den Bergen, wo es kalte, trockene Luft mit geringer Dichte im Vergleich zu niedrigeren Regionen ist, fällt es vielen Menschen schwer zu atmen. Einige leiden unter Reizungen der trockenen Haut. Mit diesem Gerät lernen Wanderinteressierte ihre Grenzen kennen. Es macht auch Spaß, an hochgelegene Orte zu gehen. Die Höhenlage zu kennen macht Spaß!

Nicht nur die Berge, sondern auch die Erkundung von Sümpfen, Wüsten, Wäldern - da jeder sein einzigartiges Umweltprofil hat, ist die Möglichkeit, die Umwelt unterwegs zu überwachen, ein besserer Weg, die Natur zu verstehen.

Videodemonstration

Schritt 1:Hardware, wofür?

Bei diesem Projekt gibt es viele Sensationen

Das Zubehörschild wird mit einigen I2C-Geräten an Bord geliefert:

  • LM 75B Temperatursensor zur Erfassung der Umgebungstemperatur
  • ADXL345 3-Achsen-Beschleunigungsmesser zum Erfassen von Neigung und Schwerkraft
  • DS3231 Hochpräzises RTC für Erfassungszeit
  • HMC5883 3-Achsen-Magnetsensor zur Erfassung des Kompasskurses
  • AM2320-Feuchtigkeitssensor zum Erfassen von % RH der Luft
  • BMP180-Drucksensor zur Erfassung von atmosphärischem Druck und Höhe
  • MTK3339 GPS-Sensor zur Erfassung von Standort und Gehstrecke

Auf dem Arduino Uno:

  • 3,9k + 22k Spannungsteiler für Erfassen 4 AA Batteriespannung
  • 1306 OLED zum Anzeigen von Daten
  • Summer für Alarmton
  • RGB-LED wird für dieses Projekt nicht benötigt
  • XBee-Schnittstelle wird nicht verwendet, aber Arduino D2, D3, D9, D10 können für andere Projekte aus dieser Schnittstelle herausgeholt werden, D2 ist mit Reset verbunden, was das Zurücksetzen des Arduino aus dem Code ermöglicht!
  • 5-Wege-Joystick wird nicht verwendet
  • 101 Topf wird nicht verwendet

Schritt 2:Ändern und Anschließen der Hardware

Am Arduino Uno werden nur wenige Änderungen vorgenommen. Es ist auf einem 4 AA-Batteriehalter mit Schraubenabstandshaltern und Heißkleber montiert.

Auf den Batteriehaltern sind 4 AA und CR1220 (für RTC) installiert.

Zwischen dem Batteriehalter und dem Arduino Uno Board befindet sich ein Raum, in dem der Druck-, Feuchtigkeits-, Magnet- und GPS-Sensor platziert werden kann.

I2C-Sensoren werden auf einem Stück Pref-Board zusammengelötet und in diesem Raum platziert

Diese Sensoren werden von der Unterseite mit Arduino Uno verbunden:

Ein Spannungsteiler wird hinzugefügt, um die Batteriespannung von 4 AA-Batterien zu messen.

Die AA-Batteriepack-Spannungserfassungsleitung geht zu ADC A1:

Der Joystick des Shields ist dem ACD-Pin A1 bis Pin A5 zugeordnet. Deshalb wird der Joystick entlötet und entfernt.

Durch Verbinden einiger Pads auf dem Accessory Shield (Schaltplan siehe Referenz) mit Lötbrücke D2 (für Soft-Reset), werden D3, D9, D10 Pins von Arduino auf der Xbee-Schnittstelle verfügbar gemacht.

Die Komponenten stapeln sich wie folgt:

  • Obere Schicht:Zubehörschild auf Arduino
  • Mittelschicht:Andere Sensoren und GPS werden zwischen Uno und Batteriefach geschaltet
  • Untere Schicht:4 AA-Batteriehalter mit Batterien

Und die Verbindungen sehen so aus:

Schritt 3:Programmieren des Geräts

Arduino IDEBuild 1.8.5 dient zur Programmierung des Gerätes. Zuerst werden alle folgenden Bibliotheken mit dem Bibliotheksmanager eingebunden oder heruntergeladen.

Wenn Sie den Namen des Sensors in das Suchfeld des Bibliotheksmanagers eingeben, werden die entsprechenden Bibliotheken angezeigt.

Einige der Accessory Shield-Bibliotheken (siehe Referenz) werden über die Option zip.file hinzugefügt

Nach dem Hinzufügen der erforderlichen Bibliotheken werden Beispielcodes für jeden Sensor überprüft, um die APIs für die zugehörigen Sensoren herauszufinden.

Als nächstes sind alle Bibliotheksheader in einer leeren Arduino-Skizze enthalten.

Liste der Header-Dateien

math.h,inttypes.h,Wire.h,lm75.h,ADXL345.h,ChainableLED.h,U8glib.h,ds3231.h,Adafruit_Sensor.h,Adafruit_AM2320.h,Adafruit_BMP085_U.h, Adafruit_HMC5883_U.h,Adafruit_GPS.h 

Nach mehrfachem Bearbeiten, Kompilieren und Debuggen (einschließlich Wackelkontakt, wo ich entdeckt habe, dass der BMP180 aufgrund von Leckstrom für I2C-Pins möglicherweise ohne Vcc funktioniert) und Hochladen - endlich war der Code fertig.

Die Vorbehalte

  • Die Höhenberechnung basiert auf dem Luftdruckabfall und gilt nur bei normalen Wetterbedingungen.
  • Der Kompasscode ist in der Software nicht neigungskompensiert, das Gerät muss in einer ebenen Ebene gehalten werden. Es gibt einen festen Kompasskreis, in dem sich ein weiterer Kreis mit variablem Radius befindet. Wenn das Gerät geneigt wird, vergrößert sich der innere Kreis. Wenn es sich in einer nivellierten Position befindet (d. h. sowohl die x- als auch die y-Komponente des Akzeleromers ist fast 0), wird der innere Kreis auf einen Punkt reduziert. Dies ist, wenn der Kompasskurs genauer ist.
  • Der Deklinationswinkel des Kompasszeigers hängt von der Position und der Variation des Erdmagnetfelds ab. Welche kann durch Sonnensturm beeinflusst werden. Wenn der Deklinationswinkel nicht enthalten ist, weicht der Kompasskurs um einige Grad ab.

Finden Sie die Deklination für Ihre Region:http://www.magnetic-declination.com

  • Der Kompasskurs ist anfällig für magnetische Objekte in der Nähe, wie das Vorhandensein starker magnetischer Mineralien in Bergen.
  • Die minimale Betriebsspannung des Geräts beträgt etwa 4,5 Volt. Dies ist, wenn AA-Batterien ersetzt werden sollten.
  • Uhrzeit und Datum werden über den Code programmiert. Wenn Zeit zum Wechseln benötigt wird, muss die Knopfzellenbatterie aus- und wieder eingesteckt werden. Ein neuer Programm-Upload mit einer neuen Uhrzeit im Code ändert die Uhrzeit.
  • Während der Entwicklung war das GPS-Modul nicht verfügbar. Daher werden Demo-Koordinaten in Lat-Long platziert. Wenn jemand dieses Projekt replizieren möchte, ist es erforderlich, die GPS-Bibliothek und die zugehörigen Codes einzufügen.
  • Die XY-Ebene des Beschleunigungsmessers und des Magnetometers unterliegt der Platzierung auf der Leiterplatte. Der Code muss entsprechend angepasst werden.
  • Die Genauigkeit des Beschleunigungsmessers ist anfällig für Vibrationen. Es wird empfohlen, das Gerät im Stillstand zu verwenden.

Umfang der Verbesserung

Für einige weitere Funktionen können von der Firmware-Seite Verbesserungen vorgenommen werden:

  • Periodisches Protokollieren von Parametern im EEPROM
  • Summer-Alarmton bei Erreichen des Höhen-/Standortmeilensteins
  • Erinnerung an Wasser trinken
  • Erinnerung an eine Pause
  • Alarm bei niedrigem Batteriestand
  • Alarm bei niedriger Temperatur und Luftfeuchtigkeit
  • Kompass-Softwarekalibrierung zur Neigungskompensation (viel trigonometrisches Zeug)
  • Automatisches Abrufen der Deklination mithilfe von GPS- und IoT-Konnektivität über die Gateway-App

Was den Hardware-Teil der Verbesserung betrifft:

  • Benutzereingabeschalter zum Einstellen von Zeit, Deklination usw.
  • Benutzerdefinierte 3D-Hülle für das Gerät
  • Verwendung eines wiederaufladbaren LiPo-Akkus
  • Einzelplatinen-Kompakt-PCB-Design für mehr Mobilität

Fazit

Reisen &Wandern ist cool, wenn Sie die Veränderung der Umgebung überprüfen können, macht es die Dinge interessanter. Vor allem die Kontrolle der Höhen-, Luftfeuchtigkeits-, Druck- und Temperaturänderungen innerhalb von Stunden beim Wandern. Dieses Gerät lässt Sie wissen, in welcher Höhe Sie Höhenkrankheit verspüren, welche Luftfeuchtigkeit Ihre Haut austrocknet - solche Sachen. Obwohl es sowohl beim Schaltungslayout als auch beim Code Raum für Verbesserungen gibt, um mit den Vorbehalten umzugehen, ist es immer noch cool, ein solches Gerät zu haben, wenn man in die Wildnis geht!

Externe Ressourcen

https://www.waveshare.com/wiki/Accessory_Shield

Rapid-Prototyping-Kit

Code

  • Hiking_Tracker.ino
  • Bibliotheken
Hiking_Tracker.inoC/C++
main.c
/*/////////// HINWEIS //////////D2 ermöglicht Soft-Reset, aktivierbar von CodeD3,D9,D10 sind verfügbar bis 12,13,16 von xbee interfaceD4, D13 sind nicht zugänglich //////////////////////////*///// HEADER-DATEIEN FÜR BIBLIOTHEK /////# include #include #include #include #include #include #include "U8glib.h"#include "ds3231.h"#include "Adafruit_Sensor.h"#include "Adafruit_AM2320.h"#include #include #include ////////// /////////////RTC-Variablen//////////////////uint8_t time[8];struct ts t;int s;int m; int h;int dy;int mo;int yr;///////////////// Beschleunigungsmesser-Variablen/////////////float X=0.0;float Y=0.0;float Z=0.0;float Schwerkraft =0.0;///////////////// Beschleunigungsmesser-Variablen/////////////float Xm=0.0;Schwimmer Ym=0,0;Schwimmer Zm=0,0; /////////////////////// RGB-LED-Variablen ///////////////const int rgb_pwr =12; const int clk_pin =6; const int data_pin =5; float hue =0.0;boolean up =true;///////////////////// Potentiometer //////////////// //int pot=0; //////////////////// Batt/Supply Vin /////////////////float Vbatt =0.0;//// //////////////////Thermometer ///////////////////Schwimmertemp =0.0;////// /////////////// Feuchtigkeit ///////////////////////schweben feucht =0.0;////// //////////////Luftdruck///////////////////doppelt prsr =0.0;///////// ///////////Höhe ///////////////////float alt =0.0;///////////// ////// Breite, Länge ////////////////////float lat =0.0; float lon =0.0;/////////////////Kompasskurs /////////////////float Kurs =0.0;/// ////////////////// Andere Variablen ///////////////int mstime =0;int sensor_selector =1;///// /////// ENUM //I2C Gerätetyp Objekt ////////////////U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C OLED DisplayTempI2C_LM75 termo =TempI2C_LM75(0x48,TempI2C_LM75::nine_bits); // I2C Temp SensorADXL345 Beschleunigungsmesser; // I2C Acce SensorChainableLED LEDs (clk_pin, data_pin, rgb_pwr, 1); // I2C RGB LEDAdafruit_AM2320 am2320 =Adafruit_AM2320(); // I2C-FeuchtesensorAdafruit_BMP085_Unified bmp180 =Adafruit_BMP085_Unified(10085); // I2C-PressesensorAdafruit_HMC5883_Unified mag =Adafruit_HMC5883_Unified(12345); // I2C Compa Sensor // Entkommentieren Sie die folgenden 2 Zeilen, um GPS zu aktivieren // Serial Debugging wird nicht verfügbar sein // HardwareSerial mySerial =Serial; // Adafruit_GPS GPS (&mySerial); Void setup (void) {// 1,1 V interne analoge Ref // analogReference (INTERNAL); ///////////// Signale für OLED auf Zubehörschild /////////// //// Lötbrücke auf Schirm benötigt für D2,D3,D9,D10// PinMode(2,1); // Selbst-Reset D2 auf RST PinMode (3,1); // Ausgänge bei xbee int 12, pinMode (9,1); // Ausgänge bei xbee int 13 pinMode (10,1); // Ausgänge bei xbee int 16 // digitalWrite (2,HIGH); digitalWrite (3, HOCH); digitalWrite(9,LOW); digitalWrite (10, HOCH); pinMode(7,1); pinMode(8,1); digitalWrite (7, HOCH); digitalWrite(8,LOW); // 10k POT auf A0 // Vin Batt/Versorgung auf A1 (3,91k/21,76k)///////////////////////////// //////////////////////// Serielle Kommunikation zum Debuggen (optional)////////// Serial.begin(9600);// //////////// Accel Init Waiting ///////// if (!accelerometer.begin()) { delay (50); } //////////////// RTC-Interrupt aktivieren /////////DS3231_init(DS3231_INTCN); //////////////// Summer Init ////////////////pinMode(11,1);digitalWrite(11,LOW); }void loop (void) {// Bildschleife u8g.firstPage(); tun {zeichnen(); } while( u8g.nextPage() ); // Umschalten zwischen I2C-Sensoren sensor_selector++; if (sensor_selector>=3) {sensor_selector=0;}////// Temperature Fetch API ////// temp=termo.getTemp(); delay(5);// "C/////// Pressure Fetch API ////////if(sensor_selector ==0){ ///////////// Drucksensor Init ///////// if(!bmp180.begin()) delay(11); sensor_event_t event; bmp180.getEvent(&event); if (event.pressure) {prsr =event.pressure/10; / /hP zu kP Verzögerung (50); } }////////////// GPS Init ////////////GPS.begin(9600);//// /// Altitude Fetch API ////////if(sensor_selector ==0){sensor_event_t event; bmp180.getEvent(&event); alt =bmp180.pressureToAltitude(1013.25,event.pressure); delay(50); // bmp180.end();}// in Meter ////////////// Feuchtigkeitssensor Init ///////if(sensor_selector ==1){am2320.begin(); delay(50);////// Humidity Fetch API ///////// feucht=am2320.readHumidity(); delay(50);// am2320.end(); // in % von RH}// in kPa////// Acceleration Fetch API ////// Vector norm =accelerometer.readNormalize(); X =norm.XAxis; Y =norm.YAxis; Z =norm.ZAxis; Gravity =sqrt(X*X + Y*Y+ Z*Z)-(0.3);// Offset// in m/s^2///// Time Fetch API //////// DS3231_get(&t); s=t.sek. m=t.min. h=t. Stunde; dy=t.mday; mo=t.mon; Jahr=t.Jahr; ///// Pot Position Fetch /////// pot=analogRead(A0)*5/(10*3); delay(2);///// VBatt/Supply Fetch /////// // 1.1 ist 1.08 für diesen Chip Vbatt=(1.08*analogRead(A1)/1023)/3.91*((3.91+21.76) ); Verzögerung (2); ///////// Kompasskurs ////////if(sensor_selector ==2){ if(!mag.begin()) { while(1); } // Verzögerung (70); sensor_t sensor2; mag.getSensor(&sensor2); Verzögerung (70); // Deklinationswinkel hängt vom Geo-Standort ab // Verwenden Sie Lat Long von GPS, um sensor_event_t event2 zu berechnen; mag.getEvent(&event2); // Xm =event2.magnetisch.x; // Ym =event2.magnetisch.y; Verzögerung (70); Schwimmerdeklination =0,0; Kurs =atan2(event2.magnetic.y, event2.magnetic.x); Überschrift +=Deklination; // Vorzeichenkorrektur if (Überschrift <0) Überschrift +=2*PI; if(Überschrift> 2*PI) Überschrift -=2*PI; // Konvertieren Sie Radiant in Grad zur besseren Lesbarkeit. Überschrift =Überschrift * 180/M_PI; // mag.end();} ///// Summer Control ////////// if (pot>80) {digitalWrite(11,1);} else {digitalWrite(11,0); } ///// RGB adressierbare LED-Steuerung ///////////// if (pot>40) {leds.pwr_set (PWR_ENABLE); for (Byte i=0; i<1; i++) leds.setColorHSB(i, hue, 1.0, 0.5); if (up) Farbton + =0,025; sonst Farbton =0,025; if (Farbton>=1.0 &&up) up =false; else if (hue<=0.0 &&!up) up =true; } // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // | /////// // digitalWrite (2,LOW); //////////////////////////////// } ///////// Void Loop endet hier ////////////////////// Oled Picture Loop Draw Fn///////// //////////void draw (void) { u8g.setFont (u8g_font_7x13); u8g.drawHLe(37, 0, 62); u8g.setPrintPos(41, 12);if(h<10) u8g.print(0);u8g.print(h);u8g.drawStr( 54,12, ":"); u8g.setPrintPos(62, 12);if(m<10) u8g.print(0);u8g.print(m);u8g.drawStr( 75,12,":"); u8g.setPrintPos(83, 12);if(s<10) u8g.print(0);u8g.print(s); u8g.drawHLe(37, 14, 62); u8g.setFont(u8g_font_5x8); u8g.drawVLine(37, 0, 14); u8g.setPrintPos(0, 7);if(dy<10) u8g.print(0);u8g.print(dy);u8g.drawStr( 11,7, "/"); u8g.setPrintPos(17, 7);if(mo<10) u8g.print(0);u8g.print(mo);u8g.drawStr(0,16,"/"); u8g.setPrintPos(6, 16);u8g.print(yr); u8g.drawVLine(99, 0, 14); u8g.drawStr( 104,7,"BATT"); u8g.setPrintPos(102, 15); u8g.print(Vbatt);u8g.drawStr( 123,15,"V");// u8g.setFont(u8g_font_7x13);// u8g.setPrintPos(40, 25); u8g.print(round(temp));u8g.drawStr(55,25, "'C");// u8g.print(round(temp)); u8g.setFont(u8g_font_5x8); // u8g.drawStr( 5,40, "x"); u8g.setPrintPos(15, 40); u8g.print(round(X)); // u8g.drawStr(50,40,"y"); u8g.setPrintPos(60, 40); u8g.print(round(Y)); // u8g.drawStr(90,40,"z"); u8g.setPrintPos(100, 40); u8g.print(round(Z));// u8g.drawStr( 68,22,"BATT:"); u8g.setPrintPos(95, 22); u8g.print(Vbatt);u8g.drawStr( 123,22,"V"); u8g.drawVLine(37, 18, 36); u8g.drawStr( 39,24,"LUFTTEMP.:"); u8g.setPrintPos(85, 24); u8g.print(temp);u8g.drawStr( 118,24,"C"); u8g.drawStr( 39,34,"FEUCHTIGKEIT:"); u8g.setPrintPos(85, 34); u8g.print(feucht);u8g.drawStr( 118,34,"%"); u8g.drawStr( 39,44,"DRUCK:"); u8g.setPrintPos(85, 44); u8g.print(prsr);u8g.drawStr( 118,44,"hP"); u8g.drawStr( 39,54,"HÖHE:"); u8g.setPrintPos(85, 54); u8g.print(round(alt));u8g.drawStr( 118,54,"m"); u8g.drawHLine(0, 56, 128); u8g.drawStr( 19,64,"LAT:");u8g.setPrintPos(39, 64); u8g.print(23.57); // Demo, durch LAT ersetzen, wenn GPS hinzugefügt wurde u8g.drawStr( 69,64,"LONG:");u8g.setPrintPos(94, 64); u8g.print (90.36); // Demo, durch LON ersetzen, wenn GPS hinzugefügt wird // u8g.setPrintPos (40, 25); u8g.print(round(temp));u8g.drawStr(55,25, "'C"); int r =round(sqrt(X*X + Y*Y)); // float tid =atan(Y/X)*180/3.1415; // hier mathematische Probleme // int radius =round(tid); u8g.drawStr( 0,22,"Überschrift"); u8g.drawCircle(18, 34,r, U8G_DRAW_ALL); // innerer Nivellierkreis u8g.drawCircle (18, 34,10, U8G_DRAW_ALL); // äußerer fester Kreis // innerer Kreis wird ein Punkt, wenn keine Neigung in x und y-Achse // Dies ist, wenn der Kompasskurs genauer ist //u8g.drawLine(18, 34,(18+round(Y*2)),(34+round(X*2))); // 2x hochskaliert u8g.setPrintPos (0, 53); u8g.print (Überschrift); // 0 oder 360 ist N // 90 ist E // 180 ist S // 270 ist W // u8g.setFont(u8g_font_5x8); if ((Überschrift>315)|(Überschrift<=45)) {u8g.drawLine(18,34,8,34); }if ((Überschrift>45)&(Überschrift<=135)){u8g.drawLine(18,34,18,24);}if ((Überschrift>135)&(Überschrift<=225)){u8g.drawLine (18,34,28,34);}if ((Überschrift>225)&(Überschrift<315)){u8g.drawLine(18,34,18,44);}// u8g.drawLine(18, 34, (18+Runde(Y*2)),(34+Runde(X*2))); // 2x hochskaliert BASIEREND AUF ACCELAROMETER // Schleife endet hier }
BibliothekenC/C++
Entpacken Sie es und fügen Sie die einzelnen Bibliothekszips zum Arduino Library Manager hinzu
Keine Vorschau (nur Download).

Schaltpläne


Herstellungsprozess

  1. Was ist ein O2-Sensor?
  2. Bewegungssensor mit Raspberry Pi
  3. Raspberry Pi Bodenfeuchtigkeitssensor
  4. Verwandeln Sie Ihren Raspberry Pi in einen Hamster-Fitness-Tracker
  5. DS18B20-Sensor testen
  6. Raspberry Pi-Temperatursensor
  7. Toiletten-Tracker (Powered by Walabot)
  8. Emotionssensor / EEG
  9. Windows 10 IoT Core auf Raspberry Pi 2 – Adafruit-Sensordaten
  10. WiFi-RSSI-Sensor-Tracker für die ISS