Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Многорежимная дека датчика окружающей среды с MKR1000

Компоненты и расходные материалы

Arduino MKR1000
× 1
Датчик молнии MOD-1016
× 1
Датчик газа DFRobot MQ-9
× 1
Датчик влажности и температуры Adafruit
× 1
Датчик давления / высоты / температуры Adafruit
× 1
УФ-датчик SparkFun ML8511
× 1
chronodot RTC
× 1
SparkFun Photon Weather Shield
× 1
Adafruit neopixels
× 1
Макет (общий)
× 1
Перемычки (общие)
× 1

Об этом проекте

Мне нравится наблюдать за погодой, и я хотел попытаться запечатлеть ее и нарисовать на графике. Домашние метеостанции позволяют мне видеть подробности «сейчас», а иногда и подсчеты за последний час или день. Я хотел сделать больше и использовать для этой работы Arduino. Все начинают с температуры и влажности, иногда с атмосферного давления, но я хотел большего! Для измерения скорости ветра и дождя необходимы аппаратные входы. Когда я освоил i2c, я нашел такие вещи, как детектор молний AS3935! А потом наступила печаль ... Мне не хватило аппаратных прерываний для работы с вашей базовой Arduino. У Sparkfun даже есть плата датчика погоды для Photon, но она все еще ограничена. Придется выбирать и обойтись без некоторых датчиков. :-(

Потом я увидел MKR1000 , и я заметил ЛУЧШУЮ ОСОБЕННОСТЬ, у нее 8 аппаратных прерываний! Теперь я могу получить все!

Выбор датчиков

Датчики бывают трех основных видов;

  • Аналоговый :свет (включая ИК и УФ), направление ветра, газы, датчики веса ...
  • I2C :температура, влажность, барометрическое давление, акселерометр, гироскоп ...
  • Прерывания :опрокидывание дождя, скорость ветра, молнии, таймеры ... (Такие функции, как последовательный порт, ШИМ, часы, сервоприводы, используют прерывания по времени)

MKR1000 имеет множество вводов / выводов для всего этого!

ЗАМЕТЬТЕ, КАКОЕ НАПРЯЖЕНИЕ ВАМ НЕОБХОДИМО ДЛЯ ВХОДОВ / ВЫХОДОВ на I2C и прерываниях! Например, MKR1000, Photon и многие разновидности Arduino используют ввод / вывод 3,3 В вместо 5 В. Если ваш ЦП и датчик (и), которые вы хотите использовать, используют разные напряжения, вам также необходимо использовать переключатели уровня между этими устройствами.

Все датчики, которые я использовал, достаточно распространены, доступны от Adafruit, SparkFun, Element-14 и других и обычно стоят от 5 до 10 долларов США. Датчики газа обычно стоят от 10 до 20 долларов. В качестве детектора молнии (микросхема AS3935) я выбрал Embedded Adventures MOD-1016, который стоит 26 долларов США, чтобы также установить антенну на плату. Я также купил Sparkfun Photon Weather Shield, поскольку у меня есть Photon, и я, вероятно, куплю их «метеометры» (приборы для измерения скорости и направления ветра). Возможно, я добавлю датчик влажности почвы, как только выясню, где я буду устанавливать MKR1000. Некоторым датчикам не нравятся длинные выводы.

Назначьте датчики контактам

Как только вы узнаете, какие датчики вам нужны, вы узнаете, какие типы входов вам понадобятся, следующим шагом будет решить, какие датчики будут подключаться к каким контактам. Я начинаю с бумаги, но я также добавлю этот список в качестве комментария блока в свой код, как напоминание.

Вот назначение контактов MKR1000, которое я сделал для моей сенсорной панели.

  • A0 (Я сохраняю A0 на случай, если позже мне понадобится ЦАП ...)
  • A1 УФ-датчик ML8511
  • A2 датчик видимого света
  • A3 Датчик местной температуры TMP36
  • A4 Датчик газа MQ-9
  • A5 датчик влажности
  • A6 датчик скорости ветра?
  • 0 Кнопка (HW INT)
  • 1 (HW INT) AS Детектор молний
  • 2 (HW INT) анемометр скорости ветра (прерывание на оборот)
  • 3 (HW INT) Самосвал для дождя…
  • 4
  • 5
  • 6 (совместно с бортовым светодиодом)
  • 7 Вывод NeoPixel…

Начало работы ...

Новичкам я предлагаю начать с каждого датчика, который вы собираетесь использовать, по одному, и начать с загрузки примера кода и установки необходимых библиотек. Не забудьте изменить контакт датчика, чтобы он соответствовал назначению контактов по вашему выбору, и сохраните копию демонстрационного кода в папке вашего проекта.

Когда вы сможете запустить тестовый код и прочитать результаты Serial Monitor, вы готовы попробовать добавить еще один. И когда вы закончите тестирование каждого датчика, все они подключены и готовы приступить к созданию вашего большого эскиза!

Моя первоначальная работа с датчиками, включенными с использованием часов Reat-Time Clock (RTC) на основе i2c, так что я мог войти на карту памяти SD. Хотя MKR1000 имеет собственный RTC и батарею, мне не удалось получить часы, чтобы отсчитывать время, используя только батарею, поэтому я также оставлю ChronoDot v2.1 i2c RTC.

Глядя на макетную плату на моем изображении ниже, вы можете увидеть различные используемые перемычки. Оранжевый - это питание 3,3 В для каждого датчика, поэтому я могу подключить их только тогда, когда буду готов с ними работать. (Датчик легко отключить, отсоединив оранжевую перемычку.)

Примечание о библиотеках

Я обнаружил, что некоторые из библиотек, которые вы можете установить, НЕ работают идеально с MKR1000 и / или с Arduino.cc IDE версии 1.6.7, и вам может потребоваться некоторая настройка, в зависимости от того, сколько лет вашему датчику. является. Одним из примеров этого являются старые макросы ATOMIC_ * в более раннем AVR libc библиотека (они были исключены в Arduino IDE 1.6.5), и есть отличная ветка о проблемах и предлагаемых решениях в ветке форума на Arduino.cc. Внесение некоторых из предлагаемых изменений - это что-то для среднего хакера Arduino, но, вероятно, будет пугающим для новых хакеров. А для немного более старых библиотек может не быть оригинального автора, чтобы обновить библиотеку и устранить зависимость.

К сожалению, обычно вы не сможете узнать, какие библиотеки необходимо настроить, прежде чем покупать датчики и тестировать их. На этом этапе я рекомендую вам внимательно просмотреть сообщения об ошибках, которые отображаются оранжевым цветом, когда вы пытаетесь загрузить свой скетч, чтобы увидеть, в вашем коде или в библиотеке проблема, прежде чем вы начнете изменять свой код. Если он есть в библиотеке, выполните поиск в Интернете по запросу «arduino» и сообщению об ошибке. Если вы не можете найти решение, попробуйте написать автору электронное письмо и сообщить ему об ошибке, и, возможно, они обновят библиотеку.

Купил отдельные фишки, пытаясь сэкономить. Я решил, что до тех пор, пока я не буду готов и не смогу делать свои собственные печатные платы (возможно, используя EagleCAD и OSHPark), проще покупать сенсорные модули у Adafruit и SparkFun, так как они отлично поддерживают исправления своих библиотек.

Немного о Wi-Fi и шифровании

Я также подумал о Wi-Fi, чтобы мои датчики погоды отправляли отчеты на веб-сайт. У нас даже есть механизм шифрования на MKR1000, чтобы обеспечить безопасность наших данных при передаче через Интернет! Но это больше, чем я смогу сделать в этом первом проекте. Это в моем списке, потому что обеспечение безопасности данных в вашем дизайне важно для Интернета вещей, но у меня не хватает времени, чтобы добавить свою заявку на участие в конкурсе MKR1000. Следите за моей «версией 2» этого проекта. Вот блок-схема модуля SAMD, который является сердцем вашей платы.

Я могу предложить вам один совет, чтобы начать работу со встроенным Wi-Fi: Убедитесь, что вы используете самую последнюю версию библиотеки WiFi101! Если вы этого не сделаете, ваш набросок не распознает модуль Wi-Fi, и ваши эскизы Wi-Fi будут сообщать только о том, что при вызове модуля Wi-Fi выполняется проверка ошибок.) Мне нужно поблагодарить Charif Mahmoudi за то, что указал на это в своем великолепном руководстве "Начало работы с MKR1000" здесь, на Hackster! На момент моего взлома вы могли найти WiFi101 Githuib здесь.

Советы по аналоговым датчикам

Большинство сенсорных модулей с "аналоговым выходом" создают простой аналоговый выходной сигнал напряжения, который легко считывается с помощью analogRead штифта датчика. Но тогда вам нужно знать, что это значит. Обычно вам нужно использовать карту команду, или вам может потребоваться немного математики. Для резистивных элементов обычно требуется дополнительная схема. Вы можете добавить потенциометр для «точной настройки» напряжения.

В других случаях вам понадобятся уравнения, чтобы преобразовать выходное напряжение в то, что люди поймут. TMP36 датчик температуры - один из хорошо задокументированных примеров этого. Эта часть была разработана для считывания в градусах Цельсия, поэтому вам нужно измерить напряжение и выполнить некоторые математические вычисления, чтобы получить C, и, если вы хотите, чтобы градусы Фаренгейта были преобразованы в F, вам нужно будет преобразовать C в F. объясните, как работает эта часть, но по мере накопления опыта вам будет легче пойти по стопам других.

Тем не менее, другим датчикам нужен усилитель, чтобы крошечные колебания напряжения были достаточно большими, чтобы ваш АЦП мог получить хороший диапазон от высокого до низкого. На эти типы датчиков (тензодатчики, влажность, акселерометр) я считаю лучше потратить немного денег и купить модуль, в котором уже есть усилитель, и библиотеку, чтобы помочь понять диапазон выходного сигнала.

Советы по использованию устройств I2C

I2C иногда называют «двухпроводным интерфейсом», потому что вам нужен тактовый сигнал, а также сигнал данных. (Вам понадобится только один провод для передачи данных, потому что «ведущий» и «ведомый (и)» будут по очереди отправлять данные на нем.) Конечно, вашим датчикам I2C также потребуется заземление и провод питания, и это провод заземления необходимо снова подключить к процессору.

Каждое устройство I2C будет иметь шестнадцатеричный адрес на шине. Лучше избегать использования нескольких устройств с одним и тем же адресом. (Если вы хотите иметь несколько устройств, вам необходимо управлять ими с помощью дополнительных схем, чтобы «включить» тот, с которым вы хотите общаться, а затем отключить его, когда вы закончите, прежде чем вы включите другой для связи.) Документация должен сообщить вам, каким адресом (ами) может быть устройство. ( ПРИМЕЧАНИЕ : Если у вас есть два устройства на шине I2C с одним и тем же адресом, и оба имеют вывод «Enable» или «Shutdown», вы сможете отключить одно, пока другое не спит. Однако вы не можете просто отключить питание на выводе vdd, поскольку датчики могут получить некоторую мощность от выводов SDA и SCL, что приведет к неверным показаниям для этого адреса. Проверка ошибок для I2C недостаточна для обнаружения / исправления в этом случае. )

Спецификации I2C говорят нам, что у нас должен быть «сильный» подтягивающий резистор как на тактовой частоте, так и на выводах данных, на датчике, который находится дальше всего на проводе. Из-за этого в некоторых модулях датчиков уже есть резисторы на плате, и вам может потребоваться просто добавить пару перемычек, поэтому обязательно прочтите документацию для модуля (-ов).

Помимо «оконечных резисторов шины», я также давно нашел подсказку от одного хакера, чтобы добавить резистор в линию как для данных (SDA), так и для синхронизации (SCL). Это значительно повысило надежность считывания данных с пары датчиков. В MKR1000, использующем сигнализацию 3,3 В, я использую резисторы 220 Ом. На 5-вольтовом процессоре вы можете попробовать 330 Ом. См. Схему ниже, чтобы увидеть разницу в местах размещения.

Что вы будете делать с данными?

Прямо сейчас я просто отправляю его в Serial Monitor. Вы можете добавить ЖК-дисплей. Я собирался добавить SD-карту, но теперь, когда у меня есть встроенный Wi-Fi, я хочу загрузить данные в облако ... представьте себе, что у вас есть несколько таких сенсорных колод, зная их широту и долготу, и имея возможность для триангуляции удара молнии путем сравнения показаний мощности каждой станции для данного удара молнии!

В стороне :2017-11-29; Мне не удалось заставить аппаратные прерывания работать на MKR1000. Я делаю заметки и экспериментирую с сенсорами для учеников 9 класса (возраст 13–14 лет), и, возможно, вы найдете эти зарисовки интересными. Класс построен на плате Adalogger M0 и сохраняет данные на SD-карту, и еще есть много контактов для модуля Wi-Fi. http://arduinoclass.pbworks.com

Пока я работал над датчиками, я также заметил светильник СОДЕРСВИК в IKEA (см. Изображение ниже). Представьте себе замену белых светодиодов внутри этой лампы на 20 неопикселей и добавление ИК-приемника дистанционного управления. Дующий ветер может выглядеть как проплывающие мимо облака, а цвет может указывать на температуру. На пульте дистанционного управления также можно выбрать моментальное отображение другой информации, например об изменении температуры за последние 12 часов.

Что вы хотите отслеживать и отображать?

Код

  • Весь набросок мониторинга
  • Измерение среднего аналогового показания
  • Сканер шины I2C
  • Демонстрационный код ML8511
Весь скетч мониторинга Arduino
В этом эскизе есть много датчиков, сообщающих, и библиотеки хорошо работают вместе. Однако классические методы блокировки прерываний в AVR-libc были удалены в последних версиях Arduino IDE, которые отключили библиотеки для NeoPixel и для датчика Lightning. Я ожидаю, что эта проблема когда-нибудь будет решена в этом году, но это означает, что я исключил их из окончательного наброска.
 / * RTC-Weather-Sensors_v6_MKR1000 от Zonker Harris Spring 2016 * Ура! Маленькая плата, с более чем 2-мя аппаратными прерываниями! * Плюс Wi-Fi, * и * криптография (ОЧЕНЬ необходимы для приложений IoT!) * * Примечание для новых хакеров:как вы видите, я поместил МНОГО комментариев в свой код. * При нажатии на загрузку * комментарии ИГНОРИРУЮТСЯ *, а память не съедают! * Я рекомендую вам также добавлять много комментариев при внесении изменений * и дополнений, чтобы помочь вам вспомнить, ПОЧЕМУ вы сделали то, что сделали несколько месяцев назад. * Они также помогут тем, кто придет после вас, узнать кое-что. * * Теперь библиотеки * DO * засчитываются в памяти вашей программы ... * / # include  #include  #include  #include  // Включая неопиксели в качестве заполнителя, но вектор прерывания библиотеки требует обновления .// Включите библиотеку Adafruit_NeoPixel https://github.com/adafruit/Adafruit_NeoPixel//#include  // const int numLeds =1; // Сколько неопикселей в строке? используется для установки библиотеки NeoPixel // Параметр 1 =количество пикселей в полосе // Параметр 2 =номер контакта (большинство из них действительны) // Параметр 3 =флаги типа пикселя, при необходимости складывайте вместе:// NEO_RGB Пиксели подключены для RGB битовый поток // NEO_GRB Пиксели подключены для битового потока GRB // NEO_KHZ400 битовый поток 400 кГц (например, пиксели FLORA) // NEO_KHZ800 800 кГц битовый поток (например, светодиодная полоса высокой плотности) // Adafruit_NeoPixel strip =Adafruit_NeoPixel (numLeds, 6, NEO_KHZ800); / * Драйвер BMP085_U использует унифицированную библиотеку датчиков Adafruit (Adafruit_Sensor), которая обеспечивает общий «тип» для данных датчиков и некоторых вспомогательных функций. (BMP180 совместим с этой библиотекой и дает тот же результат, но библиотека идентифицирует BMP180 как BMP085.) Чтобы использовать этот драйвер, вам также необходимо загрузить библиотеку Adafruit_Sensor и включить ее в папку с библиотеками. Вы также должны назначить этому датчику уникальный идентификатор для использования с API датчика Adafruit, чтобы вы могли идентифицировать этот конкретный датчик в любых журналах данных и т. Д. Чтобы назначить уникальный идентификатор, просто укажите соответствующее значение в конструкторе ниже (12345 - это используется по умолчанию в этом примере). * / Adafruit_BMP085_Unified bmp =Adafruit_BMP085_Unified (10180); / * Этот скетч также предназначен для работы с датчиком HTU21D-F от Adafruit ----> https://www.adafruit.com/products/1899 * / Adafruit_HTU21DF htu =Adafruit_HTU21 (); / * Macetech Chronodot v2.1 Часы реального времени с батарейным питанием (RTC) ... http://docs.macetech.com/doku.php/chronodot (потому что батарея на моем MKR1000 не работает Поддерживайте работу бортового RTC) Информация библиотеки Adafruit Real-Time Clock (RTC) https://learn.adafruit.com/adafruit-data-logger-shield/using-the-real-time-clock Аналог аналоговых устройств TMP36 калиброванный датчик температуры. Для этого нужна математика https://learn.adafruit.com/tmp36-temperature-sensor http://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf УФ-датчик ML8511 ... Этот датчик наиболее эффективно обнаруживает свет с длиной волны 280–390 нм. Это классифицируется как часть спектра UVB (горящие лучи) и большая часть спектра UVA (лучи загара). MOD-1016 (датчик молнии AS3935) адрес i2c 0x03 - Датчик молнии AS3935 В Adafruit есть анемометр, который обеспечивает выход постоянного напряжения (0,4-2,0 В) https://www.adafruit.com/products/1733 http:// www. Instructables.com/id/Breezefinder-Citizen-Science-Windpower-Tool/step2/Build-the-housing/ Детектор влажности почвы (датчик YL-69 или аналогичный) требует аналогового входа ... http://www.instructables.com / id / Arduino-LCD-Soil-Moisture-Sensor / step3 / Connect-temperature-sensor / My MKR1000 Connections (Все датчики должны сигнализировать 3,3 В!) ===========* / int UVOUT =A1; // Выходной сигнал УФ-датчика MV8511int lightOut =A2; // Вывод датчика видимого света TEMT6000 int tmp36out =A3; // Вывод локального датчика температуры TMP36 int mq9out =A4; // Выходной сигнал датчика DFrobot MQ-9 CO / Горючего газа / * A5 Датчик влажности A6 Датчик скорости ветра? 0 (HW INT) кнопка 1 (HW INT) AS Детектор молнии 2 (HW INT) анемометр скорости ветра? (прерывание на оборот) 3 (HW INT) Самосвал дождя… 4 5 * / int sounderPin =6; // Выход пьезоэхолота (общий со встроенным светодиодом) // (Вы можете использовать перемычку, чтобы отключить эхолот, но встроенный светодиод будет мигать) int neopixelPin =7; // Вывод NeoPixel, для визуализации с использованием светодиодов на основе регистра сдвига / * 11 i2c SDA 12 i2c SCL * / // Удаление переменных для Chronodot i2c RTC ... int addrRTC =(0x68); // Адрес RTC i2c int секунд; // объединенный BCD из RTC (00h) int seconds1; // 0-9int секунд10; // 0-5int минут; // комбинированный BCD из RTC (01h) int minutes1; // 0-9int minutes10; // 0-6инт часов; // комбинированный BCD из RTC (02h) int hours1; // 0-9 int hours10; // 0-2инт день; // 1-7 (03h) int date; // 01-31 (04ч) int месяц; // 01-12 (05h) int years; // 0-99; (06h) int a1secs; // (07h) получить сигнал тревоги 1 секундыint a1mins; // (08h) получить сигнал тревоги 1 minutesint a1hrs; // (09h) получить будильник 1 hoursint a1daydate; // (0Ah) получить будильник 1 день и дату bitsint a2mins; // (0Bh) получить будильник 2 минутыint a2hrs; // (0Ch) получить будильник 2 часаint a2daydate; // (0Dh) получить день и дату будильника 2 bitsint rtcstatus; // (0Eh) получить бит статуса RTCint ageinginfo; // (0Fh) получить информацию о смещении старения // что такое 10h? Int temprtc; // объединенный BCD из RTC (11h) int tempfrtc; // комбинированный BCD из RTC (12h) / ************************************** ********************************** /// Функция настройки Arduino (автоматически вызывается при запуске) / ** ************************************************* ********************** / void setup (void) {Serial.begin (9600); задержка (1000); Serial.println ("i2c Sensor Deck"); // Не забудьте настроить входные и выходные контакты! pinMode (UVOUT, INPUT); // УФ-датчик ML8511 pinMode (lightOut, INPUT); // датчик видимого света TEMT6000 pinMode (tmp36out, INPUT); // датчик температуры Analog Devices TMP36 pinMode (sounderPin, OUTPUT); // HIGH приведет к тому, что эхолот будет издавать шум pinMode (neopixelPin, OUTPUT); // Используйте резистор 220 Ом, подключенный к полосе / * Инициализируйте датчик BMP085 / BMP180 * / if (! Bmp.begin ()) {/ * При обнаружении BMP085 / 180 возникла проблема ... проверьте ваш соединения * / Serial.print («Упс, BMP085 / 180 не обнаружен ... Проверьте вашу проводку или I2C ADDR!»); в то время как (1); } / * Отображаем основную информацию об этом датчике, BMP180 сообщает как BMP085 * / displaySensorDetails (); / * Инициализирует датчик HTU21D * / if (! Htu.begin ()) {Serial.println ("Не удалось найти HTU21 -DF датчик! "); в то время как (1); } // Инициализируем часы Chronodot RTC // (измените значения, раскомментируйте, затем загрузите, чтобы установить время, затем закомментируйте снова) / * секунды =0; минут =41; часов =20; день =7; дата =3; месяц =​​1; лет =16; initChrono (); * /} недействительный цикл (void) {beep (50, 2); // объявляем начало цикла на эхолоте // Установите неопиксель на бирюзовый ... // int red =0; int зеленый =45; int blue =30; //strip.setPixelColor(0, (красный, зеленый, синий)); //strip.show();/**************************************** **************************** // * Получение информации Chronot по адресу i2c 0x68 - DS1307 RTC * // * Информация о плате:http ://docs.macetech.com/doku.php/chronodot * // * Таблица данных DS3231:http://datasheets.maxim-ic.com/en/ds/DS3231.pdf * // ******* ************************************************* ************* / int temprtc; / * Получить новую отметку времени * / Wire.beginTransmission (0x68); // 0x68 - адрес устройства DS3231 Wire.write ((byte) 0); // начать с регистра 0 Wire.endTransmission (); Wire.requestFrom (0x68, 13); // запрашиваем 19 байт (это # ​​байтов DEC или HEX?) // (секунды, минуты, часы, день, дата, месяц, часы, // a1secs, a1mins, a1hrs // a1secs, a1mins, a1hrs // Старение смещение, временное целое, временная дробь) while (Wire.available ()) {секунды =Wire.read (); // (00h) получаем секунды минуты =Wire.read (); // (01h) получаем минуты hours =Wire.read (); // (02h) получаем часы day =Wire.read (); // (03ч) получаем день недели date =Wire.read (); // (04h) получить дату месяца month =Wire.read (); // (05h) получаем месяц и век в битах years =Wire.read (); // (06h) получаем год int a1secs =Wire.read (); // (07h) получить сигнал тревоги 1 секунды int a1mins =Wire.read (); // (08h) получить сигнал тревоги через 1 минуту int a1hrs =Wire.read (); // (09h) получить будильник через 1 час int a1daydate =Wire.read (); // (0Ah) получить биты дня и даты будильника 1 int a2mins =Wire.read (); // (0Bh) получить будильник через 2 минуты int a2hrs =Wire.read (); // (0Ch) получить будильник через 2 часа int a2daydate =Wire.read (); // (0Dh) получить биты дня и даты для будильника 2 int rtcstatus =Wire.read (); // (0Eh) получить биты состояния RTC int ageinginfo =Wire.read (); // (0Fh) получить информацию о смещении устаревания temprtc =Wire.read (); // (11h) получаем целую часть значения temp и подписываем tempfrtc =Wire.read (); // (12h) получить дробную часть временного интервала // Прочитать наши биты и нормализовать данные с заполнением начальных нулей // ПРИМЕЧАНИЕ:Chronodot не знает о переходе на летнее время, нужно ли вам код? секунд10 =((секунды &0b11110000)>> 4); секунды1 =((секунды &0b00001111)); // конвертируем BCD в десятичные минуты 10 =((minutes &0b11110000)>> 4); минут1 =(минуты &0b00001111); // преобразование BCD в десятичные часы 10 =(((hours &0b00100000)>> 5) * 2 + ((hours &0b00010000)>> 4) * 1); hours1 =(часы &0b00001111); // преобразовываем BCD в десятичный (предположим, 24-часовой режим) years =(years + 2000); temprtc =((temprtc &0b01111111) + (((tempfrtc &0b11000000)>> 6) * 0,25)); } get_date (); // Это одно место, где вы можете добавить решения о переходе на летнее время, чтобы изменить часы ... Serial.print ("ChronoDot -"); Серийная печать (часов10); Serial.print (часы1); Serial.print (":"); Серийный принт (минут10); Serial.print (минут1); Serial.print (":"); Serial.print (секунд10); Serial.print (секунды1); Serial.print («20»); Серийный отпечаток (в годах); Serial.print (""); Serial.print (месяц); Serial.print (""); Serial.print (дата); Serial.print ("\ t"); Serial.print (temprtc); Serial.println ("C"); задержка (100); // чтобы закончить печать, если следующий датчик остановится / ********************************** ************************************//* 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"); задержка (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 ("%"); задержка (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"); задержка (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); задержка (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); задержка (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()); месяц =​​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"); задержка (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  

Схема

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

Производственный процесс

  1. Интеграция данных датчика с микропроцессором Raspberry Pi
  2. Датчик отслеживания линии с RPi
  3. API датчика окружающей среды с RPi
  4. Аэропоника с Raspberry Pi и датчиком влажности
  5. Raspberry Pi GPIO с датчиком движения PIR:Лучшее руководство
  6. Использование импульсного радиолокационного датчика A111 с Raspberry Pi
  7. Взаимодействие датчика движения HC-SR501 PIR с Raspberry Pi
  8. Регистратор датчиков Python / MicroPython с Google Таблицами
  9. Windows 10 IoT Core на Raspberry Pi 2 - данные датчика Adafruit
  10. Схема выключения Raspberry Pi в спящем режиме