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

Мониторинг температуры SMART для школ

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

Pycom SiPy
× 1
Raspberry Pi 3, модель B
× 1
Arduino Nano R3
× 1
Преобразователь логического уровня SparkFun - двунаправленный
× 1
NFC RFID-RC522
× 1
Sharp GP2Y0A41SK0F (4–30 см) - аналоговый датчик расстояния
× 1
MLX90614-DCI I2C - датчик температуры
× 1
Модуль ЖК-дисплея Arduino DFRobot I2C 16x2
× 1
LED (общий)
× 1
Резистор 330 Ом
× 2
Зуммер
× 1

Приложения и онлайн-сервисы

IDE Arduino
Код Visual Studio (Pymakr)
ThingSpeak API
IFTTT
Замазка
IDLE IDE

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

ЗАЯВЛЕНИЕ О ПРОБЛЕМЕ

В Азии из-за жаркой погоды и вспышки тяжелого острого респираторного синдрома (SARS) в 2003 году учащимся начальной и средней школы необходимо измерять температуру в течение каждого квартала, чтобы обеспечить хорошее самочувствие учащихся. Каждый раз, когда в школе запланировано упражнение по измерению температуры, учащиеся должны принести свой собственный цифровой термометр для этого упражнения. Однако некоторые учащиеся могут не иметь возможности участвовать во время упражнения из-за того, что термометр неуместен или поврежден, и они могут забыть взять с собой устройство. Из-за личной гигиены студентам не разрешают делиться своими термометрами, и у них может не быть достаточно денег, чтобы купить новый. Следовательно, это влияет на успешность упражнений по измерению температуры. После упражнения по измерению температуры персонал должен будет вручную ввести все данные о температуре учащихся и учащихся, относящиеся к базе данных. Задача очень утомительная и требует много времени, так как каждый классный руководитель должен будет выполнить задания примерно для 40 учеников.

Какое решение?

Тема нашего проекта - Социальное воздействие SqwidNet, а в области хорошего здоровья и благополучия - Цели устойчивого развития (ЦУР). Причина в том, что наша система может развертываться для автоматического измерения температуры допустимых пользователей, чтобы можно было отслеживать их температуру и отправлять оповещения всякий раз, когда она превышает определенный пороговый уровень.

КАК ЭТО РАБОТАЕТ:RaspberryPi и Arduino

RaspberryPi содержит программу Python и базу данных MySQL.

После запуска программы Python она автоматически проверяет, создана ли уже база данных, если нет, она будет создана автоматически. Таблицы внутри также будут проверены и созданы автоматически при необходимости. Это снижает ручной труд учителей / административного персонала в школе.

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

При подключении RFID-карты к Arduino информация о карте сохраняется в Arduino и отправляется на RaspberryPi через последовательную связь. После этого RaspberryPi подтверждает с помощью базы данных, что указанная карта является действующим пользователем, и если это так, он отправляет в Arduino подтверждение, и Arduino выводит «Добро пожаловать, имя» на ЖК-экран. Если это недействительный пользователь, он просто скажет «Ошибка! Недействительный пользователь!».

Допустим, теперь у нас есть действующий пользователь, который только что нажал кнопку. Затем Arduino предложит пользователю измерить температуру. Затем датчик расстояния определит, готов ли пользователь измерить свою температуру. Если это так, он будет измерять их температуру и выводить ее на ЖК-экран. Если это допустимая температура (28 * C - 42 * C), эта информация будет отправлена ​​как в RaspberryPi (MySQL), так и в Sigfox (ThingSpeak) для хранения данных. База данных MySQL будет хранить идентификатор пользователя, дату, метку времени и температуру каждого приема.

Получая данные о температуре от Arduino, RaspberryPi будет постоянно проверять, правильно ли установлена ​​температура, прежде чем приступить к чему-либо еще. Это связано с тем, что, если программа Python только один раз проверяет данные о температуре, они могли еще не быть отправлены Arduino, потому что оба кода выполняются в разное время. Поэтому для синхронизации мы постоянно проверяем данные о температуре в коде Python, прежде чем продолжить выполнение остальной части программы.

ПРИМЕЧАНИЕ. И код Python RaspberryPi, и код Arduino используют метод синхронизации, называемый рукопожатием. Если RaspberryPi не готов получить другую информацию о температуре / пользователе, Arduino не позволит пользователю коснуться карты, наоборот .

Я сделал простой способ - постоянно посылать сигнал «ГОТОВ», пока другая сторона не отправит обратно сигнал «ПОЛУЧИТЬ», чтобы они знали, что они оба готовы.

Ардуино -

  логическое readySignal =Serial.readString () =="READY"; 


if (readySignal)
{

нажат =true;

Serial.println ("ПОЛУЧЕНО");

}

Python -

  while (readySignal ==True):

ser.write (b '' + "READY")



ReceiveSignal =ser.readline (). strip () =="ПОЛУЧЕНО"


if (receiveSignal ==True):

readySignal =False

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

КАК ЭТО РАБОТАЕТ:Sigfox (SiPy)

После получения данных о температуре от Arduino SiPy разделит идентификатор пользователя и температуру на целые числа и десятичные знаки. После этого все данные отправляются в бэкэнд Sigfox в байтах (чтобы их можно было отправлять в Ubidots, а также в ThingSpeak) и должны выглядеть примерно так, как показано на следующем рисунке.

После получения этого сообщения серверная часть Sigfox перекодирует эти данные для отправки в ThingSpeak для хранения. Следующее покажет вам, как запрограммировать серверную часть для отправки данных в thingspeak.

В серверной части Sigfox в разделе «Тип устройства»> «Имя устройства»> «ОТЗЫВЫ» вам нужно будет ввести пользовательские данные в точности так, как они равно если вы не изменили кодировку в SiPy, поскольку пользовательская полезная нагрузка установит то, что получено первым, в качестве идентификатора пользователя, поэтому, например, если вы сначала отправите температуру, на бэкэнде она преобразует эту температуру в идентификатор пользователя вместо температуры. В теле ключ api записи должен располагаться наверху, в то время как поля могут быть размещены с любыми настраиваемыми данными, которые вы создали в настраиваемых полезных данных.

КАК ЭТО РАБОТАЕТ:Облако

После того, как данные успешно отправлены в ThingSpeak, он сначала получает их в частном канале просмотра, где сценарий анализа MATLAB анализирует данные и объединяет данные температуры в одно значение вместо разделения целочисленного значения и десятичного значения. / P>

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

В то же время он проверяет, находится ли температура на опасном уровне (лихорадка), если да, будет отправлено электронное письмо с уведомлением сотрудников / учителей.

Таким образом, первый канал, значение температуры которого разделено целым числом и десятичным числом, является внутренним каналом, на самом деле не для просмотра. Для второго канала значения температуры были объединены и сделаны удобными для просмотра сотрудниками / руководством / администраторами, а также для удобства анализа данных имеется таблица в стиле Excel.

1. Настройка подключения Arduino Nano

Что касается Arduino Nano, вот подключения, которые мы сделали с нашими модулями.

У Nano и Uno одинаковая распиновка.

  RFID - RC522 

SDA D10
SCK D13
MOSI D11
MISO D12
IRQ UNCONNECTED
GND GND
RST D9
3,3 В 3,3 В

Как проверить RFID

  ЖК-экран 

SDA A4
SCL A5
GND GND
5V 5V

Как проверить ЖК-дисплей I2C

  Датчик расстояния 

5V 5V
GND GND
Вход A0

Как проверить инфракрасный датчик расстояния Sharp

  Зуммер 

GND GND
Выход D6

Как проверить зуммер

  ИК-датчик температуры 

SDA A4
SCL A5
GND GND
5V 5V

Как проверить ИК-датчик температуры

  LED 

Плоская сторона (катод) GND
Неплоская сторона (анод) D7

Хорошо! Что касается соединений Arduino, все должно быть в порядке.

2. Настройка RaspberryPi

В основном на вашу машину с Raspberry Pi 3 необходимо установить две вещи:

1. Распбиан Операционная Система -

Установка операционной системы Raspbian считается довольно простой.

Краткий ответ о том, как это сделать:прошить (записать) файл изображения на SD-карту и вставить эту SD-карту в Raspberry Pi 3.

Однако, если вы ищете пошаговое подробное руководство по ответам, вот как это сделать -

Во-первых, вам необходимо загрузить программное обеспечение, позволяющее записывать файлы .img на накопитель. Вы можете использовать программу под названием balenaEtcher.

После этого перейдите на страницу Raspberry Pi - Raspbian и выберите тот, который вам подходит. Я выбрал «Raspbian Buster with Desktop и рекомендованное программное обеспечение», потому что, как следует из названия, он поставляется с рекомендуемым программным обеспечением и избавляет вас от лишних хлопот, связанных с загрузкой программного обеспечения.

Как только вы закончите выполнив вышеупомянутые шаги, просто запустите программу balenaEtcher. Этот шаг не требует пояснений:выберите образ (файл your.img Raspbian), затем выберите свою SD-карту и нажмите flash. Теперь тебе просто нужно подождать. Как только это будет сделано, он должен запросить вас, и теперь вы можете вставить только что прошитую SD-карту в Raspberry Pi.

После этого подключите свою машину Raspberry Pi через HDMI к монитору и выполните первоначальную настройку. Наконец, перейдите в Настройки -> Конфигурация Raspberry Pi . и вы должны быть в этом меню -

Следуйте параметрам, этот шаг включает такие интерфейсы, как SSH, VNC, которые позволяют подключаться к IP-адресам через eth0 или wlan0 (так что вам больше не нужен кабель HDMI, вы можете делать все это через SSH).

(необязательный шаг) - я открываю терминал и редактирую файл dhcpcd.conf (sudo nano /etc/dhcpcd.conf) и добавляю эти командные строки,

  interface eth0 
статический ip_address =192.168.0.11 / 24

Вышеупомянутое позволяет мне подключиться к Raspberry Pi через кабель Ethernet со статическим адресом 192.168.0.11, поэтому я каждый раз знаю, что это мой адрес Raspberry Pi.

Это дополнительный шаг, поскольку после подключения к Wi-Fi вы получите IP-адрес wlan0, который позволит вам подключаться к Raspberry Pi без кабеля Ethernet и в любом месте в любом месте, если вы подключены к тому же самому. Вай-фай. Чтобы узнать, какой у вас IP-АДРЕС wlan0, просто наведите указатель мыши на символ WiFI, расположенный в правом верхнем углу, и он отобразит.

Отлично! Вы закончили с первоначальной настройкой Raspberry Pi!

3. Настройка базы данных MySQL

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

Во-первых, вы должны убедиться, что ваша система обновлена ​​и обновлена ​​до последней версии прошивки. Вы можете убедиться, введя эти команды,

  sudo apt update 
sudo apt upgrade

После этого вы установите apache2.

  sudo apt install apache2  

Apache2 позволит вам создать веб-сервер, чтобы вы могли получить доступ к веб-сайтам, которые вы создадите позже.

После установки apache2 вам необходимо установить PHP.

  sudo apt install php php-mbstring  

PHP позволит вам создавать и просматривать собственные веб-сайты на PHP.

Давайте остановимся и посмотрим, работает ли все, что вы только что установили, просто введите IP-адрес Raspberry Pi в своем веб-браузере или «localhost», если вы все еще подключены через HDMI, и вы должны увидеть страницу индекса Apache.

Теперь вам нужно будет установить базу данных. Для этого вы будете использовать MySQL и mariadb.

  sudo apt install mariadb-server php-mysql  

ВАЖНО - Убедитесь, что вы внимательно прочитали то, что ниже.

Теперь вы создадите своего пользователя root MySQL, чтобы использовать его для доступа к базе данных.

  sudo mysql --user =root  

Теперь вы войдете в сеанс MySQL, где вы можете вводить коды MySQL, вводить их строка за строкой (вы можете заменить пароль своим собственным паролем)

  УДАЛИТЬ ПОЛЬЗОВАТЕЛЯ 'root' @ 'localhost'; 
СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ 'root' @ 'localhost', ИДЕНТИФИЦИРОВАННЫЙ 'паролем';
ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА *. * ДЛЯ 'root' @ 'localhost' С ОПЦИЕЙ ПРЕДОСТАВЛЕНИЯ;
ПРОЧИТАТЬ ПРИВИЛЕГИИ;
выйти;

Теперь вы можете проверить своего корневого пользователя MySQL, войдя в систему;

  mysql --user =root --password =yourmysqlpassword  

Если все работает, теперь вы можете установить PHPMyAdmin, панель управления администратора, чтобы вы могли получить доступ (просмотреть) и изменить базу данных MySQL.

  sudo apt install phpmyadmin 

(после установки)
sudo phpenmod mysqli
sudo /etc/init.d/apache2 restart

Поздравляем! Теперь вы можете получить доступ к своей недавно созданной базе данных, используя http:// your_raspberrypi_ip_address / phpmyadmin.

4. SiPy Expansion Board 2.0 Руководство по установке и программному обеспечению

Во-первых, вам нужно будет вставить модуль SiPy на плату расширения так, чтобы кнопка сброса была обращена к разъему USB, и она должна надежно зафиксироваться на месте, а контакты больше не будут видны.

Источник:Документация Pycom

После этого вам нужно будет обновить прошивку на SiPy, чтобы вы могли загружать и запускать программы, а также получать идентификатор устройства Sigfox и номер PAC, которые будут использоваться для регистрации для бэкэнда Sigfox. Загрузите программу обновления прошивки в зависимости от того, какую ОС (операционную систему) вы используете.

  • Windows
  • macOS (10.11 или выше)
  • Linux (требуется диалоговое окно и python-serial пакет)

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

Тщательно следуйте инструкциям по обновлению прошивки, так как это может привести к неправильной работе вашего Sigfox, так как идентификатор устройства Sigfox и номер PAC обозначаются буквой F (как показано ниже), а не смесью цифр и букв.

  b 'FFFFFFFF' 
b 'FFFFFFFFFFFFFFFF'

После обновления прошивки вам нужно будет загрузить Visual Studio Code и установить расширение Pymkr, а также nodejs, прежде чем вы сможете начать загрузку и выполнение программ на SiPy.

Во-первых, вам нужно будет создать новую папку для сохранения всех файлов, которые вы собираетесь загрузить в SiPy позже, или просто для хранения всех программ, которые вы собираетесь запускать. Нажмите файл в верхнем левом углу и нажмите Открыть папку или Ctrl + K + O, затем выберите, куда вы хотите поместить эту папку, и щелкните правой кнопкой мыши, чтобы создать новую папку. После этого создайте новый файл или Ctrl + N чтобы открыть новый файл. После создания нового файла вам нужно будет сохранить новый файл как python и изменить тип save as на файл python, чтобы впоследствии можно было запустить код на SiPy и сохранить его в новой папке, которую вы создали.

Примечание. Имя файла может быть любым, например Test, Trial и т. Д. Но при загрузке в файл SiPy имя должно называться main . .

Чтобы просто запустить свой код, не загружая его в модуль Sipy, все, что вам нужно сделать, это нажать кнопку запуска, расположенную в нижней части программы. Следующая загрузка загружает текущую папку в модуль SiPy. Будьте осторожны при использовании циклов while 1, поскольку после их загрузки в модуль SiPy единственный способ снова получить доступ к модулю SiPy - это зайти по FTP во флэш-память и удалить файл main.py из SiPy Модуль .

Если вы случайно добавили бесконечный цикл while, не о чем беспокоиться, так как вы все равно можете загрузить свою программу или удалить предыдущую через FTP. Во-первых, скачайте бесплатную версию filezilla и установите ее.

После установки вам нужно будет настроить соединение. Сначала откройте filezilla и перейдите в диспетчер сайтов, который находится в файле, или нажмите Ctrl + S и нажмите новый сайт.

Вы можете переименовать сайт в SiPy или как угодно называть это соединение и изменить настройки шифрования на Использовать только простой FTP (небезопасно) . и переведите настройки в пассивный режим и ограничьте количество активных подключений до 1

Вы можете найти хост (адрес), пользователя и пароль с помощью кода Visual Studio, нажав все команды и выбрав глобальные настройки . Это покажет вам настройки по умолчанию для хоста (адрес), пользователя (имя пользователя) и пароля. Это можно изменить, нажав настройки проекта . во всех командах.

Затем вам нужно будет узнать SSID модуля SiPy, который можно найти, используя все команды и нажав получить SSID WiFI AP. Каждый SSID модуля SiPy будет уникальным, но пароль будет одинаковым и не может быть изменен. Пароль для SSID модуля SiPy:www.pycom.io

Примечание. Пользователям настольных компьютеров потребуется адаптер Wi-Fi

Теперь вы можете использовать filezilla для доступа к SiPy Flash! Сначала подключитесь к SSID SiPy, затем перейдите в менеджер сайтов filezilla, подключитесь к новому сайту, который вы создали, и введите пароль. Теперь откройте папку flash и удалите ТОЛЬКО main.py! После удаления main.py перезапустите SiPy, и вы сможете запускать / загружать свои программы.

Примечание. Возможно, вы захотите скопировать папку flash на свою ОС (операционную систему) на случай, если вы удалите все.

5. Регистрация в Sigfox Backend

После установки Visual Studio Code подключите плату расширения pycom к компьютеру, и она автоматически обнаружит соединение, когда вы откроете Visual Studio Code. Скопируйте приведенный ниже код и вставьте его в терминал или в файл и запустите. Подойдет любой метод .

  из сетевого импорта Sigfox 
import binascii

# инициализируйте Sigfox для RCZ * (вам может потребоваться другой регион RCZ)
sigfox =Sigfox (mode =Sigfox .SIGFOX, rcz =Sigfox.RCZ *)

# print Sigfox Device ID
print (binascii.hexlify (sigfox.id ()))

# print Номер Sigfox PAC
print (binascii.hexlify (sigfox.pac ()))

Примечание :Замените * на номер региона RCZ.

Терминальный метод для получения идентификатора устройства Sigfox и номера PAC

Чтобы вызвать терминал в Visual Studio Code, нажмите Ctrl + ~. Затем вставьте код внутрь, и он будет выглядеть, как на следующем рисунке.

Метод файла для получения идентификатора устройства Sigfox и номера PAC

После того, как новый файл будет сохранен, нажав Ctrl + S или перейдя в файл, затем сохраните, вставьте код в файл и сохраните файл, затем вы можете запустить файл, нажав кнопку запуска . внизу экрана и должен выглядеть так, как на картинке ниже.

После получения идентификатора устройства Sigfox и номера PAC вам необходимо зарегистрировать свой Sigfox в серверной части Sigfox, прежде чем вы сможете начать передачу на него. Первая страница, которую вы увидите, будет там, где находится ваша компания sigfox. Вы должны выбрать страну, в которой это устройство Sigfox будет использоваться, поскольку каждая из зон Sigfox настроена по-разному.

После выбора правильной страны на следующей странице потребуется ваш идентификатор устройства Sigfox и номер PAC, которые вы получили в начале этой главы. Вставьте их в правильное поле, и страница должна выглядеть как на картинке. В остальном долейте соответственно.

После заполнения страницы устройства, создания учетной записи Sigfox или входа в существующую учетную запись Sigfox вам необходимо зарегистрировать Sigfox в своей учетной записи. Если вы создаете новую учетную запись Sigfox, Sigfox отправит вам электронное письмо на зарегистрированный адрес электронной почты для установки пароля.

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

Примечание **: Прежде чем запускать любую программу sigfox, подключите антенну sigfox.

  from network import Sigfox 
import socket

# инициализировать Sigfox для RCZ * (вам может понадобиться другой регион RCZ)
sigfox =Sigfox (mode =Sigfox .SIGFOX, rcz =Sigfox.RCZ *)

# создать сокет Sigfox
s =socket.socket (socket.AF_SIGFOX, socket.SOCK_RAW)

# сделать блокировку сокета
s.setblocking (True)

# настроить его только как восходящий канал
s.setsockopt (socket.SOL_SIGFOX, socket.SO_RX, False)

# отправляем несколько байтов
s.send (bytes ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]))

Примечание :Замените * на номер региона RCZ.

6. Настройка облака

Во-первых, вам нужно будет настроить IFTTT для электронной почты, перейти на веб-сайт IFTTT и создать учетную запись. После настройки учетной записи и входа в систему перейдите в свой профиль, который находится в правом верхнем углу экрана в левой части окна «Обзор», и нажмите кнопку Создать . .

Нажмите " Это . ", а затем выполните поиск по запросу Webhooks и нажмите. If you are unsure, the following pictures will help you with what to do.

After selecting Webhooks, press the Receive a web request box and enter an event name to fit your requirements (in this example fever is used), afterwards press Create trigger .

Press the word "That ", type email in the search box and press Email then press Send me an email box

Enter message information. You can pass data about the event that triggered your message by using ingredients. For example, including {{Event Name}} adds the event name to your text message. The Body section must include at least {{Value1}} and {{Value2}}. Click Create action to finish the new applet. Note:Value 1, value 2 and value 3 in body message are derived from MATLAB Analysis and can be modified according to your requirement

ThingSpeak is an IOT (Internet of Things) platform which can be easily setup, learned and is open source.

First, we create two channels; (SIGFOX) TEMPERATURE PRIVATE VIEWING &(SIGFOX) TEMPERATURE PUBLIC VIEWING.

For the (SIGFOX) TEMPERATURE PRIVATE VIEWING , its purpose is to obtain data from the Sigfox backend. Sigfox sends up using bytes, this is because, we have realised that Ubidots (a web service) do not really work well with decoding Strings, so to make it work and accessible with both ThingSpeak and Ubidots, we chose to use bytes as it contain numbers from 0-255.

Therefore, using bytes makes it so we have to send both the whole number and the decimal number of the temperature information separately. So, this channel is mainly for keeping these messy values, later transferring to another channel for viewing which is the (SIGFOX) TEMPERATURE PUBLIC VIEWING channel.

We use MATLAB Analysis to convert the two messy values (whole number &decimal number) into just one combined value and transfer it onto the other channel. At the same time, we also transfer the userID onto the (SIGFOX) TEMPERATURE PUBLIC VIEWING as it's used for viewing. The MATLAB script is triggered on data insertion using a ThingSpeak REACT which will be explained below.

To setup the react, first go to Apps and then select React which will open the reacts tab. Press New React to create a new react for the MATLAB Analysis to be triggered when new data arrives from the Sigfox backend. Set the condition type to string, test frequency to on data insertion, condition to field 3 (which should be your userid) of the (SIGFOX) TEMPERATURE PRIVATE VIEWING when its not equal to 0, action to MATLAB Analysis with the code for calculating the temperature and Options to Run Action only the first time condition is met.

The table code was taken from an open sourced project and modified to suit our needs. It's very useful as the table auto updates every time a new data is sent in, perfect for our usage.

Unfortunately, the MATLAB plugin for the table is only view-able in private view and not in the public view. As it's intended for administrative purposes only, we do not subject this as an issue, it's intended to be only viewed in private view.

To retrieve Webhooks information, Click on your profile logo near the top right corner of the screen on the left of the “Explore” tab. Select My Services, select Webhooks then click documentation near the top right of the web page, from there you can see your key and format for sending a request. Enter that event name. The event name for this project is fever

https://maker.ifttt.com/trigger/{event}/with/key/(example)

https://maker.ifttt.com/trigger/fever/with/key/(example)

The service can be tested to see if it works or not by pasting the URL(example of the URL are shown above) into your browser or pressing the test button upon creation of the webhooks and email applet

After all that is done, you should be able to receive an email like the following picture, after you have finished setting up the ThingSpeak React.

Contributions

Aden - RaspberryPi + Arduino + its modules + ThingSpeak (MATLAB+ Setup)

Reginald - Sigfox + ThingSpeak Data Collection + Schematics

Bo Sheng - IFTTT Setup

Код

  • [C] ARDUINO NANO
  • [PYTHON] RaspberryPi
  • [MicroPython] Sigfox (Pycom)
  • [ThingSpeak] MATLAB SCRIPT
[C] ARDUINO NANOArduino
This code is used for checking if there's a RFID card tap, if there is, there will be temperature taking and also handshaking between the Raspberry Pi to send data over like the card's ID, temperature and ready/standby signal and more.

It also uses LCD to show informative information.

If you're interested in knowing more, please read the section on "HOW IT WORKS:RaspberryPi &Arduino"
/*90% is coded from scratch by Aden,http://www.astero.methe other 10% consists of open sourced libraries(Credits found below) used, like the RFID &temperature module.*//* * Initial Author:ryand1011 (https://github.com/ryand1011) * * Reads data written by a program such as "rfid_write_personal_data.ino" * * See:https://github.com/miguelbalboa/rfid/tree/master/examples/rfid_write_personal_data * * Uses MIFARE RFID card using RFID-RC522 reader * Uses MFRC522 - Library * ----------------------------------------------------------------------------------------- * MFRC522 Arduino Arduino Arduino Arduino Arduino * Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro * Signal Pin Pin Pin Pin Pin Pin * ----------------------------------------------------------------------------------------- * RST/Reset RST 9 5 D9 RESET/ICSP-5 RST * SPI SS SDA(SS) 10 53 D10 10 10 * SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16 * SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14 * SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15*//***************** This is a library example for the MLX90614 Temp Sensor Designed specifically to work with the MLX90614 sensors in the adafruit shop ----> https://www.adafruit.com/products/1748 ----> https://www.adafruit.com/products/1749 These sensors use I2C to communicate, 2 pins are required to interface Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried/Ladyada for Adafruit Industries. BSD license, all text above must be included in any redistribution ******************/ // INCLUDE NECESSARY HEADER FILES #include #include #include #include #include #include // DEFINITION OF PINS#define RST_PIN 9 // Configurable, see typical pin layout above#define SS_PIN 10 // Configurable, see typical pin layout above#define BUZZER_PIN 7 //Pin define for Buzzer#define LED_PIN 6 //Pin define for LED #define dist_sensePin A0MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.LiquidCrystal_I2C lcd(0x27,16,2); // Calls the LiquidCrystal class and creats an instance for the LCD.// set the LCD address to 0x27 with 16 chars and 2 line displayAdafruit_MLX90614 mlx =Adafruit_MLX90614(); // Calls the Adafruit MLX90614 instance.SoftwareSerial unoSerial(2, 3); // RX, TX // Calls the SoftwareSerial instance (for Pycom communication)// GLOBAL VARIABLESboolean tapped =true; boolean confirmation =false;String GetUID(){ String card_UID=""; String card_UID_no_space =""; for (byte i =0; i  200)) // Check if there is actually a valid user infront of the machine. If no, it'll keep looping what's under. { dist_senseValue =analogRead(dist_sensePin); // Keep checking until there's a person that comes in the distance sensor's range. lcd.setCursor (0,0); lcd.print("Please take"); lcd.setCursor (0,1); lcd.print("your temperature."); // Prompt the user to take their temperature by standing infront of the machine. } digitalWrite(BUZZER_PIN, 1); digitalWrite(LED_PIN, 1); lcd.clear (); // Turns on the Buzzer and LED, at the same time, clear the LCD too. meas_temp =(float)mlx.readObjectTempC(); temp_Hbyte =floor(meas_temp); temp_Lbyte =(meas_temp - temp_Hbyte) * 100; sMeasTemp +=userID; sMeasTemp +=","; sMeasTemp +=temp_Hbyte; sMeasTemp +=","; sMeasTemp +=temp_Lbyte; // Collect the temperature data that is taken. Serial.println("TEMP"); Serial.println(meas_temp); // Transfer the temperature data through Serial Communication to the RaspberryPi. if((meas_temp>
=28) &&(meas_temp <=42)) // Check if it's a valid temperature. unoSerial.print(sMeasTemp); // If it is, send to the sigfox module for cloud storage. lcd.setCursor (0,0); lcd.print("Temperature:"); lcd.setCursor (0,1); lcd.print(" " + String(meas_temp)); // Shows the temperature of the user through the LCD screen. } else // If it's an invalid user, { lcd.setCursor(0,0); lcd.print("Error!"); lcd.setCursor (0,1); lcd.print("Invalid User."); // Tells the user that he's not a valid user and he is unable to proceed to the temperature taking phase. } rawData =Serial.readString(); commaPos =rawData.indexOf(','); userInitial =rawData.substring(0, commaPos); // Above reads the incoming rawData again and converts into a userInitial variable. if(userInitial =="0") // If the user initial sent back is 0, it means that it's an invalid temperature because the RaspberryPi is unable to process it. { lcd.clear(); lcd.setCursor (0,0); lcd.print("Error!"); lcd.setCursor (0,1); lcd.print("Invalid Temperature."); // Prompts the user it's an invalid temperature range. } Serial.println("STANDBY"); // Sends Serial that the Arduino is still processing data. задержка (1000); // Delay for 1 second. mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } }
[PYTHON] RaspberryPiPython
This code is mainly used for updating the MySQL database and also to handshake with the Arduino via Serial Communication. It plays a vital role with the Arduino in this project

If you're interested in knowing more, please read the section on "HOW IT WORKS:RaspberryPi &Arduino".
'''Coded from scratch by Aden; for the Hackster.io Sigfox competition.http://www.astero.me'''# IMPORTSimport mysql.connectorimport serialimport osimport time# METHODSdef queryConnection():cursor =conn.cursor(buffered=True) cursor.execute("USE `" + databaseName + "`") # Use the userInfo database, return cursor # DATABASE INFORMATIONhost ="localhost"user ="root"password ="password"databaseName ="smartTemp"conn =mysql.connector.connect(host=host, user=user,passwd=password)# Serial CommunicationcomPort ='ttyUSB0'baudRate =9600ser =serial.Serial('/dev/' + comPort, baudRate, timeout=0) # Set the timeout as 0 so if it doesn't read a serial, it skips.print("Confirming USB Serial Port now, please wait") connected =False# Below, is to ensure that the RaPi receives the correct COM port of the Arduino board.for x in range(2):time.sleep(2) ser.write("RAPI") # Basically, here, we're writing to the Arduino to confirm communication. if connected ==False:serialConfirmation =ser.readline().strip() =="ARDUINO" # Check if the RaPi is reading the correct COM port, whether it can read the Arduino's serial communications. print(serialConfirmation) if(serialConfirmation ==False):comPort ='ttyUSB1' connected =True else:comPort ='ttyUSB0' connected =True print(comPort) ser =serial.Serial('/dev/' + comPort, baudRate) # Re-initiates this variable again, this time without a Serial Communication timeout. Meaning, it'll try to communicate with the Arduino w/o a timeout. print("COM PORT confirmed, using " + comPort) # Print to let you know which PORT the Arduino is on.# File CreationcountFile =open("count.txt", "a++") # Creates a count file if it doesn't exist.# GLOBAL VARIABLEStapRFID =Falsecursor =queryConnection()if(os.stat("count.txt").st_size ==0):# Checks if the count.txt is empty. print("Count has not been set, setting to 1 now.") count =1else:for countNumber in countFile:count =int(countNumber) # Set the count to the last counted count. print("Count has been restored from previous session:" + str(count)) try:# Tries to create the database if it doesn't already exists. print("Creating " + databaseName + " database now..") cursor.execute("CREATE DATABASE " + databaseName) # Create a database. print("Database has been sucessfully created.") except(mysql.connector.errors.DatabaseError):# If the database already exists, it excepts here. print(databaseName + " database is already created.") # If that database is found, run this block of code instead.cursor.execute("CREATE TABLE IF NOT EXISTS `userInfo` (id int, cardID VARCHAR(9), userID VARCHAR(4), userInitial VARCHAR(8))") # Create a userInfo table if it doesn't exist.cursor.execute("CREATE TABLE IF NOT EXISTS `tempData` (id int, userID VARCHAR(4), dateMeas date, timeMeas time, tempMeasure decimal(5,2))") # Create a tempData table if it doesn't exist.while True:# Endless loop. cursor =queryConnection() # Re-establishes the query connection using the queryConnection() method. cardID =str(ser.readline().strip()) # Reads the serial line and converts it to a String, stripping any empty spaces. cursor.execute("SELECT * FROM userInfo WHERE cardID ='" + cardID + "'") # Select the userInfo table with the inputted cardID from the Arduino. items =cursor.fetchone() # Fetch one line of the table. if(items !=None):# If it's able to fetch (valid user) print(cardID) # Print out the cardID that it's currently fetching. userID =str(items[2]) # Gets the userID from the fetched line. userDetails =str(items[3] + ", " + items[2]) # Get the userDetails from the fetched line. # Get the currentDate ¤tTime. currentDate =str(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))[0:10] currentTime =str(time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()))[11:] print(items) # Print the whole item array that was fetched. (for debugging) ser.write(b'' + userDetails) # Serial communication to the Arudino. countFile.close() # Closes the count file. countFile =open("count.txt", 'w') # Makes it so it overwrites the count file with the new saved count below. tempSignal =False while(tempSignal ==False):# Keeps looping until it gets the temperature reading from the Arduino. print("Getting Temperature") tempSignal =ser.readline().strip() =="TEMP" # Read the Arudino incoming serial. tempData =float(ser.readline().strip()) # Read the Arduino incoming serial of the temperature data. print(tempData) # Prints the retrieved temperature data from the Arduino. if(tempData>=28 and tempData <=42):# Check if the temperature is of a valid range. cursor.execute("INSERT INTO `tempData`(`id`, `userID`, `dateMeas`, `timeMeas`, `tempMeasure`) VALUES (" + str(count) + ",'" + userID + "','" + currentDate + "','" + currentTime + "','" + str(tempData) + "')") # Write into the database the necessary information. conn.commit() # Commit the INSERT changes into the database. count =count + 1 # Ups the count. countFile.write(str(count)) # Update the count file with the new count. else:# If it's not a valid temperature. ser.write(b'' + "0, 0") # Serial Communication to the Arduino informing that it's invalid temperature. else:# If it's not a valid user. ser.write(b'' + ", 0") # Serial Communication to the Arduino informing that no valid cardID is found. print("Nothing found") readySignal =ser.readline().strip() =="STANDBY" # Waits for the Arduino to tell that it's ready to do it again, to read/validate data. while(readySignal ==True):# If the Arduino is ready, loop until we're able to tell him back that we're also ready for another session. ser.write(b'' + "READY") # Serial communication basically to say we're ready too. print("sending") receivedSignal =ser.readline().strip() =="RECEIVED" if(receivedSignal ==True):readySignal =False print("received") cursor.close() # Close the query connection to prevent memory leaks. conn.close() # Closes the connection to the MySQL.
[MicroPython] Sigfox (Pycom)Python
This code is mainly used to read the serial communication from the Arduino and upload the received values to the Sigfox backend

If you're interested in knowing more, please read the section on "HOW IT WORKS:Sigfox (Pycom)"
'''100% is coded by Reginald,'''from machine import UART # Tx and Rx (``P3`` and ``P4``)from network import Sigfox # Import the sigfox library from the pycom controllerimport binascii # Import the Binary to ASCII library for converting from Binary (1,0) to ASCII (readable characters)import socket # Import socket module to enable socket connection for Sigfoximport time # Import time that can be used for delaysimport pycom # Import pycom module that contains fucntions that controls the pycom deviceimport sys # Import sys module to enable exit from the pycom running programpycom.heartbeat(False)#init Sigfox for RCZ4 (Asia)sigfox =Sigfox(mode=Sigfox.SIGFOX,rcz=Sigfox.RCZ4)uart1 =UART(1, baudrate=9600) # To set the serial communcation parametersuart1.init(9600,bits=8,parity=None, stop=1, pins =('P3', 'P4'), timeout_chars=20) # To set the serial communcation parameterswhile True:try:recv=uart1.readline() # It always reads the serial communcation for any messages if recv !=None:'''If there is a message recieved from the serial communcation, it will procced to establish the sigfox connection and process the message for sending''' #print Sigfox DeviceID print(binascii.hexlify(sigfox.id())) # print Sigfox PAC number print(binascii.hexlify(sigfox.pac())) #create Sigfox socket sk1 =socket.socket(socket.AF_SIGFOX, socket.SOCK_RAW) #make thesocket blocking sk1.setblocking(False) #configure as uplink only sk1.setsockopt(socket.SOL_SIGFOX, socket.SO_RX, False) dataList =recv.decode("utf-8") #decode the received message print("dataList :%s" %(dataList)) split_val =dataList.split(",") #split the listing based on commas # eg. if receive message is 8,35,60 -> userID =8, temperature =35.60 degree celsius userID =int(split_val[0]) # assign the 1st element in the listing to userID. temp_H =int(split_val[1]) # assign the 2nd element in the listing to the whole number of the temperature. temp_L =int(split_val[2]) # assign the 3rd element in the listing to the decimal numner of the temperature. print("userID :%d temp_H :%d temp_L :%d" % (userID, temp_H, temp_L)) bData =[userID,temp_H,temp_L] # create a list print(bData) meas_temp =temp_H + (temp_L*0.01) # merge temperature values print("measure temperature :%.2f" %(meas_temp)) sk1.send(bytes(bData)) #cast the data list to bytes and send to Sigfox backend. sk1.close() #close Sigfox socket connection. time.sleep(5) #delay for 5 seconds. except KeyboardInterrupt:sys.exit() 
[ThingSpeak] MATLAB SCRIPTMATLAB
This script focuses on combining the raw data that is sent up by the Sigfox to ThingSpeak and put them together into a presentable visual state, allowing users to properly visualize the information. It also works alongside with IFTTT by triggering a webhook URL when it reaches a fever temperature, alerting user(s) via Email.

If you're interested in learning more about this code, please read the section on "HOW IT WORKS:ThingSpeak".
%% Made from scratch by Aden; for the Hackster.io Sigfox Competition.%% http://www.astero.mereadChannelID =870479; %% Channel to read.webhookTrigger ='https://maker.ifttt.com/trigger/student_fever/with/key/h10MdSGwjSPtZQ43wH-AgoiKI0pwaljBNnGUEu4Yecn';readAPIKey ='QGHINBPNJQKULBH2'; %% Channel read API Key.writeChannelID =870482; %% Channel to write.writeAPIKey ='R6NJIM8NT5A42R9N'; %% Channel write API Key.wholeNumber =thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'Fields', 1); %% Read the value from field 1 and save it to a variable.decimalNumber =thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'Fields', 2)/100;%% Read the value from field 2 and save it to a variable.userID =thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'Fields', 3);%% Read the value from field 3 and save it to a variable.display(wholeNumber, 'BEFORE') %% Display value for debugging.analyzedData =wholeNumber + decimalNumber; %% Converting the two into one whole number instead of two separate values.display(analyzedData, 'AFTER')display(userID, 'USERID')%%thingSpeakWrite(writeChannelID, analyzedData, 'Fields', 1, 'WriteKey', writeAPIKey);thingSpeakWrite(writeChannelID,'Fields',[1,2],'Values',{analyzedData,userID},'WriteKey', writeAPIKey)if(analyzedData>=38) %% Check if fever temperature. webwrite(webhookTrigger,'value1',analyzedData,'value2',userID); %% If yes, trigger the webhook and send an email of the values.end

Схема

How everything is connected together Connections for Distance Sensor for Arduino Connections for Temperature Sensor Connections for LED for Arduino Connections for RFID for Arduino Connections for LCD for Arduino Connections for Buzzer for Arduino

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

  1. Мониторинг температуры на Raspberry Pi
  2. Мониторинг температуры с помощью Raspberry Pi
  3. Сделай сам:мониторинг и регулирование температуры для домашнего пивоварения
  4. Мониторинг CO2 с помощью датчика K30
  5. Умные жалюзи
  6. Ворота бесконтактного мониторинга температуры
  7. Arduino - отправка температуры в Интернет через последовательный
  8. 8-битная библиотека портов ввода-вывода для Arduino
  9. Health Band - умный помощник для пожилых людей
  10. Smart Farming:комплексное решение IoT для мониторинга сельского хозяйства