Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Dek Sensor Lingkungan multi-mode dengan MKR1000

Komponen dan persediaan

Arduino MKR1000
× 1
MOD-1016 Sensor Petir
× 1
Sensor Gas DFRobot MQ-9
× 1
Sensor Kelembaban dan Suhu Adafruit
× 1
Sensor Tekanan/Ketinggian/Suhu Adafruit
× 1
Sensor UV SparkFun ML8511
× 1
chronodot RTC
× 1
Perisai Cuaca Foton SparkFun
× 1
Adafruit neopiksel
× 1
Breadboard (generik)
× 1
Kabel jumper (generik)
× 1

Tentang proyek ini

Saya suka mengamati cuaca, dan saya ingin mencoba menangkap dan membuat grafiknya. Stasiun cuaca rumah memungkinkan saya melihat detail untuk "sekarang", dan terkadang penghitungan selama satu jam, atau hari terakhir. Saya ingin berbuat lebih banyak, dan menggunakan Arduino untuk pekerjaan itu. Semua orang mulai dengan Suhu dan Kelembaban, terkadang Tekanan Barometrik, tetapi saya menginginkan lebih! Kecepatan angin dan pengukuran hujan masing-masing menginginkan input perangkat keras. Setelah saya menguasai menggunakan i2c, saya menemukan hal-hal seperti AS3935 Lightning Detector! Dan kemudian kesedihan muncul... Saya tidak memiliki cukup interupsi perangkat keras untuk melakukan pekerjaan dengan Arduino dasar Anda. Sparkfun bahkan memiliki papan sensor cuaca untuk Foton, tetapi masih terbatas. Saya harus memilih, dan melakukannya tanpa beberapa sensor. :-(

Kemudian saya melihat MKR1000 , dan saya melihat FITUR TERBAIK, ia memiliki 8 interupsi perangkat keras! Sekarang saya bisa memiliki semuanya!

Memilih Sensor Anda

Sensor datang dalam tiga rasa dasar;

  • Analog :cahaya (termasuk IR dan UV), arah angin, gas, sel beban...
  • I2C :suhu, kelembaban, tekanan baro, akselerometer, gyro...
  • Interupsi :tipper hujan, kecepatan angin, kilat, timer...(Fitur seperti serial, PWM, jam, servo menggunakan interupsi waktu)

MKR1000 memiliki banyak I/O untuk semua ini!

CATATAN TEGANGAN YANG ANDA BUTUHKAN UNTUK I/O ANDA di I2C dan Interupsi! Misalnya, MKR1000, Foton, dan banyak rasa Arduino menggunakan I/O 3.3v, bukan 5v. Jika CPU dan sensor yang Anda inginkan menggunakan voltase yang berbeda, Anda juga perlu menggunakan pemindah level di antara perangkat tersebut.

Semua sensor yang saya gunakan cukup umum, tersedia dari Adafruit, SparkFun, Element-14, dan lainnya, dan biasanya berharga antara $5-10(AS). Sensor gas biasanya berharga $10-$20. Untuk pendeteksi petir (chip AS3935), saya memilih Embedded Adventures MOD-1016, yaitu $26 (AS) untuk mendapatkan antena di papan juga. Saya juga membeli Sparkfun Photon Weather Shield, karena saya memiliki Photon, dan saya mungkin akan membeli "pengukur cuaca" mereka (instrumen kecepatan dan arah angin). Mungkin saya akan menambahkan sensor Kelembaban Tanah, setelah saya mengetahui di mana saya akan memasang MKR1000. Beberapa sensor tidak suka memiliki lead yang panjang.

Tetapkan Sensor Anda ke Pin

Setelah Anda mengetahui sensor mana yang Anda inginkan, Anda akan mengetahui jenis input yang Anda perlukan, langkah selanjutnya adalah memutuskan sensor mana yang akan digunakan pada pin mana. Saya memulai di atas kertas, tetapi saya juga akan menambahkan daftar ini sebagai komentar blokir dalam kode saya, sebagai pengingat.

Berikut adalah penetapan pin MKR1000 yang telah saya buat untuk dek sensor saya.

  • A0   (Saya menyimpan A0 jika saya membutuhkan DAC nanti...)
  • A1 Sensor UV ML8511
  • A2 sensor cahaya tampak
  • A3 Sensor suhu lokal TMP36
  • A4 Sensor gas MQ-9
  • A5   sensor kelembapan
  • A6 sensor kecepatan angin?
  • 0 (HW INT) tombol tekan
  • 1 (HW INT) SEBAGAI Pendeteksi Petir
  • 2 (HW INT) anemometer kecepatan angin (interupsi per rotasi)
  • 3 (HW INT) Tipper Hujan…
  • 4
  • 5
  • 6 (dibagikan dengan LED terpasang)
  • 7 Keluaran NeoPixel…

Memulai...

Untuk pemula di antara Anda, saya sarankan memulai dengan setiap sensor yang akan Anda gunakan, satu per satu, dan mulai dengan memuat kode contoh, dan menginstal perpustakaan yang diperlukan. Ingatlah untuk mengganti pin sensor, agar sesuai dengan penetapan pin pilihan Anda, dan simpan salinan kode demo di folder proyek Anda.

Ketika Anda dapat menjalankan kode pengujian, dan membaca hasil dari Serial Monitor, Anda siap untuk mencoba menambahkan yang lain. Dan setelah Anda selesai menguji setiap sensor, semuanya sudah terhubung dan siap untuk mulai membuat sketsa Anda yang lebih besar!

Saya asli mengutak-atik sensor termasuk menggunakan Reat-Time Clock (RTC) berbasis i2c, jadi saya bisa masuk ke kartu memori SD. Meskipun MKR1000 memiliki RTC sendiri, dan baterai, saya belum bisa mendapatkan jam untuk menjaga waktu hanya dengan baterai, jadi saya akan menyimpan ChronoDot v2.1 i2c RTC juga.

Melihat papan tempat memotong roti pada gambar saya di bawah ini, Anda dapat melihat berbagai jumper yang digunakan. Oranye adalah untuk daya 3.3v ke setiap sensor, jadi saya hanya bisa mencolokkannya saat saya siap bekerja dengannya. (Sangat mudah untuk menonaktifkan sensor dengan mencabut jumper oranye.)

Catatan tentang Perpustakaan

Saya telah menemukan bahwa beberapa perpustakaan yang dapat Anda instal, TIDAK bekerja sempurna dengan MKR1000, dan/atau dengan Arduino.cc IDE versi 1.6.7, dan Anda mungkin perlu melakukan penyetelan, tergantung pada berapa lama sensor Anda adalah. Salah satu contohnya adalah makro ATOMIC_* yang lebih lama di AVR libc yang lebih lama perpustakaan (mereka dijatuhkan di Arduino IDE 1.6.5), dan ada utas hebat tentang masalah dan solusi yang disarankan di utas forum di Arduino.cc. Membuat beberapa perubahan yang disarankan adalah sesuatu untuk peretas Arduino tingkat menengah, tetapi mungkin akan menakutkan bagi peretas yang lebih baru. Dan, untuk perpustakaan yang sedikit lebih tua, penulis asli mungkin tidak ada untuk memperbarui perpustakaan dan menghilangkan ketergantungan.

Sayangnya, Anda biasanya tidak dapat mengetahui perpustakaan mana yang perlu disetel sebelum Anda membeli sensor dan mengujinya. Pada saat itu, saya sarankan Anda melihat pesan kesalahan yang muncul dalam warna oranye ketika Anda mencoba mengunggah sketsa Anda dengan hati-hati, untuk melihat apakah masalahnya ada di kode Anda, atau di perpustakaan, sebelum Anda mulai mengubah kode Anda. Jika ada di perpustakaan, lakukan pencarian web untuk "arduino" dan pesan kesalahannya. Jika Anda tidak dapat menemukan solusi, coba kirimkan email kepada penulis, dan beri tahu mereka tentang kesalahan tersebut, dan mungkin mereka akan memperbarui perpustakaan.

Saya telah membeli chip individu, mencoba menghemat uang. Saya telah memutuskan bahwa, sampai saya siap dan mampu membuat papan sirkuit saya sendiri (mungkin menggunakan EagleCAD dan OSHPark), lebih mudah untuk membeli modul sensor dari Adafruit dan SparkFun, karena mereka hebat dalam menjaga perpustakaan mereka ditambal.

Sedikit tentang WiFi dan Enkripsi

Saya juga memikirkan wifi untuk membuat laporan sensor cuaca saya ke situs web. Kami bahkan memiliki mesin enkripsi pada MKR1000, untuk membantu menjaga keamanan data kami saat transit melalui Internet! Tapi, itu lebih dari yang bisa saya lakukan di proyek pertama ini. Itu ada dalam daftar yang harus saya lakukan, karena menjadikan keamanan data sebagai bagian dari desain Anda penting untuk Internet of Things, tetapi saya kehabisan waktu untuk menambahkan entri saya untuk kontes MKR1000. Perhatikan "versi 2" saya dari proyek ini. Berikut adalah diagram blok modul SAMD yang merupakan inti dari board Anda.

Saya dapat menawarkan Anda satu tip untuk memulai dengan WiFi on-board:Pastikan Anda menggunakan versi terbaru dari library WiFi101! Jika tidak, sketsa Anda tidak akan mengenali modul wifi, dan sketsa wifi Anda hanya akan melaporkan bahwa jika ada kesalahan saat memeriksa panggilan ke modul wifi.) Saya perlu berterima kasih kepada Charif Mahmoudi untuk menunjukkan hal itu dalam tutorial hebatnya "Memulai dengan MKR1000" di sini di Hackster! Pada saat saya meretas, Anda dapat menemukan WiFi101 Githuib di sini.

Kiat untuk Sensor Analog

Sebagian besar modul sensor "output analog" akan menghasilkan output tegangan analog sederhana, dan ini mudah dibaca menggunakan analogRead dari pin sensornya. Tapi, kemudian Anda perlu tahu apa artinya itu. Biasanya, Anda perlu menggunakan peta perintah, atau Anda mungkin perlu melakukan sedikit matematika. Elemen resistif biasanya membutuhkan beberapa sirkuit tambahan. Anda mungkin ingin menambahkan potensiometer untuk "menyesuaikan" tegangan.

Dalam kasus lain, Anda memerlukan persamaan untuk mengubah tegangan keluaran menjadi sesuatu yang akan dipahami manusia. TMP36 sensor suhu adalah salah satu contoh yang terdokumentasi dengan baik. Bagian ini dirancang untuk dibaca dalam derajat Celcius, jadi Anda perlu mengukur tegangan, dan melakukan beberapa matematika untuk mendapatkan C, dan jika Anda ingin Fahrenheit, Anda harus mengubah C ke F. Membaca lembar data komponen akan jelaskan cara kerja bagian tersebut, tetapi Anda akan lebih mudah mengikuti jejak orang lain saat Anda membangun pengalaman.

Namun sensor lain membutuhkan amplifier, untuk membuat tegangan kecil berayun cukup besar untuk ADC Anda untuk mendapatkan rentang yang baik dari tinggi ke rendah. Jenis sensor ini (load cell, moisture, accelerometer) adalah tempat yang menurut saya paling baik untuk menghabiskan sejumlah uang, dan membeli modul yang sudah memiliki amp, dan library untuk membantu memahami jangkauan output.

Kiat untuk Menggunakan Perangkat I2C

I2C kadang-kadang disebut "antarmuka dua kabel", karena Anda memerlukan sinyal clock, serta sinyal data. (Anda hanya memerlukan satu kabel data, karena "master" dan "slave(s)" akan bergiliran mengirimkan data ke dalamnya.) Tentu saja, sensor I2C Anda juga memerlukan ground dan kabel daya, dan itu kabel ground harus diikat kembali ke CPU Anda.

Setiap perangkat I2C akan memiliki alamat heksadesimal di bus. Sebaiknya hindari menggunakan beberapa perangkat dengan alamat yang sama. (Jika Anda ingin memiliki kelipatan, Anda perlu mengelolanya dengan sirkuit ekstra, untuk "mengaktifkan" yang ingin Anda ajak berkomunikasi, lalu menonaktifkannya setelah selesai, sebelum Anda mengaktifkan yang lain untuk komunikasi.)  Dokumentasi harus memberi tahu Anda alamat mana yang bisa digunakan perangkat. (CATATAN :Jika Anda memiliki dua perangkat di bus I2C dengan alamat yang sama, dan keduanya memiliki pin "Aktifkan" atau "Matikan", Anda akan dapat menonaktifkan satu saat yang lain terjaga. Namun, Anda tidak bisa begitu saja mematikan daya ke pin vdd, karena sensor dapat mengambil sebagian daya dari pin SDA dan SCL, dan akan menghasilkan pembacaan yang buruk untuk alamat tersebut. Pemeriksaan kesalahan untuk I2C tidak cukup baik untuk mendeteksi/memperbaiki kasus ini. )

Spesifikasi I2C memberi tahu kita bahwa kita harus memiliki resistor pull-up "kuat" pada jam dan kabel data, pada sensor yang terjauh di kabel. Oleh karena itu, beberapa modul sensor sudah memiliki resistor terpasang, dan Anda mungkin hanya perlu menambahkan beberapa jumper, jadi pastikan untuk membaca dokumentasi untuk modul tersebut.

Selain "resistor pemutus bus", saya juga telah menemukan petunjuk dari seorang peretas dahulu kala, untuk menambahkan resistor in-line baik lead data (SDA) dan clock (SCL). Ini sangat meningkatkan keandalan pembacaan data dari beberapa sensor. Dengan MKR1000, menggunakan sinyal 3.3v, saya menggunakan resistor 220 ohm. Pada CPU 5-v, Anda mungkin ingin mencoba 330 ohm. Lihat skema di bawah untuk melihat perbedaan penempatan.

Apa yang akan Anda lakukan dengan data tersebut?

Saat ini, saya hanya mengirimkannya ke Serial Monitor. Anda bisa menambahkan LCD. Saya akan menambahkan kartu SD, tetapi sekarang saya memiliki wifi built-in, saya ingin mengunggah data ke cloud... bayangkan memiliki beberapa dek sensor ini, mengetahui garis lintang dan garis bujurnya, dan mampu untuk melakukan triangulasi sambaran petir dengan membandingkan pembacaan daya dari setiap stasiun untuk sambaran petir yang diberikan!

SIMPAN :29-11-2017; Saya belum bisa membuat interupsi perangkat keras bekerja pada MKR1000. Saya membuat catatan dan eksperimen sensor untuk kelas 9 (usia 13-14), dan mungkin Anda akan menemukan sketsa yang menarik. Kelas dibangun di sekitar papan Adalogger M0, dan menyimpan data ke kartu SD, dan masih ada banyak pin untuk modul WiFi. http://arduinoclass.pbworks.com

Saat saya mengerjakan sensor, saya juga melihat perlengkapan lampu SODERSVIK di IKEA (Lihat gambar di bawah.). Bayangkan mengganti LED putih di dalam lampu ini dengan 20 Neopiksel, dan menambahkan penerima jarak jauh IR. Hembusan angin bisa terlihat seperti awan yang bergulir, dan warnanya bisa menunjukkan suhu. Remote juga dapat memilih untuk menampilkan beberapa informasi lain untuk sementara, seperti perubahan suhu selama 12 jam terakhir.

Apa yang ingin Anda pantau dan tampilkan?

Kode

  • Sketsa keseluruhan pemantauan
  • Mengambil Pembacaan Analog Rata-Rata
  • Pemindai bus I2C
  • Kode Demo ML8511
Sketsa pemantauan keseluruhanArduino
Ada banyak sensor yang dilaporkan dalam sketsa ini, dan perpustakaan bekerja sama dengan baik. Namun, metode penguncian interupsi klasik di AVR-libc telah dihapus dalam versi terbaru Arduino IDE, yang telah menonaktifkan pustaka untuk NeoPixel dan untuk sensor Lightning. Saya berharap bahwa ini akan diselesaikan tahun ini kapan-kapan, tetapi itu berarti bahwa saya telah meninggalkan mereka dari sketsa akhir.
/* RTC-Weather-Sensors_v6_MKR1000 oleh Zonker Harris Spring 2016 * Hore! Papan kecil, dengan lebih dari 2 interupsi perangkat keras! * Ditambah WiFi, * dan * crypto (SANGAT diperlukan untuk aplikasi IoT!) * * Catatan untuk peretas yang lebih baru:Saya menaruh BANYAK komentar dalam kode saya, seperti yang Anda lihat. * Saat Anda mengklik unggah, *komentar DIABAIKAN*, dan jangan makan memori! * Saya sarankan Anda juga menambahkan banyak komentar ketika Anda membuat perubahan * dan tambahan, untuk membantu Anda mengingat MENGAPA Anda melakukan apa yang Anda lakukan beberapa bulan yang lalu. * Mereka juga akan membantu mereka yang datang setelah Anda, untuk belajar satu atau dua hal. * * Sekarang, perpustakaan *DO* menghitung memori program Anda... */#include #include #include #include // Termasuk neopixels sebagai pengganti, tetapi vektor interupsi perpustakaan perlu diperbarui.// Sertakan perpustakaan Adafruit_NeoPixel https://github.com/adafruit/Adafruit_NeoPixel//#include  //const int numLeds =1; // Berapa banyak neopiksel dalam string? digunakan untuk mengatur perpustakaan NeoPixel // Parameter 1 =jumlah piksel dalam strip // Parameter 2 =nomor pin (sebagian besar valid) // Parameter 3 =flag tipe piksel, tambahkan sesuai kebutuhan:// NEO_RGB Piksel disambungkan untuk RGB bitstream // NEO_GRB Piksel dihubungkan untuk GRB bitstream // NEO_KHZ400 400 KHz bitstream (misalnya FLORA piksel) // NEO_KHZ800 800 KHz bitstream (misalnya High Density LED strip)//Adafruit_NeoPixel strip =Adafruit_NeoPixel(numLeds, 6, NEO_GRB + NEO_KHZ800); /* Driver BMP085_U menggunakan perpustakaan sensor terpadu Adafruit (Adafruit_Sensor), yang menyediakan 'tipe' umum untuk data sensor dan beberapa fungsi pembantu. (BMP180 kompatibel dengan pustaka ini, dan memberikan output yang sama, tetapi pustaka akan mengidentifikasi BMP180 sebagai BMP085.) Untuk menggunakan driver ini, Anda juga perlu mengunduh pustaka Adafruit_Sensor dan memasukkannya ke dalam folder pustaka Anda. Anda juga harus menetapkan ID unik ke sensor ini untuk digunakan dengan Adafruit Sensor API sehingga Anda dapat mengidentifikasi sensor khusus ini di log data apa pun, dll. Untuk menetapkan ID unik, cukup berikan nilai yang sesuai di konstruktor di bawah (12345 adalah digunakan secara default dalam contoh ini). */Adafruit_BMP085_Unified bmp =Adafruit_BMP085_Unified(10180);/* Sketsa ini juga dirancang untuk bekerja dengan sensor HTU21D-F dari Adafruit ----> https://www.adafruit.com/products/1899 */Adafruit_HTU21DF htu =Adafruit_HTU21DF ();/* Macetech Chronodot v2.1 Jam Waktu Nyata (RTC) yang didukung baterai... http://docs.macetech.com/doku.php/chronodot (karena baterai pada MKR1000 saya sepertinya tidak menjaga agar RTC on-board tetap hidup) Info Perpustakaan Adafruit Real-Time Clock (RTC) https://learn.adafruit.com/adafruit-data-logger-shield/using-the-real-time-clock Perangkat Analog Analog TMP36 sensor suhu terkalibrasi. Ini memerlukan beberapa matematika https://learn.adafruit.com/tmp36-temperature-sensor http://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf Sensor UV ML8511... Sensor ini mendeteksi cahaya 280-390nm paling efektif. Ini dikategorikan sebagai bagian dari spektrum UVB (sinar yang terbakar) dan sebagian besar spektrum UVA (sinar penyamakan). MOD-1016 (AS3935 Lightning Sensor) i2c address 0x03 - AS3935 Lightning Sensor Adafruit memiliki anemometer yang memberikan tegangan DC keluar (0,4-2.0v) https://www.adafruit.com/products/1733 http://www. instruksiables.com/id/Breezefinder-Citizen-Science-Windpower-Tool/step2/Build-the-housing/ Soil Moisture Detector (sensor YL-69 atau serupa) memerlukan input analog... http://www.instructables.com /id/Arduino-LCD-Soil-Moisture-Sensor/step3/Connect-moisture-sensor/ My MKR1000 Connections (Semua sensor harus bersinyal 3.3v!) ===========*/int UVOUT =A1; // Keluaran dari sensor UV MV8511 lightOut =A2; // Output dari sensor cahaya tampak TEMT6000int tmp36out =A3; // Output dari sensor suhu lokal TMP36int mq9out =A4; // Keluaran dari DFrobot MQ-9 CO/sensor Gs Mudah Terbakar/* A5 Sensor Kelembaban A6 Sensor kecepatan angin? 0 (HW INT) pushbutton 1 (HW INT) SEBAGAI Lightning Detector 2 (HW INT) kecepatan angin anemometer? (interupsi per rotasi) 3 (HW INT) Tipper Hujan… 4 5 */int sounderPin =6; // Output Piezo Sounder (dibagi dengan LED on-board)// (Anda dapat menggunakan jumper untuk menonaktifkan sounder, tetapi LED on-board akan berkedip) int neopixelPin =7; // Output NeoPixel, untuk visualisasi menggunakan LED berbasis shift-register/*11 i2c SDA 12 i2c SCL */ // Mendekalasikan variabel untuk Chronodot i2c RTC...int addrRTC =(0x68); // alamat RTC i2c dalam detik; //gabungan BCD dari RTC (00h)int detik1; //0-9int detik10; //0-5int menit; //kombinasi BCD dari RTC (01h)int minutes1; //0-9int menit10; //0-6int jam; //kombinasi BCD dari RTC (02h)int hours1; //0-9 int jam10; //0-2int hari; //-7 (03j) tanggal int; //01-31 (04j)int bulan; //01-12 (05j)int tahun; //0-99; (06j)int a1secs; // (07h) dapatkan Alarm 1 detik dalam 1 menit; // (08h) dapatkan Alarm 1 menit dalam 1 jam; // (09j) dapatkan Alarm 1 jam pada tanggal 1 hari; // (0Ah) dapatkan Alarm 1 hari dan tanggal bitsint a2mins; // (0Bh) dapatkan Alarm 2 menit dalam 2 jam; // (0Ch) dapatkan Alarm 2 jam pada tanggal 2 hari; // (0Dh) dapatkan Alarm 2 hari dan tanggal bitsint rtcstatus; // (0Eh) dapatkan status RTC bitsint aginginfo; // (0Fh) dapatkan info offset penuaan// apa itu 10h?int temprtc; //kombinasi BCD dari RTC (11h)int tempfrtc; //kombinasi BCD dari RTC (12h)/*************************************** ***********************************/// Fungsi pengaturan Arduino (dipanggil secara otomatis saat startup)/** ************************************************** *************************/void setup(void) { Serial.begin(9600); penundaan (1000); Serial.println("i2c Sensor Deck");// Ingatlah untuk mengatur pin input dan output Anda! pinMode(UVOUT, INPUT); // mode pin sensor UV ML8511(lightOut, INPUT); // pinMode sensor cahaya tampak TEMT6000(tmp36out, INPUT); // Perangkat Analog TMP36 sensor suhu pinMode(sounderPin, OUTPUT); // HIGH akan menyebabkan sounder mengeluarkan noise pinMode(neopixelPin, OUTPUT); // Gunakan resistor 220-ohm in-line ke strip /* Inisialisasi sensor BMP085/BMP180 */ if(!bmp.begin()) { /* Ada masalah saat mendeteksi BMP085/180 ... periksa koneksi */ Serial.print("Ooops, BMP085/180 tidak terdeteksi ... Periksa kabel Anda atau I2C ADDR!"); sementara(1); } /* Menampilkan beberapa informasi dasar pada sensor ini, BMP180 melaporkan sebagai BMP085 */ displaySensorDetails();/* Inisialisasi sensor HTU21D */ if (!htu.begin()) { Serial.println("Couldn't find the HTU21 -Sensor DF!"); sementara (1); }// Inisialisasi jam Chronodot RTC//(ubah nilainya, batalkan komentar, lalu unggah untuk mengatur waktu, lalu beri komentar lagi) /* detik =0; menit =41; jam =20; hari =7; tanggal =3; bulan =1; tahun =16; initChrono();*/}void loop(void) { bip(50, 2); // umumkan awal loop pada sounder // Setel neopiksel ke Teal... //int red =0; int hijau =45; int biru =30; //strip.setPixelColor(0, (merah, hijau, biru)); //strip.show();/*************************************** *****************************//* Tarik alamat i2c info Chronot 0x68 - DS1307 RTC *//* Info papan:http ://docs.macetech.com/doku.php/chronodot *//* Lembar data DS3231:http://datasheets.maxim-ic.com/en/ds/DS3231.pdf *//******* ************************************************** *************/ int temprtc; /* Dapatkan stempel waktu baru */ Wire.beginTransmission(0x68); // 0x68 adalah alamat perangkat DS3231 Wire.write((byte)0); // mulai dari register 0 Wire.endTransmission(); Wire.requestFrom(0x68, 13); // meminta 19 byte (apakah # byte DEC atau HEX?) // (detik, menit, jam, hari, tanggal, bulan, jam, // a1secs, a1mins, a1hrs // a1secs, a1mins, a1hrs // Aging offset, Temp integer, fraksi temp) while(Wire.available()) { detik =Wire.read(); // (00j) dapatkan detik menit =Wire.read(); // (01j) dapatkan menit jam =Wire.read(); // (02j) get hours day =Wire.read(); // (03h) dapatkan hari dalam seminggu tanggal =Wire.read(); // (04h) dapatkan tanggal bulan bulan =Wire.read(); // (05j) dapatkan bulan, dan abad bit tahun =Wire.read(); // (06h) dapatkan tahun int a1secs =Wire.read(); // (07j) dapatkan Alarm 1 detik int a1mins =Wire.read(); // (08h) dapatkan Alarm 1 menit int a1hrs =Wire.read(); // (09j) dapatkan Alarm 1 jam int a1daydate =Wire.read(); // (0Ah) dapatkan Alarm 1 hari dan bit tanggal int a2mins =Wire.read(); // (0Bh) dapatkan Alarm 2 menit int a2hrs =Wire.read(); // (0Ch) dapatkan Alarm 2 jam int a2daydate =Wire.read(); // (0Dh) dapatkan Alarm 2 hari dan bit tanggal int rtcstatus =Wire.read(); // (0Eh) dapatkan bit status RTC int aginginfo =Wire.read(); // (0Fh) dapatkan info offset penuaan temprtc =Wire.read(); // (11h) dapatkan bagian integer dari temp, dan tandatangani tempfrtc =Wire.read(); // (12j) dapatkan bagian pecahan dari suhu // Baca bit kami, dan normalkan data dengan bantalan nol di depan // CATATAN:Chronodot tidak tahu tentang Daylight Savings, haruskah kode Anda? detik10 =((detik &0b11110000)>>4); detik1 =((detik &0b00001111)); // konversi BCD ke desimal menit10 =((menit &0b11110000)>>4); menit1 =(menit &0b00001111); // konversi BCD ke desimal jam10 =(((jam &0b00100000)>>5)*2 + ((jam &0b00010000)>>4)*1); jam1 =(jam &0b00001111); // konversi BCD ke desimal (anggap mode 24 jam) tahun =(tahun + 2000); temprtc =((temprtc &0b01111111) + (((tempfrtc &0b11000000)>>6)*0,25)); } get_date(); // Ini adalah satu tempat Anda dapat menambahkan keputusan Waktu Musim Panas untuk mengubah jam... Serial.print("ChronoDot - "); Serial.print(jam10); Serial.print(jam1); Serial.print(":"); Serial.print(menit10); Serial.print(menit1); Serial.print(":"); Serial.print(detik10); Serial.print(detik1); Serial.print("20"); Serial.print(tahun); Serial.print(""); Serial.print(bulan); Serial.print(""); Serial.print(tanggal); Serial.print("\t"); Serial.print(temprtc); Serial.println("C"); penundaan(100); // jadi ini akan menyelesaikan pencetakan, jika sensor berikutnya terhenti /********************************** ************************************//* 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"); penundaan(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("%"); penundaan(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"); penundaan(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); penundaan(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); penundaan(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()); month =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"); penundaan(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   

Skema

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

Proses manufaktur

  1. Integrasi Data Sensor dengan Mikroprosesor Raspberry Pi
  2. Sensor pelacakan garis dengan RPi
  3. API sensor lingkungan dengan RPi
  4. Aeroponik dengan Raspberry Pi dan sensor kelembapan
  5. Raspberry Pi GPIO dengan sensor gerak PIR:Tutorial terbaik
  6. Menggunakan Sensor Radar Berdenyut A111 dengan Raspberry Pi
  7. Menghubungkan Sensor Gerak PIR HC-SR501 dengan Raspberry Pi
  8. Python/MicroPython Sensor Logger dengan Google Spreadsheet
  9. Windows 10 IoT Core pada Raspberry Pi 2 – Data Adafruit Sensor
  10. Sirkuit Shutdown Raspberry Pi dengan mode Tidur