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

Meerdere modus omgevingssensordeck met MKR1000

Componenten en benodigdheden

Arduino MKR1000
× 1
MOD-1016 Bliksemsensor
× 1
DFRobot MQ-9 gassensor
× 1
Adafruit-vochtigheids- en temperatuursensor
× 1
Adafruit-druk-/hoogte-/temperatuursensor
× 1
SparkFun ML8511 UV-sensor
× 1
chronodot RTC
× 1
SparkFun Photon Weather Shield
× 1
Adafruit neopixels
× 1
Broodplank (algemeen)
× 1
Jumperdraden (algemeen)
× 1

Over dit project

Ik hou ervan om naar het weer te kijken en ik wilde proberen het vast te leggen en in een grafiek te zetten. Thuisweerstations laten me de details zien voor 'nu' en soms voor het afgelopen uur of de afgelopen dag. Ik wilde meer doen en daarvoor een Arduino gebruiken. Iedereen begint met temperatuur en vochtigheid, soms barometrische druk, maar ik wilde meer! Windsnelheid en regenmeting wilden elk hardware-ingangen. Toen ik het gebruik van i2c eenmaal onder de knie had, vond ik dingen als de AS3935 Lightning Detector! En toen begon het verdriet... Ik had niet genoeg hardware-interrupts om het werk te doen met je standaard Arduino. Sparkfun heeft zelfs een weersensorbord voor de Photon, maar het is nog steeds beperkt. Ik zou moeten kiezen, en het zonder enkele sensoren doen. :-(

Toen zag ik de MKR1000 , en ik zag de BESTE FUNCTIE, het heeft 8 hardware-interrupts! Nu zou ik het allemaal kunnen hebben!

Uw sensoren kiezen

Sensoren zijn er in drie basissmaken;

  • Analoog :licht (inclusief IR en UV), windrichting, gassen, loadcellen...
  • I2C :temp, vochtigheid, barodruk, accelerometer, gyro...
  • Onderbrekingen :regenkippers, windsnelheid, bliksem, timers... (Functies zoals serieel, PWM, klokken, servo's gebruiken timingonderbrekingen)

De MKR1000 heeft genoeg I/O voor al deze!

LET OP WELKE VOLTAGE JE NODIG HEBT VOOR JE I/O op I2C en Interrupts! De MKR1000, de Photon en vele Arduino-varianten gebruiken bijvoorbeeld 3.3v I/O in plaats van 5v. Als uw CPU en de sensor(en) die u wilt gebruiken verschillende spanningen gebruiken, moet u ook niveauverschuivers tussen die apparaten gebruiken.

Alle sensoren die ik heb gebruikt, zijn algemeen genoeg, verkrijgbaar bij Adafruit, SparkFun, Element-14 en anderen, en kosten meestal tussen de $ 5-10 (VS). Gassensoren kosten meestal $ 10- $ 20. Voor de bliksemdetector (AS3935-chip) koos ik de Embedded Adventures MOD-1016, die $ 26 (VS) is om de antenne ook op het bord te krijgen. Ik heb ook het Sparkfun Photon Weather Shield gekocht, aangezien ik een Photon heb, en ik zal waarschijnlijk hun "weermeters" kopen (instrumenten voor windsnelheid en richting). Misschien zal ik een bodemvochtsensor toevoegen, zodra ik weet waar ik de MKR1000 ga monteren. Sommige sensoren houden niet van lange kabels.

Wijs uw sensoren toe aan pinnen

Als je eenmaal weet welke sensoren je wilt, weet je welk type ingangen je nodig hebt, de volgende stap is om te beslissen welke sensoren op welke pinnen gaan. Ik begin op papier, maar ik zal deze lijst ook als een blokopmerking in mijn code toevoegen, als herinnering.

Dit zijn de MKR1000-pintoewijzingen die ik heb gemaakt voor mijn sensordeck.

  • A0   (Ik bewaar A0 voor het geval ik de DAC later nodig heb...)
  • A1 ML8511 UV-sensor
  • A2 zichtbaar lichtsensor
  • A3 TMP36 lokale temperatuursensor
  • A4 MQ-9 gassensor
  • A5   vochtsensor
  • A6 windsnelheidssensor?
  • 0 (HW INT) drukknop
  • 1 (HW INT) AS Bliksemdetector
  • 2 (HW INT) windsnelheid anemometer (onderbreking per omwenteling)
  • 3 (HW INT) Regenkipper…
  • 4
  • 5
  • 6 (gedeeld met ingebouwde LED)
  • 7 NeoPixel-uitgang…

Aan de slag...

Voor de beginners onder jullie raad ik aan om te beginnen met elke sensor die je gaat gebruiken, één voor één, en te beginnen met het laden van de voorbeeldcode en het installeren van de benodigde bibliotheken. Vergeet niet om de sensorpin te wijzigen, zodat deze overeenkomt met de pintoewijzing van uw keuze, en sla een kopie van de democode op in uw projectmap.

Wanneer u de testcode kunt uitvoeren en de resultaten van de seriële monitor kunt lezen, bent u klaar om een ​​nieuwe toe te voegen. En wanneer u klaar bent met het testen van elke sensor, zijn ze nu allemaal bedraad en klaar om uw grotere schets te bouwen!

Mijn originele knutselen met de sensoren inbegrepen met behulp van een i2c-gebaseerde Reat-Time Clock (RTC), zodat ik kon inloggen op een SD-geheugenkaart. Hoewel de MKR1000 zijn eigen RTC en een batterij heeft, heb ik de klok niet kunnen krijgen om de tijd bij te houden met alleen de batterij, dus ik zal ook de ChronoDot v2.1 i2c RTC houden.

Als je naar het breadboard in mijn onderstaande afbeelding kijkt, kun je de verschillende jumpers zien die in gebruik zijn. De oranje zijn voor de 3,3 V-stroom naar elke sensor, dus ik kan ze alleen aansluiten als ik er klaar voor ben om ermee te werken. (Het is gemakkelijk om een ​​sensor uit te schakelen door de oranje jumper los te koppelen.)

Een opmerking over bibliotheken

Ik heb geconstateerd dat sommige van de bibliotheken die u kunt installeren, NIET perfect werken met de MKR1000 en/of met Arduino.cc IDE versie 1.6.7, en dat u wellicht wat aanpassingen moet doen, afhankelijk van hoe oud uw sensor is is. Een voorbeeld hiervan zijn de oudere ATOMIC_* macro's in de oudere AVR libc bibliotheek (ze zijn gedropt in Arduino IDE 1.6.5), en er is een geweldige thread over problemen en voorgestelde oplossingen in een forumthread op Arduino.cc. Het aanbrengen van enkele van de voorgestelde wijzigingen is iets voor een gemiddelde Arduino-hacker, maar zal waarschijnlijk intimiderend zijn voor nieuwere hackers. En voor iets oudere bibliotheken is de oorspronkelijke auteur mogelijk niet in de buurt om de bibliotheek bij te werken en de afhankelijkheid te elimineren.

Helaas weet u meestal niet welke bibliotheken moeten worden afgestemd voordat u uw sensoren koopt en test. Op dat moment raad ik je aan om de foutmeldingen te bekijken die in oranje verschijnen wanneer je je schets probeert te uploaden, om te zien of het probleem in je code zit, of in een bibliotheek, voordat je begint met het wijzigen van je code. Als het in de bibliotheek staat, zoek dan op internet naar "arduino" en de foutmelding. Als je geen oplossing kunt vinden, probeer dan de auteur een e-mail te sturen en hem op de hoogte te stellen van de fout, en misschien zullen ze de bibliotheek bijwerken.

Ik heb individuele chips gekocht om geld te besparen. Ik heb besloten dat, totdat ik klaar en in staat ben om mijn eigen printplaten te maken (waarschijnlijk met EagleCAD en OSHPark), het gemakkelijker is om sensormodules van Adafruit en SparkFun te kopen, omdat ze geweldig zijn in het onderhouden van hun bibliotheken.

Een beetje over wifi en versleuteling

Ik dacht ook aan de wifi om mijn weersensoren te laten rapporteren aan een website. We hebben zelfs een encryptie-engine op de MKR1000, om onze gegevens veilig te houden tijdens het transport via internet! Maar dat is meer dan ik in dit eerste project zal kunnen doen. Het staat op mijn lijst om te doen, omdat het belangrijk is om gegevensbeveiliging in je ontwerp op te nemen voor het internet der dingen, maar ik heb bijna geen tijd meer om mijn inzending voor de MKR1000-wedstrijd toe te voegen. Kijk uit voor mijn "versie 2" van dit project. Hier is een blokschema van de SAMD-module die het hart van je bord vormt.

Ik kan je één tip geven om aan de slag te gaan met wifi aan boord:Zorg ervoor dat je de meest recente versie van de WiFi101-bibliotheek gebruikt! Als je dat niet doet, zal je schets de wifi-module niet herkennen en zullen je wifi-schetsen dat alleen melden als er een foutcontrole is bij de oproepen naar de wifi-module.) Ik moet Charif MahmoudiCharif Mahmoudi om daarop te wijzen in zijn geweldige "Aan de slag met MKR1000"-tutorial hier op Hackster! Ten tijde van mijn hacking kon je de WiFi101 Githuib hier vinden.

Tips voor analoge sensoren

De meeste "analoge output" sensormodules produceren een eenvoudige analoge spanningsoutput, en dit is gemakkelijk te lezen met de analogRead van de sensorpin. Maar dan moet je wel weten wat dat betekent. Normaal gesproken moet u de kaart . gebruiken commando, of je moet misschien wat wiskunde uitvoeren. Weerstandselementen hebben meestal wat extra circuits nodig. Misschien wilt u een potentiometer toevoegen om de spanning te "fine-tunen".

In andere gevallen heb je vergelijkingen nodig om de uitgangsspanning om te zetten in iets dat mensen zullen begrijpen. De TMP36 temperatuursensor is daar een goed gedocumenteerd voorbeeld van. Dit onderdeel is ontworpen om uit te lezen in graden Celsius, dus je moet de spanning meten en wat rekenwerk doen om C te krijgen, en als je Fahrenheit wilt, moet je C naar F converteren. Het lezen van de gegevensbladen van componenten zal leg uit hoe het onderdeel werkt, maar je zult het gemakkelijker vinden om in de voetsporen van iemand anders te treden naarmate je meer ervaring opdoet.

Weer andere sensoren hebben een versterker nodig om de kleine spanningsschommelingen groot genoeg te maken zodat je ADC een goed bereik van hoog naar laag krijgt. Bij dit soort sensoren (loadcellen, vocht, versnellingsmeter) kan ik het beste wat geld uitgeven en een module kopen die al een versterker en een bibliotheek heeft om het bereik van de output te begrijpen.

Tips voor het gebruik van I2C-apparaten

I2C wordt soms een "tweedraads interface" genoemd, omdat je naast een datasignaal ook een kloksignaal nodig hebt. (Je hebt maar één datadraad nodig, omdat de "master" en de "slave(s)" er om de beurt data op zenden.) Natuurlijk hebben je I2C-sensoren ook een aarde- en een voedingskabel nodig, en dat aardedraad moet worden teruggebonden naar je CPU.

Elk I2C-apparaat heeft een hexadecimaal adres op de bus. Het is het beste om het gebruik van meerdere apparaten met hetzelfde adres te vermijden. (Als u multiples wilt hebben, moet u deze beheren met extra circuits om degene waarmee u wilt communiceren te "inschakelen" en deze vervolgens uit te schakelen wanneer u klaar bent, voordat u een andere inschakelt voor communicatie.)  De documentatie zou u moeten vertellen welk(e) adres(sen) een apparaat kan zijn. (OPMERKING :Als je twee apparaten op de I2C-bus hebt met hetzelfde adres, en beide hebben een "Enable" of "Shutdown"-pin, dan kun je de ene uitschakelen terwijl de andere wakker is. U kunt echter niet zomaar de stroom naar de vdd-pin uitschakelen, aangezien de sensoren wat stroom kunnen opnemen van de SDA- en SCL-pinnen, en dit zal resulteren in slechte metingen voor dat adres. De foutcontrole voor I2C is niet goed genoeg om voor dit geval te detecteren/corrigeren. )

De I2C-specificaties vertellen ons dat we een "sterke" pull-up-weerstand moeten hebben op zowel de klok als de datakabels, op de sensor die zich het verst op de draad bevindt. Daarom hebben sommige sensormodules al weerstanden aan boord, en het kan zijn dat u slechts een paar jumpers hoeft toe te voegen, dus lees zeker de documentatie voor de module(s).

Naast de "busafsluitweerstanden", heb ik lang geleden ook een hint van een hacker gevonden om een ​​weerstand in-line toe te voegen, zowel de data (SDA) als de klok (SCL) leads. Dit verbeterde de betrouwbaarheid van de gegevensmetingen van een aantal sensoren aanzienlijk. Met de MKR1000, met behulp van 3,3v-signalering, gebruik ik 220 ohm-weerstanden. Op een 5-v CPU, wil je misschien 330 ohm proberen. Zie onderstaand schema om het verschil in de plaatsingen te zien.

Wat gaat u met de gegevens doen?

Op dit moment stuur ik het gewoon naar de seriële monitor. Je zou een LCD kunnen toevoegen. Ik wilde een SD-kaart toevoegen, maar nu ik wifi heb ingebouwd, wil ik de gegevens uploaden naar een cloud... stel je voor dat je een paar van deze sensordecks in de buurt hebt, hun lengte- en breedtegraad kent en in staat bent om een ​​blikseminslag te trianguleren door de vermogensmetingen van elk station voor een bepaalde blikseminslag te vergelijken!

OPZIJ :2017-11-29; Het is me niet gelukt om de hardware-interrupts werkend te krijgen op de MKR1000. Ik maak aantekeningen en sensorexperimenten voor een klas van groep 9 (13-14 jaar), en misschien vind je de schetsen interessant. De klasse is opgebouwd rond het Adalogger M0-bord, en slaat de gegevens op een SD-kaart op, en er zijn nog genoeg pinnen voor een wifi-module. http://arduinoclass.pbworks.com

Terwijl ik aan de sensoren werkte, zag ik ook de SODERSVIK-lamparmatuur bij IKEA (zie de afbeelding hieronder). Stel je voor dat je de witte LED's in deze lamp vervangt door 20 Neopixels en een IR-ontvanger op afstand toevoegt. Een waaiende wind zou eruit kunnen zien als wolken die voorbij rollen, en de kleur kan de temperatuur aangeven. De afstandsbediening kan er ook voor kiezen om tijdelijk wat andere informatie weer te geven, zoals de temperatuurverandering in de afgelopen 12 uur.

Wat wil je monitoren en weergeven?

Code

  • De hele monitoringschets
  • Een gemiddelde analoge meting nemen
  • I2C-busscanner
  • ML8511-democode
De volledige monitoringschetsArduino
Er zijn veel sensoren die rapporteren in deze schets en de bibliotheken werken goed samen. De klassieke interrupt-locking-methoden in AVR-libc zijn echter verwijderd in de recente versies van de Arduino IDE, die de bibliotheken voor NeoPixel en voor de Lightning-sensor heeft uitgeschakeld. Ik verwacht dat dit ergens dit jaar zal worden opgelost, maar het betekent dat ik ze uit de definitieve schets heb weggelaten.
/* RTC-Weather-Sensors_v6_MKR1000 door Zonker Harris Lente 2016 * Hoera! Een klein bord, met meer dan 2 hardware-interrupts! * Plus WiFi, *en* cryptovaluta (ZEER noodzakelijk voor IoT-toepassingen!) * * Opmerking voor nieuwere hackers:ik heb VEEL opmerkingen in mijn code gezet, zoals je ziet. * Wanneer u op uploaden klikt, worden *opmerkingen GENEGEERD*, en vreten ze geen geheugen op! * Ik raad je aan om ook veel opmerkingen toe te voegen wanneer je wijzigingen * en toevoegingen aanbrengt, om je te helpen herinneren WAAROM je deed wat je maanden geleden deed. * Ze zullen ook degenen die na u komen helpen om het een en ander te leren. * * Nu tellen bibliotheken *DO* mee voor uw programmageheugen... */#include #include #include #include // Inclusief neopixels als een tijdelijke aanduiding, maar de onderbrekingsvector van de bibliotheek moet worden bijgewerkt.// Neem de Adafruit_NeoPixel-bibliotheek op https://github.com/adafruit/Adafruit_NeoPixel//#include  //const int numLeds =1; // Hoeveel neopixels in de string? gebruikt om de NeoPixel-bibliotheek in te stellen // Parameter 1 =aantal pixels in strip // Parameter 2 =pinnummer (de meeste zijn geldig) // Parameter 3 =vlaggen van het pixeltype, indien nodig bij elkaar optellen:// NEO_RGB Pixels zijn bedraad voor RGB bitstream // NEO_GRB Pixels zijn bedraad voor GRB bitstream // NEO_KHZ400 400 KHz bitstream (bijv. FLORA pixels) // NEO_KHZ800 800 KHz bitstream (bijv. High Density LED-strip)//Adafruit_NeoPixel strip =Adafruit_NeoPixel(numLeds, 6, NEO_KHZ800 800 KHz bitstream (bijv. High Density LED-strip) /* De BMP085_U driver gebruikt de Adafruit unified sensor library (Adafruit_Sensor), die een algemeen 'type' biedt voor sensordata en enkele hulpfuncties. (De BMP180 is compatibel met deze bibliotheek en geeft dezelfde output, maar de bibliotheek zal de BMP180 identificeren als een BMP085.) Om deze driver te gebruiken, moet u ook de Adafruit_Sensor-bibliotheek downloaden en deze in uw bibliothekenmap opnemen. U moet ook een unieke ID aan deze sensor toewijzen voor gebruik met de Adafruit Sensor API, zodat u deze specifieke sensor kunt identificeren in datalogboeken, enz. Om een ​​unieke ID toe te wijzen, geeft u eenvoudig een geschikte waarde op in de onderstaande constructor (12345 is standaard gebruikt in dit voorbeeld). */Adafruit_BMP085_Unified bmp =Adafruit_BMP085_Unified(10180);/* Deze schets is ook ontworpen om te werken met de HTU21D-F-sensor van Adafruit ----> https://www.adafruit.com/products/1899 */Adafruit_HTU21DF htu =Adafruit_HTU21DF ();/* Macetech Chronodot v2.1 Real-Time Clock (RTC) met batterijvoeding... http://docs.macetech.com/doku.php/chronodot (omdat de batterij op mijn MKR1000 houd de ingebouwde RTC in leven) De Adafruit Real-Time Clock (RTC) Bibliotheekinfo https://learn.adafruit.com/adafruit-data-logger-shield/using-the-real-time-clock Analoge apparaten TMP36 analoog gekalibreerde temperatuursensor. Dit vereist wat wiskunde https://learn.adafruit.com/tmp36-temperature-sensor http://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf ML8511 UV-sensor... Deze sensor detecteert het meest effectief 280-390nm licht. Dit wordt gecategoriseerd als onderdeel van het UVB-spectrum (brandende stralen) en het grootste deel van het UVA-spectrum (bruiningsstralen). MOD-1016 (AS3935 Lightning Sensor) i2c adres 0x03 - AS3935 Lightning Sensor Adafruit heeft een windmeter die een DC-spanning geeft (0,4-2.0v) https://www.adafruit.com/products/1733 http://www. instructables.com/id/Breezefinder-Citizen-Science-Windpower-Tool/step2/Build-the-housing/ Bodemvochtdetector (YL-69-sensor of vergelijkbaar) vereist analoge ingang... http://www.instructables.com /id/Arduino-LCD-Soil-Moisture-Sensor/step3/Connect-moisture-sensor/ Mijn MKR1000-aansluitingen (Alle sensoren moeten 3.3v-signalering hebben!) ===========*/int UVOUT =A1; // Uitvoer van de MV8511 UV-sensorint lightOut =A2; // Uitvoer van de TEMT6000 zichtbaar licht sensorint tmp36out =A3; // Uitvoer van de TMP36 lokale temperatuursensorint mq9out =A4; // Uitgang van DFrobot MQ-9 CO/Combustable Gs-sensor/* A5 Vochtsensor A6 Windsnelheidssensor? 0 (HW INT) drukknop 1 (HW INT) AS Bliksemdetector 2 (HW INT) windsnelheid anemometer? (onderbreking per omwenteling) 3 (HW INT) Regenkipper… 4 5 */int sounderPin =6; // Uitgang piëzosirene (gedeeld met ingebouwde LED)// (U kunt een jumper gebruiken om de sirene uit te schakelen, maar de ingebouwde LED knippert) int neopixelPin =7; // NeoPixel-uitgang, voor visualisatie met op schuifregister gebaseerde LED's/*11 i2c SDA 12 i2c SCL */ // Decalring-variabelen voor de Chronodot i2c RTC...int addrRTC =(0x68); // RTC i2c-adres in seconden; // gecombineerde BCD van de RTC (00h) in seconden1; //0-9int seconden10; //0-5 minuten; //gecombineerde BCD van de RTC (01h)int minuten1; //0-9 minuten 10; //0-6int uur; //gecombineerde BCD van de RTC (02h)in hours1; //0-9 in uur10; //0-2int dag; //1-7 (03u) int datum; //01-31 (04u)in de maand; //01-12 (05u)in jaar; //0-99; (06u)binnen 1sec; // (07h) ontvang Alarm 1 seconden in a1 minuten; // (08h) ontvang Alarm 1 minuut per 1 uur; // (09h) ontvang Alarm 1 hoursint a1daydate; // (0Ah) ontvang Alarm 1 dag en datum bitsint a2mins; // (0Bh) ontvang alarm 2 minuten binnen 2 uur; // (0Ch) ontvang Alarm 2 hoursint a2daydate; // (0Dh) ontvang Alarm 2 dag en datum bitsint rtcstatus; // (0Eh) krijg RTC-status bitsint verouderingsinfo; // (0Fh) krijg info over verouderingscompensatie// wat is 10h?int temprtc; // gecombineerde BCD van de RTC (11h)int tempfrtc; //gecombineerde BCD van de RTC (12u)/**************************************** ***********************************/// Arduino setup-functie (automatisch opgeroepen bij opstarten)/** ********************************************** *********************/void setup (void) { Serial.begin (9600); vertraging (1000); Serial.println ("i2c Sensor Deck");// Vergeet niet om uw in- en uitgangspinnen in te stellen! pinMode (UVOUT, INGANG); // de ML8511 UV-sensor pinMode (lightOut, INPUT); // de TEMT6000 zichtbaar-lichtsensor pinMode (tmp36out, INPUT); // de Analog Devices TMP36 temperatuursensor pinMode (sirenePin, OUTPUT); // HIGH zorgt ervoor dat de sirene ruis uitzendt pinMode (neopixelPin, OUTPUT); // Gebruik een weerstand van 220 ohm in lijn met de strip /* Initialiseer de BMP085/BMP180-sensor */ if(!bmp.begin()) { /* Er is een probleem opgetreden bij het detecteren van de BMP085/180 ... controleer uw verbindingen */ Serial.print("Oeps, geen BMP085/180 gedetecteerd ... Controleer uw bedrading of I2C-ADDR!"); terwijl(1); } /* Geef wat basisinformatie over deze sensor weer, BMP180 rapporteert als BMP085 */ displaySensorDetails();/* Initialiseer de HTU21D-sensor */ if (!htu.begin()) { Serial.println("Kon de HTU21 niet vinden -DF-sensor!"); terwijl (1); }// Initialiseer de Chronodot RTC-klok//(verander de waarden, verwijder commentaar, upload vervolgens om de tijd in te stellen en becommentarieer het opnieuw) /* seconden =0; minuten =41; uur =20; dag =7; datum =3; maand =1; jaar =16; initChrono();*/}void loop(void) { piep(50, 2); // kondig het begin van de lus op de sirene aan // Zet de neopixel op Teal... //int red =0; int groen =45; int blauw =30; //strip.setPixelColor(0, (rood, groen, blauw)); //strip.show();/********************************************* **************************//* Pull the Chronot info i2c adres 0x68 - DS1307 RTC *//* Board info:http ://docs.macetech.com/doku.php/chronodot *//* DS3231-gegevensblad:http://datasheets.maxim-ic.com/en/ds/DS3231.pdf *//******* ********************************************** ***********/ int temprtc; /* Een nieuwe tijdstempel ophalen */ Wire.beginTransmission (0x68); // 0x68 is DS3231 apparaatadres Wire.write ((byte)0); // begin bij register 0 Wire.endTransmission(); Wire.requestFrom (0x68, 13); // verzoek 19 bytes (is het # bytes DEC of HEX?) // (seconden, minuten, uren, dag, datum, maand, uur, // a1secs, a1mins, a1hrs // a1secs, a1mins, a1hrs // Veroudering offset, Temp integer, tijdelijke fractie) while(Wire.available()) {seconden =Wire.read(); // (00h) krijg seconden minuten =Wire.read(); // (01h) krijg minuten uur =Wire.read(); // (02h) krijg uren dag =Wire.read(); // (03h) ontvang dag van de week datum =Wire.read(); // (04h) ontvang de datum van de maand maand =Wire.read(); // (05h) haal de maand en de bitjaren van de eeuw =Wire.read(); // (06h) haal het jaartal int a1secs =Wire.read(); // (07h) krijg Alarm 1 seconden int a1mins =Wire.read(); // (08h) krijg Alarm 1 minuten int a1hrs =Wire.read(); // (09h) krijg Alarm 1 uur int a1daydate =Wire.read(); // (0Ah) ontvang Alarm 1 dag en datumbits int a2mins =Wire.read(); // (0Bh) krijg Alarm 2 minuten int a2hrs =Wire.read(); // (0Ch) krijg Alarm 2 uur int a2daydate =Wire.read (); // (0Dh) haal Alarm 2 dag- en datumbits int rtcstatus =Wire.read(); // (0Eh) ontvang RTC-statusbits int aginginfo =Wire.read(); // (0Fh) krijg info over verouderingscompensatie temprtc =Wire.read(); // (11h) verkrijg een geheel getal van de temp en teken tempfrtc =Wire.read(); // (12 uur) verkrijg het fractionele deel van de temperatuur // Lees onze bits en normaliseer de gegevens met voorloopnulvulling // OPMERKING:de Chronodot weet niets van zomertijd, zou je je code kunnen gebruiken? seconden10 =((seconden &0b11110000)>>4); seconden1 =((seconden &0b00001111)); // converteer BCD naar decimale minuten10 =((minuten &0b11110000)>>4); minuten1 =(minuten &0b00001111); // converteer BCD naar decimale uren10 =(((uren &0b00100000)>>5)*2 + ((uren &0b00010000)>>4)*1); uren1 =(uren &0b00001111); // converteer BCD naar decimaal (neem de 24-uursmodus aan) jaar =(jaren + 2000); temprtc =((temprtc &0b01111111) + (((tempfrtc &0b11000000)>>6)*0.25)); } krijg datum(); // Dit is een plaats waar u beslissingen over de zomertijd kunt toevoegen om de uren te wijzigen... Serial.print("ChronoDot - "); Seriële.afdruk(uren10); Seriële.afdruk(uren1); Serial.print(":"); Serial.print(minuten10); Seriële.afdruk(minuten1); Serial.print(":"); Serial.print (seconden10); Seriële.afdruk (seconden1); Serial.print(" 20"); Serial.print(jaren); Serieel.print(" "); Serieafdruk(maand); Serieel.print(" "); Serial.print(datum); Serieel.print(" \t"); Serial.print(temprtc); Serieel.println("C"); vertraging (100); // dus dit zal het afdrukken beëindigen, voor het geval de volgende sensor vastloopt /*********************************** ************************************//* 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"); vertraging (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()); Serieel.println("%"); vertraging (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"); vertraging (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); vertraging (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); vertraging (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()); maand =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(); Serieel.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"); vertraging (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); Serieel.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   

Schema's

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

Productieproces

  1. Sensorfusie biedt meerdere voordelen
  2. De integratie van sensorgegevens met Raspberry Pi-microprocessor
  3. Lijnvolgsensor met RPi
  4. Milieusensor-API met een RPi
  5. Aerocultuur met Raspberry Pi en vochtigheidssensor
  6. Raspberry Pi GPIO met PIR-bewegingssensor:beste tutorial
  7. De A111 gepulseerde radarsensor gebruiken met een Raspberry Pi
  8. Interfacing HC-SR501 PIR-bewegingssensor met Raspberry Pi
  9. Python/MicroPython Sensor Logger met Google Spreadsheets
  10. Windows 10 IoT Core op Raspberry Pi 2 – Adafruit-sensorgegevens
  11. Raspberry Pi-uitschakelcircuit met slaapstand