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

Umgebungssensor-Deck mit mehreren Modi und MKR1000

Komponenten und Verbrauchsmaterialien

Arduino MKR1000
× 1
MOD-1016 Blitzsensor
× 1
DFRobot MQ-9 Gassensor
× 1
Adafruit Feuchtigkeits- und Temperatursensor
× 1
Adafruit Druck-/Höhen-/Temperatursensor
× 1
SparkFun ML8511 UV-Sensor
× 1
chronodot RTC
× 1
SparkFun Photon Weather Shield
× 1
Adafruit-Neopixel
× 1
Breadboard (generisch)
× 1
Jumper (generisch)
× 1

Über dieses Projekt

Ich liebe es, das Wetter zu beobachten, und ich wollte versuchen, es einzufangen und grafisch darzustellen. Mit den Wetterstationen zu Hause kann ich die Details für "jetzt" und manchmal auch die Werte der letzten Stunde oder des letzten Tages sehen. Ich wollte mehr tun und einen Arduino für den Job verwenden. Jeder beginnt mit Temperatur und Luftfeuchtigkeit, manchmal Luftdruck, aber ich wollte mehr! Windgeschwindigkeits- und Regenmessung erforderten jeweils Hardware-Eingänge. Nachdem ich i2c gemeistert hatte, fand ich Dinge wie den AS3935 Lightning Detector! Und dann setzte die Traurigkeit ein ... Ich hatte nicht genug Hardware-Interrupts, um die Arbeit mit Ihrem grundlegenden Arduino zu erledigen. Sparkfun hat sogar ein Wettersensor-Board für das Photon, aber es ist noch begrenzt. Ich müsste mich entscheiden und auf einige der Sensoren verzichten. :-(

Dann sah ich den MKR1000 , und ich habe das BESTE FEATURE entdeckt, es hat 8 Hardware-Interrupts! Jetzt könnte ich alles haben!

Auswahl Ihrer Sensoren

Sensoren gibt es in drei Grundvarianten;

  • Analog :Licht (einschließlich IR und UV), Windrichtung, Gase, Wägezellen...
  • I2C :Temperatur, Feuchtigkeit, Barodruck, Beschleunigungsmesser, Kreisel...
  • Unterbricht :Regenkipper, Windgeschwindigkeit, Blitz, Timer ... (Funktionen wie Seriell, PWM, Uhren, Servos verwenden Timing-Interrupts)

Der MKR1000 hat für all dies jede Menge I/O!

BEACHTEN SIE, WELCHE SPANNUNG SIE FÜR IHRE E/A auf I2C und Interrupts BENÖTIGEN! Zum Beispiel verwenden der MKR1000, der Photon und viele Arten von Arduino 3,3 V I/O anstelle von 5 V. Wenn Ihre CPU und der/die gewünschte(n) Sensor(en) unterschiedliche Spannungen verwenden, müssen Sie auch Pegelumsetzer zwischen diesen Geräten verwenden.

Alle Sensoren, die ich verwendet habe, sind häufig genug, erhältlich von Adafruit, SparkFun, Element-14 und anderen und kosten normalerweise zwischen 5 und 10 US-Dollar (US). Gassensoren kosten normalerweise 10 bis 20 US-Dollar. Für den Blitzdetektor (AS3935-Chip) habe ich mich für den Embedded Adventures MOD-1016 entschieden, der 26 US-Dollar kostet, um auch die Antenne auf die Platine zu bekommen. Ich habe mir auch das Sparkfun Photon Weather Shield gekauft, da ich ein Photon habe, und werde mir wahrscheinlich deren "Wettermesser" (Windgeschwindigkeits- und Richtungsinstrumente) kaufen. Vielleicht werde ich einen Bodenfeuchtigkeitssensor hinzufügen, sobald ich herausgefunden habe, wo ich den MKR1000 montieren werde. Manche Sensoren mögen es nicht, lange Leitungen zu haben.

Weisen Sie Ihre Sensoren Pins zu

Sobald Sie wissen, welche Sensoren Sie benötigen, wissen Sie, welche Art von Eingängen Sie benötigen. Der nächste Schritt besteht darin, zu entscheiden, welche Sensoren an welchen Pins angeschlossen werden. Ich beginne auf dem Papier, aber ich werde diese Liste auch als Blockkommentar in meinem Code zur Erinnerung hinzufügen.

Hier sind die MKR1000-Pinbelegungen, die ich für mein Sensordeck vorgenommen habe.

  • A0   (Ich spare A0, falls ich den DAC später brauche...)
  • A1 ML8511 UV-Sensor
  • A2 Sensor für sichtbares Licht
  • A3 TMP36 lokaler Temperatursensor
  • A4 MQ-9 Gassensor
  • A5   Feuchtigkeitssensor
  • A6 Windgeschwindigkeitssensor?
  • 0 (HW INT) Taster
  • 1 (HW INT) AS Blitzmelder
  • 2 (HW INT) Windgeschwindigkeits-Anemometer (Unterbrechung pro Umdrehung)
  • 3 (HW INT) Regenkipper…
  • 4
  • 5
  • 6 (gemeinsam mit integrierter LED)
  • 7 NeoPixel-Ausgabe…

Erste Schritte...

Für die Anfänger unter Ihnen empfehle ich, mit jedem Sensor, den Sie verwenden möchten, nacheinander zu beginnen, den Beispielcode zu laden und die erforderlichen Bibliotheken zu installieren. Denken Sie daran, den Sensor-Pin entsprechend der gewünschten Pinbelegung zu ändern und eine Kopie des Demo-Codes in Ihrem Projektordner zu speichern.

Wenn Sie den Testcode ausführen und die Ergebnisse vom Serial Monitor lesen können, können Sie versuchen, einen weiteren hinzuzufügen. Und wenn Sie mit dem Testen jedes Sensors fertig sind, sind sie jetzt alle verkabelt und können mit dem Erstellen Ihrer größeren Skizze beginnen!

Meine ursprüngliche Bastelei mit den mitgelieferten Sensoren nutzte eine i2c-basierte Reat-Time Clock (RTC), damit ich mich auf eine SD-Speicherkarte einloggen konnte. Obwohl die MKR1000 eine eigene RTC und eine Batterie hat, konnte ich die Uhr nicht nur mit der Batterie dazu bringen, die Zeit zu halten, also werde ich auch die ChronoDot v2.1 i2c RTC behalten.

Wenn Sie sich das Steckbrett in meinem Bild unten ansehen, können Sie die verschiedenen verwendeten Jumper sehen. Die Orangen sind für die 3,3-V-Stromversorgung jedes Sensors, daher kann ich sie nur anschließen, wenn ich bereit bin, damit zu arbeiten. (Es ist einfach, einen Sensor zu deaktivieren, indem Sie den orangefarbenen Jumper abziehen.)

Ein Hinweis zu Bibliotheken

Ich habe festgestellt, dass einige der Bibliotheken, die Sie installieren können, NICHT perfekt mit dem MKR1000 und/oder mit Arduino.cc IDE Version 1.6.7 funktionieren, und Sie müssen möglicherweise etwas tunen, je nachdem, wie alt Ihr Sensor ist ist. Ein Beispiel dafür sind die älteren ATOMIC_* Makros in der älteren AVR libc Bibliothek (sie wurden in Arduino IDE 1.6.5 gelöscht), und es gibt einen großartigen Thread über Probleme und Lösungsvorschläge in einem Forenthread auf Arduino.cc. Einige der vorgeschlagenen Änderungen sind etwas für einen fortgeschrittenen Arduino-Hacker, werden aber für neuere Hacker wahrscheinlich einschüchternd sein. Und bei etwas älteren Bibliotheken ist der ursprüngliche Autor möglicherweise nicht in der Nähe, um die Bibliothek zu aktualisieren und die Abhängigkeit zu beseitigen.

Leider können Sie normalerweise nicht wissen, welche Bibliotheken abgestimmt werden müssen, bevor Sie Ihre Sensoren kaufen und testen. An diesem Punkt empfehle ich Ihnen, sich die orangefarbenen Fehlermeldungen anzusehen, wenn Sie versuchen, Ihre Skizze sorgfältig hochzuladen, um zu sehen, ob das Problem in Ihrem Code oder in einer Bibliothek liegt, bevor Sie mit der Änderung Ihres Codes beginnen. Wenn es sich in der Bibliothek befindet, führen Sie eine Websuche nach "arduino" und der Fehlermeldung durch. Wenn Sie keine Lösung finden können, versuchen Sie, dem Autor eine E-Mail zu senden und ihn über den Fehler zu informieren, und vielleicht wird er die Bibliothek aktualisieren.

Ich habe einzelne Chips gekauft, um Geld zu sparen. Ich habe beschlossen, dass es einfacher ist, Sensormodule von Adafruit und SparkFun zu kaufen, bis ich bereit und in der Lage bin, meine eigenen Leiterplatten herzustellen (wahrscheinlich mit EagleCAD und OSHPark), da sie ihre Bibliotheken hervorragend gepatcht halten.

Ein bisschen über WLAN und Verschlüsselung

Ich habe auch über das WLAN nachgedacht, damit meine Wettersensoren auf einer Website melden. Wir haben sogar eine Verschlüsselungs-Engine auf dem MKR1000, um unsere Daten bei der Übertragung über das Internet zu schützen! Aber das ist mehr, als ich in diesem ersten Projekt tun kann. Es steht auf meiner Liste, weil es für das Internet der Dinge wichtig ist, Datensicherheit in Ihr Design zu integrieren, aber ich habe keine Zeit mehr, meinen Beitrag für den MKR1000-Wettbewerb hinzuzufügen. Achten Sie auf meine "Version 2" dieses Projekts. Hier ist ein Blockdiagramm des SAMD-Moduls, das das Herz Ihres Boards ist.

Ich kann Ihnen einen Tipp geben, um mit dem WLAN an Bord zu beginnen:Vergewissern Sie sich, dass Sie die neueste Version der WiFi101-Bibliothek verwenden! Wenn Sie dies nicht tun, erkennt Ihre Skizze das WLAN-Modul nicht und Ihre WLAN-Skizzen melden dies nur, wenn bei den Anrufen an das WLAN-Modul Fehler überprüft werden.) Ich muss Charif Mahmoudi<. danken /em> für den Hinweis in seinem großartigen Tutorial "Getting Started with MKR1000" hier auf Hackster! Zum Zeitpunkt meines Hackens konntest du das WiFi101 Githuib hier finden.

Tipps für analoge Sensoren

Die meisten Sensormodule mit "Analogausgang" erzeugen einen einfachen analogen Spannungsausgang, der mit dem analogRead . einfach gelesen werden kann des Sensorstifts. Aber dann müssen Sie wissen, was das bedeutet. Normalerweise müssen Sie die Karte . verwenden Befehl, oder Sie müssen möglicherweise ein wenig rechnen. Widerstandselemente benötigen normalerweise eine zusätzliche Schaltung. Vielleicht möchten Sie ein Potentiometer hinzufügen, um die Spannung "fein abzustimmen".

In anderen Fällen benötigen Sie Gleichungen, um die Ausgangsspannung in etwas umzuwandeln, das der Mensch versteht. Der TMP36 Temperatursensor ist ein gut dokumentiertes Beispiel dafür. Dieser Teil wurde entwickelt, um in Grad Celsius auszulesen, also müssen Sie die Spannung messen und etwas rechnen, um C zu erhalten, und wenn Sie Fahrenheit wollen, müssen Sie C in F umrechnen. Das Lesen der Datenblätter der Komponenten wird Erkläre, wie der Teil funktioniert, aber du wirst es einfacher finden, in die Fußstapfen eines anderen zu treten, während du deine Erfahrung aufbaust.

Andere Sensoren benötigen jedoch einen Verstärker, um die winzigen Spannungsschwankungen groß genug zu machen, damit Ihr ADC einen guten Bereich von hoch nach niedrig erhält. Für diese Art von Sensoren (Wägezellen, Feuchtigkeit, Beschleunigungsmesser) finde ich es am besten, etwas Geld auszugeben und ein Modul zu kaufen, das bereits über einen Verstärker und eine Bibliothek verfügt, um den Ausgabebereich zu verstehen.

Tipps zur Verwendung von I2C-Geräten

I2C wird manchmal auch als "Zweidraht-Schnittstelle" bezeichnet, da Sie sowohl ein Taktsignal als auch ein Datensignal benötigen. (Sie benötigen nur eine Datenleitung, da der "Master" und der "Slave" abwechselnd Daten darauf senden.) Natürlich benötigen Ihre I2C-Sensoren auch eine Masse und ein Stromkabel, und das Massekabel muss an Ihre CPU zurückgebunden werden.

Jedes I2C-Gerät hat eine hexadezimale Adresse auf dem Bus. Vermeiden Sie es am besten, mehrere Geräte mit derselben Adresse zu verwenden. (Wenn Sie mehrere haben möchten, müssen Sie sie mit zusätzlichen Schaltkreisen verwalten, um diejenige zu "aktivieren", mit der Sie kommunizieren möchten, und sie dann deaktivieren, wenn Sie fertig sind, bevor Sie eine andere für die Kommunikation aktivieren.)  Die Dokumentation sollte Ihnen sagen, welche Adresse(n) ein Gerät haben kann. (HINWEIS :Wenn Sie zwei Geräte am I2C-Bus mit derselben Adresse haben und beide einen "Enable"- oder "Shutdown"-Pin haben, können Sie eines deaktivieren, während das andere wach ist. Sie können den vdd-Pin jedoch nicht einfach ausschalten, da die Sensoren etwas Strom von den SDA- und SCL-Pins aufnehmen können und zu schlechten Messwerten für diese Adresse führen. Die Fehlerprüfung für I2C ist nicht gut genug, um diesen Fall zu erkennen/korrigieren. )

Die I2C-Spezifikationen sagen uns, dass wir sowohl an den Takt- als auch an den Datenleitungen einen "starken" Pull-up-Widerstand haben sollten, und zwar am Sensor, der am weitesten vom Kabel entfernt ist. Aus diesem Grund haben einige Sensormodule bereits Widerstände an Bord, und Sie müssen möglicherweise nur ein paar Jumper hinzufügen. Lesen Sie also unbedingt die Dokumentation für das/die Modul(e).

Zusätzlich zu den "Busabschlusswiderständen" habe ich vor langer Zeit auch einen Hinweis von einem Hacker gefunden, einen Widerstand sowohl in die Daten- (SDA) als auch in die Clock- (SCL) Leitungen einzufügen. Dies verbesserte die Zuverlässigkeit der Datenablesungen von einigen Sensoren erheblich. Beim MKR1000 verwende ich mit 3,3-V-Signalisierung 220-Ohm-Widerstände. Bei einer 5-V-CPU möchten Sie vielleicht 330 Ohm ausprobieren. Sehen Sie sich das Schema unten an, um den Unterschied in den Platzierungen zu sehen.

Was machst du mit den Daten?

Im Moment schicke ich es nur an den Serial Monitor. Sie könnten ein LCD hinzufügen. Ich wollte eine SD-Karte hinzufügen, aber jetzt, da ich WLAN eingebaut habe, möchte ich die Daten in eine Cloud hochladen ... Stellen Sie sich vor, Sie hätten ein paar dieser Sensordecks in der Nähe, kennen ihren Breiten- und Längengrad und können in der Lage sein um einen Blitzeinschlag zu triangulieren, indem die Leistungsmesswerte von jeder Station für einen bestimmten Blitzschlag verglichen werden!

Nebenbei :2017-11-29; Ich konnte die Hardware-Interrupts des MKR1000 nicht zum Laufen bringen. Ich mache Notizen und Sensorexperimente für eine Klasse 9 (13-14 Jahre) und vielleicht finden Sie die Skizzen interessant. Die Klasse basiert auf dem Adalogger M0-Board und speichert die Daten auf einer SD-Karte, und es gibt noch viele Pins für ein WiFi-Modul. http://arduinoclass.pbworks.com

Während ich an den Sensoren arbeitete, entdeckte ich auch die SODERSVIK-Lampenhalterung bei IKEA (siehe Bild unten). Stellen Sie sich vor, Sie ersetzen die weißen LEDs in dieser Lampe durch 20 Neopixel und fügen einen IR-Fernbedienungsempfänger hinzu. Der Wind könnte wie vorbeiziehende Wolken aussehen, und die Farbe könnte die Temperatur anzeigen. Die Fernbedienung kann auch vorübergehend andere Informationen anzeigen, z. B. die Temperaturänderung während der letzten 12 Stunden.

Was möchten Sie überwachen und anzeigen?

Code

  • Die gesamte Überwachungsskizze
  • Durchschnittliche Analogwerte messen
  • I2C-Bus-Scanner
  • ML8511-Democode
Die gesamte ÜberwachungsskizzeArduino
In dieser Skizze werden viele Sensoren gemeldet, und die Bibliotheken arbeiten gut zusammen. Die klassischen Interrupt-Locking-Methoden in der AVR-libc wurden jedoch in den neueren Versionen der Arduino IDE entfernt, wodurch die Bibliotheken für NeoPixel und für den Lightning-Sensor deaktiviert wurden. Ich gehe davon aus, dass dies dieses Jahr irgendwann behoben wird, aber das bedeutet, dass ich sie aus der endgültigen Skizze weggelassen habe.
/* RTC-Weather-Sensors_v6_MKR1000 von Zonker Harris Frühjahr 2016 * Hurra! Ein kleines Board, mit mehr als 2 Hardware-Interrupts! * Plus WiFi, *und* Krypto (SEHR notwendig für IoT-Anwendungen!) * * Hinweis für neuere Hacker:Ich habe VIELE Kommentare in meinen Code eingefügt, wie Sie sehen. * Wenn Sie auf Hochladen klicken, werden *Kommentare IGNORIERT* und verbrauchen keinen Speicher! * Ich empfehle Ihnen, auch viele Kommentare hinzuzufügen, wenn Sie Änderungen * und Ergänzungen vornehmen, damit Sie sich daran erinnern, WARUM Sie das getan haben, was Sie vor Monaten getan haben. * Sie werden auch denen, die nach dir kommen, helfen, ein oder zwei Dinge zu lernen. * * Bibliotheken *DO* zählen jetzt zu Ihrem Programmspeicher... */#include #include #include #include // Inklusive Neopixel als Platzhalter, aber der Bibliotheksunterbrechungsvektor muss aktualisiert werden.// Integrieren Sie die Adafruit_NeoPixel-Bibliothek https://github.com/adafruit/Adafruit_NeoPixel//#include  //const int numLeds =1; // Wie viele Neopixel enthält der String? wird verwendet, um die NeoPixel-Bibliothek einzustellen // Parameter 1 =Anzahl der Pixel im Streifen // Parameter 2 =Pin-Nummer (die meisten sind gültig) // Parameter 3 =Pixeltyp-Flags, addieren Sie nach Bedarf:// NEO_RGB Pixel sind für RGB verdrahtet Bitstream // NEO_GRB Pixel sind für GRB Bitstream verdrahtet // NEO_KHZ400 400 KHz Bitstream (zB FLORA Pixel) // NEO_KHZ800 800 KHz Bitstream (zB High Density LED Strip) // Adafruit_NeoPixel strip =Adafruit_NeoPixel(numLeds, 6, NEO_GRB + NEOKHZ800); /* Der BMP085_U-Treiber verwendet die vereinheitlichte Sensorbibliothek von Adafruit (Adafruit_Sensor), die einen gemeinsamen 'Typ' für Sensordaten und einige Hilfsfunktionen bereitstellt. (Der BMP180 ist mit dieser Bibliothek kompatibel und liefert die gleiche Ausgabe, aber die Bibliothek identifiziert den BMP180 als BMP085.) Um diesen Treiber zu verwenden, müssen Sie auch die Adafruit_Sensor-Bibliothek herunterladen und in Ihren Bibliotheksordner einfügen. Sie sollten diesem Sensor auch eine eindeutige ID für die Verwendung mit der Adafruit Sensor API zuweisen, damit Sie diesen bestimmten Sensor in allen Datenprotokollen usw. identifizieren können. Um eine eindeutige ID zuzuweisen, geben Sie einfach einen entsprechenden Wert im folgenden Konstruktor ein (12345 is .) in diesem Beispiel standardmäßig verwendet). */Adafruit_BMP085_Unified bmp =Adafruit_BMP085_Unified(10180);/* Diese Skizze wurde auch für den HTU21D-F-Sensor von Adafruit entwickelt ----> https://www.adafruit.com/products/1899 */Adafruit_HTU21DF htu =Adafruit_HTU21DF () halten die integrierte RTC am Leben) Informationen zur Adafruit Real-Time Clock (RTC) Bibliothek https://learn.adafruit.com/adafruit-data-logger-shield/using-the-real-time-clock Analog Devices TMP36 analog kalibrierter Temperatursensor. Dies erfordert etwas Mathematik https://learn.adafruit.com/tmp36-temperature-sensor http://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf ML8511 UV-Sensor... Dieser Sensor erkennt 280-390 nm Licht am effektivsten. Dies wird als Teil des UVB-Spektrums (brennende Strahlen) und des größten Teils des UVA-Spektrums (Bräunungsstrahlen) kategorisiert. MOD-1016 (AS3935 Lightning Sensor) i2c Adresse 0x03 - AS3935 Lightning Sensor Adafruit verfügt über ein Anemometer, das eine Gleichspannung (0,4-2,0 V) liefert https://www.adafruit.com/products/1733 http://www. instructables.com/id/Breezefinder-Citizen-Science-Windpower-Tool/step2/Build-the-housing/ Soil Moisture Detector (YL-69-Sensor oder ähnlich) erfordert einen analogen Eingang ... http://www.instructables.com /id/Arduino-LCD-Soil-Moisture-Sensor/step3/Connect-moisture-sensor/ My MKR1000 Connections (Alle Sensoren müssen 3.3V Signalisierung haben!) ===========*/int UVOUT =A1; // Ausgabe vom MV8511 UV-Sensorint lightOut =A2; // Ausgabe vom TEMT6000-Sensor für sichtbares Lichtint tmp36out =A3; // Ausgabe vom lokalen Temperatursensor TMP36int mq9out =A4; // Ausgabe von DFrobot MQ-9 CO/Brennbarer Gs-Sensor/* A5 Feuchtigkeitssensor A6 Windgeschwindigkeitssensor? 0 (HW INT) Taster 1 (HW INT) AS Blitzmelder 2 (HW INT) Windgeschwindigkeits-Anemometer? (Unterbrechung pro Umdrehung) 3 (HW INT) Rain Tipper… 4 5 */int sounderPin =6; // Piezo-Sounder-Ausgang (gemeinsam mit der On-Board-LED) // (Sie können einen Jumper verwenden, um den Sounder zu deaktivieren, aber die On-Board-LED blinkt) int neopixelPin =7; // NeoPixel-Ausgang, zur Visualisierung mit schieberegisterbasierten LEDs/*11 i2c SDA 12 i2c SCL */ // Abziehvariablen für den Chronodot i2c RTC...int addrRTC =(0x68); // RTC i2c addressint Sekunden; // kombinierte BCD von der RTC (00h)int Sekunden1; //0-9int Sekunden10; //0-5int Minuten; // kombinierte BCD vom RTC (01h)int minutes1; //0-9int Minuten10; //0-6int Stunden; // kombinierte BCD von der RTC (02h)int hours1; //0-9 int Stunden10; //0-2int Tag; //1-7 (03h) int Datum; //01-31 (04h)int Monat; //01-12 (05h)int Jahre; //0-99; (06h)int a1secs; // (07h) Alarm 1 Sekundenint a1mins erhalten; // (08h) Alarm 1 Minuteint a1hrs erhalten; // (09h) bekomme Alarm 1 hoursint a1daydate; // (0Ah) Alarm 1 Tag und Datum abrufen bitsint a2mins; // (0Bh) erhalte Alarm 2 Minutenint a2hrs; // (0Ch) erhalte Alarm 2 hoursint a2daydate; // (0Dh) Alarm 2 Tag und Datum abrufen bitsint rtcstatus; // (0Eh) RTC-Status abrufen bitsint aginginfo; // (0Fh) Informationen zum Alterungs-Offset abrufen // was ist 10h?int temprtc; // kombiniertes BCD vom RTC (11h)int tempfrtc; // Kombiniertes BCD vom RTC (12h)/**************************************** ********************************** /// Arduino-Setup-Funktion (wird beim Start automatisch aufgerufen)/** ************************************************* **********************/void setup (void) { Serial.begin (9600); Verzögerung (1000); Serial.println ("i2c Sensor Deck"); // Denken Sie daran, Ihre Ein- und Ausgangspins einzurichten! pinMode (UVOUT, INPUT); // der ML8511 UV-Sensor PinMode (lightOut, INPUT); // der TEMT6000-Sensor für sichtbares Licht pinMode (tmp36out, INPUT); // der TMP36-Temperatursensor von Analog Devices PinMode (SounderPin, OUTPUT); // HIGH bewirkt, dass der Sounder Rauschen ausgibt pinMode (neopixelPin, OUTPUT); // Verwenden Sie einen 220-Ohm-Widerstand in Reihe zum Streifen /* Initialisieren Sie den BMP085/BMP180-Sensor */ if(!bmp.begin()) { /* Beim Erkennen des BMP085/180 ist ein Problem aufgetreten ... überprüfen Sie Ihre Anschlüsse */ Serial.print("Ooops, kein BMP085/180 erkannt ... Überprüfen Sie Ihre Verkabelung oder I2C-ADDR!"); während(1); } /* Einige grundlegende Informationen zu diesem Sensor anzeigen, BMP180 meldet als BMP085 */ displaySensorDetails();/* Initialisieren Sie den HTU21D-Sensor */ if (!htu.begin()) { Serial.println("HTU21 konnte nicht gefunden werden -DF-Sensor!"); während (1); } // Initialisieren Sie die Chronodot RTC-Uhr // (Ändern Sie die Werte, entkommentieren Sie, dann laden Sie die Uhrzeit hoch, dann kommentieren Sie sie erneut aus) /* Sekunden =0; Minuten =41; Stunden =20; Tag =7; Datum =3; Monat =1; Jahre =16; initChrono();*/}void loop (void) { beep (50, 2); // den Start der Schleife auf dem Echolot ankündigen // Neopixel auf Teal setzen... //int red =0; int grün =45; int blau =30; //strip.setPixelColor (0, (rot, grün, blau)); //Strip-Show();/***************************************** **************************** //* Ziehen Sie die Chronot-Info i2c-Adresse 0x68 - DS1307 RTC *//* Board-Info:http ://docs.macetech.com/doku.php/chronodot *//* DS3231 Datenblatt:http://datasheets.maxim-ic.com/en/ds/DS3231.pdf *//******* ************************************************* *************/ int temprtc; /* Holen Sie sich einen neuen Zeitstempel */ Wire.beginTransmission(0x68); // 0x68 ist die DS3231-Geräteadresse Wire.write ((byte)0); // bei Register 0 starten Wire.endTransmission(); Wire.requestFrom(0x68, 13); // 19 Byte anfordern (ist die Anzahl der Bytes DEC oder HEX?) // (Sekunden, Minuten, Stunden, Tag, Datum, Monat, Stunden, // a1secs, a1mins, a1hrs // a1secs, a1mins, a1hrs // Altern Offset, Temp Integer, Temp Bruch) while (Wire.available ()) { Sekunden =Wire.read (); // (00h) Sekunden Minuten abrufen =Wire.read(); // (01h) Minuten Stunden abrufen =Wire.read(); // (02h) Stunden Tag abrufen =Wire.read(); // (03h) Hole den Wochentag date =Wire.read(); // (04h) Datum des Monats abrufen Monat =Wire.read(); // (05h) erhalte den Monat und das Jahrhundertbit Jahre =Wire.read(); // (06h) bekomme das Jahr int a1secs =Wire.read(); // (07h) Alarm 1 Sekunden erhalten int a1mins =Wire.read (); // (08h) Alarm 1 Minute erhalten int a1hrs =Wire.read (); // (09h) Alarm 1 Stunde erhalten int a1daydate =Wire.read(); // (0Ah) Alarm 1 Tag und Datumsbits abrufen Int a2mins =Wire.read (); // (0Bh) Alarm 2 Minuten erhalten int a2hrs =Wire.read (); // (0Ch) Alarm 2 Stunden erhalten int a2daydate =Wire.read (); // (0Dh) Alarm 2 Tages- und Datumsbits abrufen Int rtcstatus =Wire.read (); // (0Eh) RTC-Statusbits abrufen Int aginginfo =Wire.read (); // (0Fh) Informationen zum Alterungs-Offset abrufen temprtc =Wire.read (); // (11h) Holen Sie sich den ganzzahligen Teil der Temp, und signieren Sie tempfrtc =Wire.read (); // (12h) Holen Sie sich den Bruchteil der Temperatur // Lesen Sie unsere Bits und normalisieren Sie die Daten mit dem Auffüllen mit führenden Nullen // HINWEIS:Der Chronodot kennt keine Sommerzeit, sollte Ihr Code sein? Sekunden10 =((Sekunden &0b11110000)>>4); Sekunden1 =((Sekunden &0b00001111)); // BCD in Dezimalminuten umwandeln10 =((Minuten &0b11110000)>>4); Minuten1 =(Minuten &0b00001111); // BCD in Dezimalstunden umwandeln10 =(((Stunden &0b00100000)>>5)*2 + ((Stunden &0b00010000)>>4)*1); Stunden1 =(Stunden &0b00001111); // BCD in Dezimalzahl umwandeln (24-Stunden-Modus annehmen) Jahre =(Jahre + 2000); temprtc =((temprtc &0b01111111) + (((temprtc &0b11000000)>>6)*0,25); } Verabredung bekommen(); // Dies ist ein Ort, an dem Sie Dayligh Savings Time-Entscheidungen hinzufügen können, um die Stunden zu ändern ... Serial.print ("ChronoDot - "); Serial.print (Stunden10); Serial.print (Stunden1); Serial.print (":"); Serial.print (Minuten10); Serial.print (Minuten1); Serial.print (":"); Serial.print (Sekunden10); Serial.print (Sekunden1); Serial.print("20"); Serial.print (Jahre); Serial.print ( " "); Serial.print (Monat); Serial.print ( " "); Serial.print (Datum); Serial.print("\t"); Serial.print (temprtc); Serial.println("C"); Verzögerung (100); // Damit wird der Druck beendet, falls der nächste Sensor blockiert wird /************************************ ************************************//* Get BMP180 data i2c address 0x77 - BMP180 Baro Pres and Temp *//* data:http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf *//******************* ************************************************** */ sensors_event_t event; bmp.getEvent(&event); /* First we get the current temperature from the BMP085/BMP180 */ float BMPtemperature; bmp.getTemperature(&BMPtemperature); float BMPtempF =(BMPtemperature * 1.8 + 32); Serial.print("Temp:"); Serial.print(BMPtemperature); Serial.print(" C ("); Serial.print(BMPtempF); Serial.print(" F) \t"); /* Display the results (barometric pressure is measure in hPa) */ if (event.pressure) { /* Display atmospheric pressue in hPa */ Serial.print("BMP180 - Pres:"); Serial.print(event.pressure); Serial.print(" hPa\t"); /* Calculating altitude with reasonable accuracy requires pressure * * sea level pressure for your position at the moment the data is * * converted, as well as the ambient temperature in degress * * celcius. If you don't have these values, a 'generic' value of * * 1013.25 hPa can be used (defined as SENSORS_PRESSURE_SEALEVELHPA * * in sensors.h), but this isn't ideal and will give variable * * results from one day to the next. * * * * You can usually find the current SLP value by looking at weather * * websites or from environmental information centers near any major * * airport. * * * * convert inches-mercury http://www.csgnetwork.com/pressinmbcvt.html * * * For example, for Paris, France you can check the current mean * * pressure and sea level at:http://bit.ly/16Au8ol */ /* Then convert the atmospheric pressure, and SLP to altitude */ /* Update this next line with the current SLP for better results */ float seaLevelPressure =SENSORS_PRESSURE_SEALEVELHPA; Serial.print("Alt:"); Serial.print(bmp.pressureToAltitude(seaLevelPressure, event.pressure)); Serial.println(" m"); Verzögerung (100); // so this will finish printing, in case the next sensor is stalled } else { Serial.println("Sensor error"); } /**********************************************************************/* Get HTU21-DF data i2c address 0x40 - Humidity and Temp Sensor */* Then convert the atmospheric pressure, and SLP to altitude */* Update this next line with the current SLP for better results */* https://learn.adafruit.com/adafruit-htu21d-f-temperature-humidity-sensor/overview/**********************************************************************/ float HTUtemperature =htu.readTemperature(); float HTUtempF =(HTUtemperature * 1.8 + 32); Serial.print("HTU21-DF - Temp:"); Serial.print(HTUtemperature); Serial.print(" C ("); Serial.print(HTUtempF); Serial.print(" F)\tHum:"); Serial.print(htu.readHumidity()); Serial.println("%"); Verzögerung (100); // so this will finish printing, in case the next sensor is stalled/**********************************************************************/* Analog Devices venerable TMP36 precision temperature sensor/* this requires a bit of math after reading the output.../* https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor/**********************************************************************/ //getting the voltage reading from the temperature sensor int reading =averageAnalogRead(tmp36out); // 0.0032258064516129 are the DAC unit for 3.3v float tmp36voltage =0.0032258064516129 * reading; // print out the voltage Serial.print("TMP36 - temp:"); float tmp36temperatureC =(tmp36voltage - 0.5) * 100; //converting from 10 mv per degree with 500 mV offset to degrees ((voltage - 500mV) times 100) Serial.print(tmp36temperatureC); Serial.print(" C \t"); // now convert to Fahrenheit float tmp36temperatureF =(tmp36temperatureC * 9.0 / 5.0) + 32.0; Serial.print(tmp36temperatureF); Serial.print(" F, out:"); Serial.print(tmp36voltage); Serial.println("v"); Verzögerung (100); // so this will finish printing, in case the next sensor is stalled/********************************************************************** * Vishay TEMT6000 Visible Light sensor - analog reading * https://www.sparkfun.com/products/8688/**********************************************************************/ int vLevel =averageAnalogRead(lightOut); // 0.0032258064516129 is (3.3v (the DAC ref voltage) \ 1023 * uvLevel) float newVOutVolts =0.0032258064516129 * vLevel; Serial.print("TEMT6000 out:"); Serial.println(vLevel); Verzögerung (100); // so this will finish printing, in case the next sensor is stalled /********************************************************************** * ML8511 UV Sensor - analog reading * https://learn.sparkfun.com/tutorials/ml8511-uv-sensor-hookup-guide */**********************************************************************/ int uvLevel =averageAnalogRead(UVOUT); // 0.0032258064516129 is (3.3v (the DAC ref voltage) \ 1023 * uvLevel) float newOutVolts =0.0032258064516129 * uvLevel; //Convert the voltage to a UV intensity level float uvIntensity =mapfloat(newOutVolts, 0.99, 2.8, 0.0, 15.0); Serial.print("ML8511 UV out:"); Serial.print(uvLevel); Serial.print(" / UV Intensity (mW/cm^2):"); Serial.println(uvIntensity); Verzögerung (100); // so this will finish printing, in case the next sensor is stalled/********************************************************************** * DFrobot MQ-9 CO/Combustable Gas sensor - analog reading * http://www.dfrobot.com/wiki/index.php/Analog_Gas_Sensor(MQ9)_(SKU:SEN0134) * https://www.pololu.com/category/83/gas-sensors There are many available * But, deciphering what the output levels mean is an exercise for the buyer. :-(/**********************************************************************/ int MQ9volts =analogRead(mq9out); // Read Gas value from the MQ-9 sensor Serial.print("MQ-9 Gas:"); Serial.println(MQ9volts,DEC); delay(100); // so this will finish printing, in case the next sensor is stalled Serial.println(""); delay(3500); // looking to time the loop at about 5 seconds... // End of the main loop...}/**************************************************************************//* The code below are supporting subroutines */**************************************************************************//* Chronodot-related subroutines * * initChrono, set_date, get_date, set_time, get_time, get_temp, * * setHour, SetMinutes, decToBcd, bcdToDec *//**************************************************************************/void initChrono(){ set_time(); set_date();}void set_date(){ Wire.beginTransmission(104); Wire.write(4); Wire.write(decToBcd(day)); Wire.write(decToBcd(date)); Wire.write(decToBcd(mont h)); Wire.write(decToBcd(years)); Wire.endTransmission();}void get_date(){ Wire.beginTransmission(104); Wire.write(3);//set register to 3 (day) Wire.endTransmission(); Wire.requestFrom(104, 4); //get 4 bytes(day,date,month,year); day =bcdToDec(Wire.read()); date =bcdToDec(Wire.read()); Monat =bcdToDec(Wire.read()); years =bcdToDec(Wire.read());}void set_time(){ Wire.beginTransmission(104); Wire.write((byte)0); Wire.write(decToBcd(seconds)); Wire.write(decToBcd(minutes)); Wire.write(decToBcd(hours)); Wire.endTransmission();}void get_time(){ Wire.beginTransmission(104); Wire.write((byte)0);//set register to 0 Wire.endTransmission(); Wire.requestFrom(104, 3);//get 3 bytes (seconds,minutes,hours); seconds =bcdToDec(Wire.read() &0x7f); minutes =bcdToDec(Wire.read()); hours =bcdToDec(Wire.read() &0x3f);}void get_temp(){ Wire.beginTransmission(104); Wire.write((byte)0); //set register to 0 Wire.endTransmission(); Wire.requestFrom(104, 3);//get 3 bytes (seconds,minutes,hours); seconds =bcdToDec(Wire.read() &0x7f); minutes =bcdToDec(Wire.read()); hours =bcdToDec(Wire.read() &0x3f);}void setHour(){ hours++; if (hours> 23) { hours =0; seconds =0; minutes =0; } set_time();}void setMinutes(){ minutes++; if (minutes> 59) { minutes =0; } seconds =0; set_time();}byte decToBcd(byte val){ return ( (val / 10 * 16) + (val % 10) );}byte bcdToDec(byte val){ return ( (val / 16 * 10) + (val % 16) );}/**************************************************************************//* Displays some basic information on this sensor from the unified sensor API sensor_t type (see Adafruit_Sensor for more information) *//**************************************************************************/void displaySensorDetails(void){ sensor_t sensor;// bmp.getSensor(&sensor); Serial.println("------------------------------------"); Serial.print ("Sensor:"); Serial.println(sensor.name); Serial.print ("Driver Ver:"); Serial.println(sensor.version); Serial.print ("Unique ID:"); Serial.println(sensor.sensor_id); Serial.print ("Max Value:"); Serial.print(sensor.max_value); Serial.println(" hPa"); Serial.print ("Min Value:"); Serial.print(sensor.min_value); Serial.println(" hPa"); Serial.print ("Resolution:"); Serial.print(sensor.resolution); Serial.println(" hPa"); Serial.println("------------------------------------"); Serial.println(""); delay(500);}/**************************************************************************//* Takes an average of readings on a given pin, Returns the average */* used for the TMP36 and ML8511 UV Sensor readings./**************************************************************************/int averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  
Taking an Average Analog ReadingArduino
This was a clever hack I found in the SparkFun library for the ML8511 UV Sensor, but I'm calling it out specifically, since you can use it for any analog read! If you ever meet Nathan Seidl, please buy him a beer (it's a Beerware license.)
//Takes an average of readings on a given pin//Returns the averageint averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  
I2C bus scannerArduino
If you don't know the base address for your i2c devices, use this to scan the range of valid addresses. It knows about the sensors that I've been working with. You can add sections for your other sensors.
// --------------------------------------// i2c_scanner//// Found at http://playground.arduino.cc/Main/I2cScanner?action=sourceblock&num=1// 26 OCT 2015//// Version 1// This program (or code that looks like it)// can be found in many places.// For example on the Arduino.cc forum.// The original author is not know.// Version 2, Juni 2012, Using Arduino 1.0.1// Adapted to be as simple as possible by Arduino.cc user Krodal// Version 3, Feb 26 2013// V3 by louarnold// Version 4, March 3, 2013, Using Arduino 1.0.3// by Arduino.cc user Krodal.// Changes by louarnold removed.// Scanning addresses changed from 0...127 to 1...119,// according to the i2c scanner by Nick Gammon// http://www.gammon.com.au/forum/?id=10896// Version 5, March 28, 2013// As version 4, but address scans now to 127.// A sensor seems to use address 120.//// This sketch tests the standard 7-bit addresses// Devices with higher bit address might not be seen properly.//// Zonk er Harris added device descriptions, comments. OCT 10 2015// #include void setup(){ Wire.begin(); Serial.begin (9600); Serial.println("\nI2C Scanner");}void loop(){ byte error, address; int nDevices; Serial.println("Scanning..."); nDevices =0; for(address =1; address <127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error =Wire.endTransmission(); if (error ==0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); // Serial.print(address); If needed, print the address in decimal // // Now, detail sensors that we know about or expect... if (address ==3) { // DEC 3 =0x03 HEX =AS3935 Lightning Sensor Serial.print(" - AS3935 Lightning Sensor"); } if (address ==64) { // DEC 64 =0x40 HEX =HTU21D Humidity and Temp Sensor Serial.print(" - HTU21D Humidity and Temp Sensor"); } if (address ==104) { // DEC 104 =0x68 HEX =DS1307 (Chrono-Dot?) RTC Serial.print(" - DS1307 RTC (Chrono-Dot?)"); } if (address ==119) { // DEC 119 =0x77 HEX =BMP180 Barometric Pressure and Tem Sensor Serial.print(" - BMP180 Barometric Pressure and Tem Sensor"); } Serial.println(" "); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); if (address ==3) { // DEC 3 =0x03 HEX =AS3935 Lightning Sensor Serial.print(" - AS3935 Lightning Sensor"); } if (address ==64) { // DEC 64 =0x40 HEX =HTU21D Humidity and Temp Sensor Serial.print(" - HTU21D Humidity and Temp Sensor"); } if (address ==104) { // DEC 104 =0x68 HEX =DS1307 (Chrono-Dot?) RTC Serial.print(" - DS1307 RTC (Chrono-Dot?)"); } if (address ==119) { // DEC 119 =0x77 HEX =BMP180 Barometric Pressure and Tem Sensor Serial.print(" - BMP180 Barometric Pressure and Tem Sensor"); } } } if (nDevices ==0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); Verzögerung (5000); // wait 5 seconds for next scan}/* The output looks like this... * * Scanning... * I2C device found at address 0x03 - AS3935 Lightning Sensor * I2C device found at address 0x40 - HTU21D Humidity and Temp Sensor * I2C device found at address 0x68 - DS1307 RTC (Chrono-Dot?) * I2C device found at address 0x77 - BMP180 Barometric Pressure and Tem Sensor * done * */
ML8511 Demo CodeArduino
Modified for use with a 3.3v-native CPU (for DAC reference units).
/* * From https://learn.sparkfun.com/tutorials/ml8511-uv-sensor-hookup-guide 19 MAR 2016 * (Adapted for MKR1000 by Zonker Harris, MAR 2016) ML8511 UV Sensor Read Example By:Nathan Seidle SparkFun Electronics Date:January 15th, 2014 License:This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license). The ML8511 UV Sensor outputs an analog signal in relation to the amount of UV light it detects. Connect the following ML8511 breakout board to Arduino:3.3V =3.3V OUT =A1 GND =GND EN =3.3V * The Sparkfun demo presumes 5v VCC, but the MKR1000 is 3.3v native. * Because of this, the second reference voltage value will always be "1023". * As a result of testing, I cut that part out... -Z- Test your sensor by shining daylight or a UV LED:https://www.sparkfun.com/products/8662 This sensor detects 280-390nm light most effectively. This is categorized as part of the UVB (burning rays) spectrum and most of the UVA (tanning rays) spectrum. There's lots of good UV radiation reading out there:http://www.ccohs.ca/oshanswers/phys_agents/ultravioletradiation.html https://www.iuva.org/uv-faqs *///Hardware pin definitionsint UVOUT =A1; //Output from the sensorvoid setup(){ Serial.begin(9600); pinMode(UVOUT, INPUT); Serial.println("ML8511 example");}void loop(){ int uvLevel =averageAnalogRead(UVOUT); float newOutVolts =0.0032258064516129 * uvLevel; // This is 3.3v \ 1023 * uvLevel float uvIntensity =mapfloat(newOutVolts, 0.99, 2.8, 0.0, 15.0); //Convert the voltage to a UV intensity level Serial.print("ML8511 out:"); Serial.print(uvLevel); Serial.print(" / UV Intensity (mW/cm^2):"); Serial.print(uvIntensity); Serial.println(); delay(100);}//Takes an average of readings on a given pin//Returns the averageint averageAnalogRead(int pinToRead){ byte numberOfReadings =8; unsigned int runningValue =0; for(int x =0; x  

Schaltpläne

I'm too new to Fritzing, and couldn't find many parts in the library, so I made this mock-up instead.

Herstellungsprozess

  1. Integration von Sensordaten mit Raspberry Pi-Mikroprozessor
  2. Linienverfolgungssensor mit RPi
  3. Umgebungssensor-API mit einem RPi
  4. Aeroponik mit Raspberry Pi und Feuchtigkeitssensor
  5. Raspberry Pi GPIO mit PIR-Bewegungssensor:Bestes Tutorial
  6. Verwenden des gepulsten Radarsensors A111 mit einem Raspberry Pi
  7. Anbindung des PIR-Bewegungssensors HC-SR501 an Raspberry Pi
  8. Python/MicroPython Sensor Logger mit Google Tabellen
  9. Windows 10 IoT Core auf Raspberry Pi 2 – Adafruit-Sensordaten
  10. Raspberry Pi Shutdown Circuit mit Ruhemodus