Monitoramento de temperatura SMART para escolas
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 |
Aplicativos e serviços online
| ||||
| ||||
| ||||
| ||||
| ||||
|
Sobre este projeto
DECLARAÇÃO DE PROBLEMA
Na Ásia, devido ao clima quente e ao surto de síndrome respiratória aguda grave (SARS) em 2003, os alunos do ensino fundamental e médio precisam realizar medições de temperatura a cada trimestre para garantir o bem-estar dos alunos. Sempre que houver um exercício de medição de temperatura agendado pela escola, os alunos são obrigados a trazer seu próprio termômetro digital para este exercício. No entanto, alguns alunos podem não ser capazes de participar durante o exercício devido a motivos como termômetro extraviado ou danificado e esquecimento de trazer o dispositivo. Devido à higiene pessoal, os alunos não podem compartilhar seus termômetros e podem não ter dinheiro suficiente para comprar uma nova peça. Conseqüentemente, afeta a taxa de sucesso do exercício de medição da temperatura. Após o exercício de medição de temperatura, a equipe terá que inserir manualmente todos os dados de temperatura dos alunos e os dados específicos dos alunos no banco de dados. A tarefa é muito entediante e demorada, pois cada professor do formulário precisará realizar entradas para cerca de 40 alunos.
Qual é a solução?
O tema do nosso projeto é Impacto Social da SqwidNet, e na área de Boa saúde e bem-estar no Objetivo de Desenvolvimento Sustentável (ODS). A razão para isso é porque nosso sistema é capaz de implantar para medir automaticamente a temperatura de usuários válidos para que sua temperatura possa ser monitorada e um alerta seja enviado sempre que ultrapassar um determinado nível de limite.
COMO FUNCIONA:RaspberryPi e Arduino
O RaspberryPi contém um programa Python e o banco de dados MySQL.
Ao iniciar o Programa Python, ele verifica automaticamente se o banco de dados já foi criado, caso contrário, será criado automaticamente. As tabelas internas também serão verificadas e criadas automaticamente, se necessário. Isso reduz o trabalho manual de professores / equipes administrativas na escola.
Em seguida, ele estabelece uma conexão de consulta para verificar o banco de dados e aguarda o Arduino enviar as informações relevantes por meio da porta de comunicação serial.
Ao ter um cartão RFID tapado no Arduino, as informações do cartão são armazenadas no Arduino, enviadas para o RaspberryPi via Comunicação Serial. Em seguida, o RaspberryPi confirma com o banco de dados que o referido cartão é um usuário válido e, se for, envia para o Arduino confirmando e o Arduino exibe "Bem-vindo, nome" na tela LCD. Se não for um usuário válido, apenas dirá "Erro! Usuário inválido!".
Digamos, agora, que temos um usuário válido que acabou de tocar. Em seguida, o Arduino solicitará que o usuário meça a temperatura. Um sensor de distância detectará se o usuário está pronto para medir sua temperatura. Se estiverem, ele medirá a temperatura e emitirá a temperatura na tela LCD. Se for uma temperatura válida (28 * C - 42 * C), esta informação será enviada tanto para o RaspberryPi (MySQL) quanto para o Sigfox (ThingSpeak) para armazenamento de dados. O banco de dados MySQL armazenaria o ID do usuário, data, carimbo de data / hora e a temperatura de cada tomada.
Ao receber os dados de temperatura do Arduino, o RaspberryPi verifica constantemente se a temperatura foi fornecida corretamente antes de prosseguir com qualquer outra coisa. Isso ocorre porque, se o programa Python verificar apenas uma vez os dados de temperatura, eles podem não ter sido enviados ainda pelo Arduino, porque ambos os códigos são executados em tempos diferentes. Portanto, para sincronizar, verificamos constantemente os dados de temperatura no código Python antes de prosseguir com o resto do programa.
NOTA: Tanto o código Python do RaspberryPi quanto o código Arduino utilizam um método de sincronização chamado handshaking. Se o RaspberryPi não estiver pronto para receber outras informações de temperatura / usuário, o Arduino não permitirá que o usuário toque no cartão, vice-versa .
Uma maneira simples de fazer isso é enviar constantemente um sinal de "PRONTO" até que a outra parte envie de volta um sinal de "RECEBER" para que saibam que os dois estão prontos.
Arduino -
boolean readySignal =Serial.readString () =="READY";
if (readySignal)
{
tocado =verdadeiro;
Serial.println ("RECEBIDO");
}
Python -
while (readySignal ==True):
ser.write (b '' + "READY")
receiveSignal =ser.readline (). strip () =="RECEIVED"
if (receivedSignal ==True):
readySignal =False
Lembre-se de fechar sua conexão de consulta sempre que terminar de fazer uma consulta! Isso é para eliminar qualquer possível vazamento de memória e é uma boa prática em geral.
COMO FUNCIONA:Sigfox (SiPy)
Depois de receber os dados de temperatura do Arduino, o SiPy separará a ID do usuário e a temperatura em números inteiros e casas decimais. Depois de fazer isso, todos os dados são enviados para o backend Sigfox por meio de bytes (para que possam ser enviados para Ubidots, bem como ThingSpeak) e deve ser semelhante à imagem a seguir.
Depois de receber isso, o backend Sigfox irá recodificar esses dados para serem enviados ao ThingSpeak para serem armazenados. O seguinte mostrará como codificar o back-end para enviar dados para o Thingspeak.
No Sigfox Back-end em tipo de dispositivo> Nome do dispositivo> CALLBACKS, você precisará inserir o payload personalizado exatamente como ele é a menos que você tenha alterado a codificação no SiPy, pois a carga útil personalizada definirá o que é recebido primeiro como o ID do usuário, por exemplo, se você enviar a temperatura primeiro, no backend ele converterá essa temperatura para o ID do usuário em vez de temperatura. No corpo, a chave da API de gravação precisa ficar no topo, enquanto os campos podem ser colocados com qualquer um dos dados personalizados que você criou na carga útil personalizada.
COMO FUNCIONA:a nuvem
Depois que os dados são enviados com sucesso para o ThingSpeak, ele primeiro os recebe em um canal de exibição privado, onde um script de análise MATLAB analisa os dados e combina os dados de temperatura em um valor em vez da separação de um valor numérico inteiro e um valor decimal.
O código da tabela foi retirado de um projeto de código aberto e modificado para atender às nossas necessidades. É muito útil porque a tabela é atualizada automaticamente sempre que um novo dado é enviado, perfeito para nosso uso.
Ao mesmo tempo, verifica se a temperatura está em um nível perigoso (febre), caso esteja, será enviado um e-mail para avisar os funcionários / professores.
Em resumo, o primeiro canal que tem o valor da temperatura separado em número inteiro e número decimal é um canal de backend, não realmente para visualização. Para o segundo canal, os valores de temperatura foram combinados e simplificados para a equipe / gerenciamento / administradores verem e tem uma tabela semelhante ao Excel para fácil análise de dados.
1. Configuração das conexões do Arduino Nano
Para o Arduino Nano, aqui estão as conexões que fizemos com nossos módulos.
Nano e Uno têm a mesma pinagem.
RFID - RC522
SDA D10
SCK D13
MOSI D11
MISO D12
IRQ NÃO CONECTADO
GND GND
RST D9
3,3V 3,3V
Como testar RFID
LCD
SDA A4
SCL A5
GND GND
5V 5V
Como testar o LCD I2C
Sensor de distância
5V 5V
GND GND
Entrada A0
Como testar o sensor de distância infravermelho Sharp
Buzzer
GND GND
Saída D6
Como testar o Buzzer
Sensor de temperatura IR
SDA A4
SCL A5
GND GND
5V 5V
Como testar o sensor de temperatura infravermelho,
LED
Lado plano (cátodo) GND
Lado não plano (ânodo) D7
Bom! Para as conexões do Arduino, você deve estar pronto para ir agora.
2. Configuração do RaspberryPi
Existem basicamente duas coisas que precisam ser instaladas em sua máquina Raspberry Pi 3,
1 Operação Raspbian Sistema -
A instalação do sistema operacional Raspbian é considerada bastante simples.
Uma resposta curta sobre como fazer isso seria piscar (gravar) um arquivo de imagem em um cartão SD e encaixar esse cartão SD no Raspberry Pi 3.
No entanto, se você está procurando um tutorial de resposta passo a passo, veja como fazê-lo -
Em primeiro lugar, você deve baixar um software que permite que você grave arquivos.img em uma unidade de armazenamento. Você pode usar o software chamado balenaEtcher.
Depois, vá para a página Raspberry Pi - Raspbian e escolha um que se adapte às suas necessidades. Escolhi o "Raspbian Buster com Desktop e software recomendado" porque como o nome diz, ele vem com o software recomendado e isso evita o incômodo extra de baixar softwares.
Assim que terminar com as etapas mencionadas, basta iniciar o software balenaEtcher. Esta etapa é bastante autoexplicativa:Selecione a imagem (seu arquivo.img Raspbian), selecione seu cartão SD e pressione flash. Agora, você só precisa esperar. Uma vez feito isso, você deve aparecer e agora você pode inserir o cartão SD recém-disparado em seu Raspberry Pi.
Em seguida, conecte sua máquina Raspberry Pi via HDMI a um monitor e faça a configuração inicial. Por último, vá para Preferências -> Configuração do Raspberry Pi e você deve estar neste menu -
Siga as opções, este passo habilita interfaces como SSH, VNC que permite conectar a endereços ip via eth0 ou wlan0 (então você não precisa mais do cabo HDMI, você pode fazer tudo via SSH).
(etapa opcional) - Eu abro o terminal e edito o arquivo dhcpcd.conf (sudo nano /etc/dhcpcd.conf) e adiciono essas linhas de comando,
interface eth0
ip_address estático =192.168.0.11 / 24
O acima me permite conectar ao Raspberry Pi por meio de um cabo Ethernet com o endereço estático, 192.168.0.11, então eu sei sempre que esse é o endereço do meu Raspberry Pi.
Esta é uma etapa opcional porque, uma vez que você estiver conectado ao WiFi, você ganhará um endereço ip wlan0 que permite que você se conecte ao Raspberry Pi sem um cabo Ethernet e em qualquer lugar do local, desde que você esteja conectado ao mesmo Wi-fi. Para ver qual é o seu ENDEREÇO IP wlan0, simplesmente passe o mouse sobre o símbolo WiFI localizado no canto superior direito e ele o indicará.
Legal! Você concluiu a configuração inicial do Raspberry Pi!
3. Configuração do banco de dados MySQL
Eu consideraria esta etapa um pouco difícil, especialmente a parte onde você tem que configurar o usuário root do MySQL, siga-a cuidadosamente porque é muito difícil retificar quaisquer erros.
Primeiro, você deve certificar-se de que seu sistema esteja atualizado e atualizado com o firmware mais recente. Você pode ter certeza inserindo esses comandos,
atualização do sudo apt
atualização do apt sudo
Depois de fazer isso, você instalará o apache2.
sudo apt install apache2
O Apache2 permitirá que você crie um servidor web para que possa acessar os sites que criar posteriormente.
Assim que o apache2 estiver instalado, você precisa instalar o PHP.
sudo apt install php php-mbstring
PHP permitirá que você crie e veja seus próprios sites PHP.
Vamos parar e ver se tudo que você acabou de instalar está funcionando, simplesmente digite o IP do seu Raspberry Pi no seu navegador da web ou "localhost" se você ainda estiver conectado via HDMI e deverá ver uma página de índice do Apache.
Agora, você precisará instalar o banco de dados. Para isso, você usará MySQL e mariadb.
sudo apt install mariadb-server php-mysql
IMPORTANTE - Certifique-se de ler o que segue abaixo com muito cuidado.
Agora, você criará seu usuário root do MySQL para que possa usá-lo para acessar o banco de dados.
sudo mysql --user =root
Agora você entrará em uma sessão MySQL onde poderá digitar códigos MySQL, digite-os linha por linha (você pode substituir a senha por sua própria senha)
DROP USER 'root' @ 'localhost';
CRIAR USUÁRIO 'root' @ 'localhost' IDENTIFICADO POR 'password';
CONCEDER TODOS OS PRIVILÉGIOS ON *. * TO 'root' @ 'localhost' COM OPÇÃO DE GRANT;
FLUSH PRIVILEGES;
exit;
Agora você pode testar seu usuário root do MySQL fazendo login;
mysql --user =root --password =yourmysqlpassword
Se tudo funcionar, agora você pode instalar o PHPMyAdmin, o Painel de Controle do Administrador para você acessar (visualizar) e modificar o banco de dados MySQL.
sudo apt install phpmyadmin
(após a instalação)
sudo phpenmod mysqli
sudo /etc/init.d/apache2 restart
Parabéns! Agora você pode acessar seu banco de dados recém-criado usando http:// your_raspberrypi_ip_address / phpmyadmin.
4. Guia de configuração e software da placa de expansão SiPy 2.0
Em primeiro lugar, você precisará inserir o módulo SiPy na placa de expansão com o botão de reinicialização voltado para o conector USB e deve clicar firmemente no lugar com os pinos não mais visíveis.
Fonte:Documentação Pycom
Depois de fazer isso, você precisará atualizar o firmware no SiPy, para que possa carregar e executar programas, bem como obter o ID do dispositivo Sigfox e o número do PAC que serão usados para registrar-se no back-end do Sigfox. Baixe o atualizador de firmware de acordo com o sistema operacional (sistema operacional) que você está usando.
- Windows
- macOS (10.11 ou superior)
- Linux (requer
diálogo
epython-serial
pacote)
Depois de baixar a atualização do firmware da pycom, ao iniciar o atualizador pela primeira vez, as imagens a seguir ocorrerão apenas uma vez portanto, certifique-se de selecionar a região Sigfox correta, placa.
Siga as instruções na atualização do firmware cuidadosamente, pois pode fazer com que seu Sigfox não funcione corretamente como o ID do dispositivo Sigfox e o número PAC sendo todos "F" (como abaixo) em vez de uma mistura entre números e alfabetos.
b 'FFFFFFFF'
b 'FFFFFFFFFFFFFFFF'
Assim que o firmware tiver sido atualizado, você precisará baixar o Visual Studio Code e instalar a extensão Pymkr, bem como nodejs, antes de começar a enviar e executar programas no SiPy.
Em primeiro lugar, você precisará criar uma nova pasta para salvar todos os arquivos que irá enviar para o SiPy mais tarde ou apenas para armazenar todos os programas que irá executar. Pressione o arquivo no canto superior esquerdo e pressione Abrir pasta ou Ctrl + K + O, em seguida, selecione onde deseja colocar esta pasta e clique com o botão direito para criar uma nova pasta. Depois disso, crie um novo arquivo ou Ctrl + N para abrir um novo arquivo. Depois de criar um novo arquivo, você precisará salvar o novo arquivo como um python e alterar o salvar como tipo para arquivo python para que o código possa ser executado no SiPy mais tarde e salvá-lo na nova pasta que você criou.
Nota: O nome do arquivo pode ser qualquer coisa como Teste, Teste, etc. .
Para apenas executar seu código sem carregá-lo no Módulo Sipy, tudo o que você precisa fazer é pressionar o botão Executar localizado na parte inferior do programa. O upload próximo a ele carrega a pasta atual para o Módulo SiPy. Tenha cuidado ao usar os loops while 1, pois depois de carregados no Módulo SiPy, a única maneira de acessar o Módulo SiPy novamente é por FTP no flash e remover o arquivo main.py do SiPy Módulo.
Se você acidentalmente adicionou um loop while infinito, não há necessidade de se preocupar, pois você ainda pode enviar seu programa ou remover o anterior por FTP. Em primeiro lugar, vá e baixe a versão gratuita do filezilla e instale-o.
Após a instalação, você precisará configurar a conexão. Em primeiro lugar, abra o filezilla e vá para o gerenciador do site que está no arquivo ou pressione Ctrl + S e pressione novo site.
Você pode renomear o site para SiPy ou o que quiser para chamar esta conexão e alterar as configurações de criptografia para Usar apenas FTP simples (inseguro) e transferir as configurações para passivas e limitar o número de conexões ativas a 1
Você pode encontrar o Host (endereço), Usuário e Senha por meio do Código do Visual Studio pressionando todos os comandos e selecionando a configuração global. Isso mostrará as configurações padrão de Host (endereço), Usuário (nome de usuário) e senha. Isso pode ser alterado pressionando as configurações do projeto em todos os comandos.
Em seguida, você precisará saber o SSID do Módulo SiPy, que pode ser encontrado usando todos os comandos e pressionando obter WiFI AP SSID. Cada SSID do Módulo SiPy será único, mas a senha é a mesma e não pode ser alterada. A senha para SSID do Módulo SiPy é www.pycom.io
Nota: Os usuários de desktop precisarão de um adaptador WiFi
Agora você pode começar a usar o filezilla para acessar o SiPy Flash! Em primeiro lugar, conecte-se ao SSID SiPy, depois vá ao gerenciador do site filezilla, conecte-se ao novo site que você criou e digite a senha. Agora abra a pasta flash e exclua main.py APENAS! Após excluir o main.py, reinicie o SiPy e você pode começar a executar / enviar seus programas.
Nota: Você pode querer copiar a pasta flash para o seu sistema operacional (sistema operacional), caso você exclua tudo.
5. Registrando com Sigfox Backend
Depois de instalar o Visual Studio Code, conecte a placa de extensão pycom ao computador e ela detectará automaticamente a conexão quando você abrir o Visual Studio Code. Copie o código abaixo e cole-o no terminal ou em um arquivo e execute-o. Qualquer um dos métodos servirá.
from network import Sigfox
import binascii
# inicializar Sigfox para RCZ * (você pode precisar de uma região RCZ diferente)
sigfox =Sigfox (mode =Sigfox .SIGFOX, rcz =Sigfox.RCZ *)
# print Sigfox Device ID
print (binascii.hexlify (sigfox.id ()))
# print Número Sigfox PAC
imprimir (binascii.hexlify (sigfox.pac ()))
Nota :Substitua * pelo número da região RCZ.
Método de terminal para obter o ID do dispositivo Sigfox e o número do PAC
Para abrir o terminal no Visual Studio Code Pressione Ctrl + ~. Em seguida, cole o código dentro e ele aparecerá como a imagem a seguir.
Método de arquivo para obter o ID do dispositivo Sigfox e o número do PAC
Assim que o novo arquivo for salvo pressionando Ctrl + S ou indo para o arquivo e salve, cole o código no arquivo e salve o arquivo, então você pode executar o arquivo pressionando o botão Executar na parte inferior da tela e deve ser o mesmo da imagem abaixo.
Depois de obter o ID do dispositivo Sigfox e o número do PAC, você precisará registrar o Sigfox no back-end do Sigfox antes de começar a transmitir para ele. A primeira página que você verá será a sede da sua empresa sigfox. Você deve escolher o país no qual este dispositivo Sigfox será usado, pois cada uma das Zonas Sigfox está configurada de forma diferente.
Depois de escolher o país correto, a próxima página exigirá seu Sigfox Device ID e número PAC que você obteve no início deste capítulo. Cole-os no campo correto e a página deve se parecer com a imagem explodida. Quanto ao resto, preencha de acordo.
Depois de preencher a página do dispositivo, crie uma conta Sigfox ou faça login em uma conta Sigfox existente, você deve registrar o Sigfox em sua conta. Se você estiver criando uma nova conta Sigfox, Sigfox enviará um e-mail para o e-mail registrado para configurar a senha.
Depois de configurar sua conta de back-end sigfox, você pode executar este código para enviar alguns dados para ver se o back-end pode recebê-los.
Nota **: Conecte sua antena sigfox primeiro antes de executar qualquer programa sigfox.
from network import Sigfox
import socket
# inicializar Sigfox para RCZ * (você pode precisar de uma região RCZ diferente)
sigfox =Sigfox (mode =Sigfox .SIGFOX, rcz =Sigfox.RCZ *)
# criar um socket Sigfox
s =socket.socket (socket.AF_SIGFOX, socket.SOCK_RAW)
# faça o bloqueio de socket
s.setblocking (True)
# configure-o apenas como uplink
s.setsockopt (socket.SOL_SIGFOX, socket.SO_RX, False)
# enviar alguns bytes
s.send (bytes ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]))
Nota :Substitua * pelo número da região RCZ.
6. Configurando a nuvem
Em primeiro lugar, você terá que configurar o IFTTT para envio por e-mail, ir ao site do IFTTT e criar uma conta. Após configurar a conta e fazer login, vá para o seu perfil que está localizado próximo ao canto superior direito da tela no lado esquerdo de “Explorar” e pressione o botão Criar .
Clique em " Isto " and then search for Webhooks and press it. 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 caixa
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 canal.
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ódigo
- [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 ("Temperatura:"); 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. atraso (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 projectIf 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 backendIf 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
Esquemas
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 ArduinoProcesso de manufatura
- Monitoramento de temperatura no Raspberry Pi
- Monitorando a temperatura com Raspberry Pi
- DIY:Monitoramento e regulação de temperatura para HomeBrew
- Monitoramento de CO2 com Sensor K30
- Smart Blinds
- Porta de monitoramento de temperatura sem contato
- Arduino - Enviar temperatura para a Web via serial
- Biblioteca de portas IO de 8 bits para Arduino
- Health Band - Um Assistente Inteligente para Idosos
- Agricultura inteligente:uma solução abrangente de IoT para monitoramento agrícola