The SmartMe lab is located at the Engineering building of the University of Messina, in Messina, Italy.
Its main goal is to provide a simple testbed of a smart city, mainly focusing on smart environment application scenarios. To this purpose, 6 nodes have been equipped and made available to students for practising in these contexts. These nodes can be framed into the MCU (Arduino) + MPU (Raspberry Pi) category: 5 out of 6 combine an Arduino Uno with a Raspberry Pi 3 b+, the last node is a combo board developed by a spinoff company (SmartMe.io), Arancino, which combines in the same board an Arduino-like MCU (based on an ARM Cortex M0+ @48MHz) and a Raspberry Pi 3 compute module. In this section, we will focus on the 5 pure Arduino nodes and their sensors and actuators.
To approach this laboratory, the student should grasp:
4 Arduino nodes are Internet-connected by a router through ETH, while the 5th is reachable only by the IoT gateway (RaspPi). The Lab configuration is shown in the figure below
Each node is equipped with either a DHT11 or DHT22 sensor and a PMS7003 sensor. The DHT sensors allow measuring temperature and relative humidity, while the PMS7003 sensor allows measuring the air quality through the PMx concentration.
Parameter | DHT11 | DHT22 |
---|---|---|
Operating Voltage | 3 to 5V | 3 to 5V |
Operating Current | 0.3mA (measuring) 60uA (standby) | 0.3mA (measuring) 60uA (standby) |
Humidity Range | 20-80% / 5% | 0-100% / 2-5% |
Temperature Range | 0-50°C / ± 2°C | -40 to 80°C / ± 0.5°C |
Sampling Rate | 1 Hz (reading every second) | 0.5 Hz (reading every 2 seconds) |
Body size | 15.5mm x 12mm x 5.5mm | 15.1mm x 25mm x 7.7mm |
Advantage | Ultra low cost | More Accurate |
Resolution | 16-bit Temperature and Humidity | 16-bit Temperature and Humidity |
Accuracy | ±1°C and ±1% | ±0.5°C and ±1% |
Sampling period | 1 second | 2 second |
Price | $1 to $5 | $4 to $10 |
Some nodes of the lab are equipped with “MIKROE-2818 DHT22 2 click” sensors. This sensor feature ultra-small size, low-power consumption, data signal transmission distance up to 20mts, and good measuring accuracy [1]. The sensing part is the CM2322, which uses a capacitive humidity sensor and a thermistor to measure the surrounding air. Typical temperature accuracy is ±0.3°C, while relative humidity accuracy is 2% RH. The humidity and temperature measurement are compensated by some calibration coefficient, which is saved in the OTP memory of an integrated MCU. The integrated MCU also provides I2C or 1Wire interface, selectable by the onboard SMD jumper selectors. The operating voltage can also be selected by the onboard SMD jumper [2]. As shown in the previous figure, the 1Wire mode was chosen while the operating voltage is 5V. The sensor is connected to pin 8 of Arduino Uno.
The PMS7003 consists of a digital and universal particle concentration sensor, which can be used to obtain the number of suspended particles in the air, i.e. the concentration of particles, and output them in the form of a digital interface. The working principle of such a sensor consists into produce scattering by using a laser to radiate suspending particles in the air, then collect scattering light to a certain degree, and finally obtain the curve of scattering light change with time. In the end, the equivalent particle diameter and the number of particles with different diameters per unit volume can be calculated [3]. So, the values of PM1.0, PM2.5, and PM10, will be available for our scopes. In order to physically interface the 10 bus lines of the sensor with Arduino Uno, the PMS7003 connector shown in the previous figure was employed [4]. By supplying the adapter at 5V, the particle sensor will operate correctly and the data will be available at RX and TX pins. However, the serial voltage level is 3.3V typical, while Arduino Uno needs 5V. For this reason, a bi-directional level converter was introduced [5]: by supplying the HV (High Voltage) side at 5V and the LV (Low Voltage) side at 3.3V, the serial levels will be correct on both sides (Arduino at 5V, PMS7003 at 3.3V). Since is not possible to deploy the code by using, at the same time, the default RX, TX pins (0,1) of Arduino Uno, the PMS7003 is connected to pins 9 and 10: by using the <SoftwareSerial.h> library, such pins can be used as RX and TX of Arduino Uno, respectively.
[1]https://www.mouser.it/new/mikroelektronika/mikroelektronika-mikroe-2818-dht22-2-click/
[2]http://www.farnell.com/datasheets/2618831.pdf
[3]https://download.kamami.com/p564008-p564008-PMS7003%20series%20data%20manua_English_V2.5.pdf
[4]https://kamami.com/others/564553-adapter-from-127mm-pitch-to-254mm-for-pms7003.html
[5]https://kamami.com/voltage-level-converters/234535-logic-level-converter-bi-directional.html
There are no mechanical actuators in this laboratory. Each node is equipped with a 2×16 LCD screen and with an RGB led, but it is possible to use only the green light component. The green led of the RGB is connected to the Arduino pin 3. Since such a pin supports the PWM, the led brilliance can be set. Moreover, the led can be used for blinking or to indicate when a threshold is reached. The 2×16 LCD is a Displaytech 162B based on the HD44780 standard. Such standard means that the display supports almost all characters of the ASCII character table. Therefore, it is possible to display the most important characters. The display controller, which is integrated into the display, can generate these characters and send them to the matrix. In addition to the already 208 known characters, it is also possible to draw any other characters and signs. The display controller handles most of the operations, so the code for the microcontroller is very short [6]. Both 8 bit or 4-bit mode can be used to drive the display. The <LiquidCrystal.h> library supports the 4 bit communication. As shown in the figure, the Arduino Uno pins 5, 4, 13, 2 are used for the 4 bit communication (display pins 13, 14, 15, 16), while the Arduino Uno pins 7, 6 are used for the RS (Register Select) and for the E (Enable) (display pins 8, 6). The not used display data pins (9, 10, 11, 12) are simply not connected. The other display pins are used for the power supply (1,2) and to control the display light via the potentiometer (3,4). The display R/W pin (7) is simply connected to GND since only the write operation is required.
[6] https://www.aeq-web.com/atmega328-4bit-16x2-lcd-display-amtel-studio-c/?lang=en
Each node is equipped with a Breadboard Power Supply Module MB120. The MB102 is able to provide up to 700 mA, with a voltage of 3.3V and/or 5V. It can be supplied with an external DC power supply, in the range of 6.5 - 12V. The required voltage can be selected by properly choice the onboard jumper position. Both 3.3V and 5V are required in the project.
The following libraries are required to run the example proposed below for the hands-on labs:
LCD display requires a dedicated library. Of course, you can control it on the low-level programming, but we suggest using a library first. As there are many universal libraries, and many of them are incompatible with this display, we strongly recommend using "Liquid Crystal Library for Arduino". The LCD control library can be imported to the source code via:
#include <LiquidCrystal.h>
Then configure your LCD controller:
// initialize the library with the numbers of the interface pins LiquidCrystal lcd(7, 6, 5, 4, 13, 2);
DHT11 and DHT22 sensors require some dedicated library. We strongly recommend using the “DHT sensor library” version 1.3.0, which is not the last version available on the repository. DHT sensor library depends on the “Adafruit Unified Sensor”, so it is mandatory to include this library. The DHT sensor library can be imported to the source code via:
#include <DHT.h>
Configure your DHT sensor:
#define DHTPIN 8 // Digital pin connected to the DHT sensor // Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // Initialize DHT sensor. DHT dht(DHTPIN, DHTTYPE);
PMS sensor requires a dedicated library. The Arduino library for Plantower PMS sensors, also “PMS” library, supports PMS x003 sensors (1003, 3003, 5003, 6003, 7003). The PMS sensor library can be imported to the source code via:
#include "PMS.h"
The PMS sensor is connected to pins 9 and 10: by using the <SoftwareSerial.h>
library, such pins can be used as rx and tx of Arduino Uno, respectively.
#include <SoftwareSerial.h> SoftwareSerial mySerial(9,10); // Arduino Rx and Tx ports
Arduino Ethernet Shield requires a dedicated library. With the Arduino Ethernet Shield, the Ethernet.h
library allows an Arduino board to connect to the Internet.
The Arduino Ethernet Shield library can be imported to the source code via:
#include <Ethernet.h>
Then configure your Ethernet Shield:
// Enter a MAC address and IP address for your controller below. byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF}; byte ip[] = {192, 168, 0, 99}; // <- change to match your network
MQTT connectivity protocol requires a dedicated library. The MQTT.h
library uses the Arduino Ethernet Client API for interacting with the underlying network hardware. This library provides a client for doing simple publish/subscribe messaging with a server that supports MQTT.
The Arduino Ethernet Shield library can be imported to the source code via:
#include <MQTT.h>
The Project configuration file is named platformio.ini.
[env:uno] platform = atmelavr board = uno framework = arduino lib_ldf_mode=deep+ lib_compat_mode=strict lib_deps = DHT sensor library@1.3.0 Adafruit Unified Sensor@1.0.3 Ethernet@2.0.0 MQTT@2.4.3 PMS@1.1.0 lib_deps_external = https://github.com/arduino-libraries/LiquidCrystal.git#1.0.7
The user can connect and program the controller of each node by using the Distancelab environment by booking it for the time he needs. The user can use the MQTT protocol. MQTT stands for Message Queuing Telemetry Transport.
MQTT is a machine-to-machine (M2M) connectivity protocol usable for “Internet of Things” solutions. MQTT is a simple messaging protocol, designed for constrained devices with low-bandwidth. So, it’s the perfect solution for Internet of Things applications.
This publish/subscribe messaging pattern requires a message broker. The broker is responsible for distributing messages to interested clients based on the topic of a message. So a client must connect to a broker in order to:
At the same time, only one user can program the controller. But all users connected to the Distancelab MQTT broker can read the values if they are being transmitted over MQTT.
gmerlino@unime.it, rdipietro@unime.it