I Video Display

The controller uno reads the signal of touch sensor to judge whether it is pressed by two persons. When two hands are placed on the disc, the LED lamp panel will be switched on. Then, LED lamp panel will rotate and play MP3 music simultaneously two seconds later. A three-dimensional heart-shaped pattern—-heart lamp will be displayed in this way.

Click to see the video

II Control Principle
Control principle: The controller uno reads the signal of touch sensor to judge whether it is touched by two persons. If so, the LED lamp panel will be switched on and MP3 music will be played. Meanwhile, the motor will be also started to make the LED lamp panel rotate. During rotation, the power is supplied through the wireless charger module. During power supply to the lamp panel, the breakover of a crystal is controlled through A0 port to control the luminance of LED lamp. The motor rotation is cont rolled with the same method. The breakover of a crystal is controlled through A0 port to con troll the motor speed.

III Circuit Diagram
1. Connect the resistor in series as shown in the figure to prevent circuit board burnout due to overcurrent the series resistance is 5Ω;
2. Control it with transistor to simply design the circuit. Meanwhile, the analog control is also possible.
3. LED lamp is in parallel connection. Pay attention to the short circuit problem during welding.
4. The distance of wireless charger shall be kept within 5 mm.
5. Supply power to the expansion board while the battery supplies the power to uno.

#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
int i = 0;
void setup () {
Serial.begin (9600);
mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module
mp3_set_volume (35);
pinMode(9, INPUT);//touch sensor
pinMode(10, INPUT);//touch sensor
pinMode(A0, OUTPUT);//LED
pinMode(A1, OUTPUT);//motor
void loop () {
if (digitalRead(9) && digitalRead(10))
analogWrite(A0, 200);
for (i = 50; i < 150; i++)
analogWrite(A0, i);
analogWrite(A1, i);
mp3_next ();
delay (15000);
analogWrite(A0, 0);
analogWrite(A1, 0);
mp3_stop ();

12V Low noise DC Motor 146RPM w/Encoder
DFRduino UNO R3 (Similar as Arduino UNO)
7.4V Lipo 2500mAh Battery (Arduino Power Jack)
Stereo Enclosed Speaker – 3W 8Ω
DFPlayer – A Mini MP3 Player For Arduino
Gravity: Digital Capacitive Touch Sensor For Arduino



Product introduction:
This is a type of wearable smart sensing and navigation device designed for the blind. Combined with the smart cane, the device can strengthen the blind’s sensing to the external world, so that the blind will not run into the barrier. The design is based on the ultrasonic principle that the bat detects the road during night flight. The blind may accurately sense the external world to walk freely as if they have recovered the vision.

Implement Instructions:
Wear the device on the hand or ankle. The device will vibrate and alarm when the blind run into the barrier in the front, so the blind can know the barrier in the front to change the direction and will not get injured because of touching the sharp objects.

Function Expansion:
In the future, SLAM topographic information model can be established through acquiring the distance data. The “navigation map for the blind” same as the mobile map can be realized through the network connection database. In addition, the blind will be guided to the destination through the language and touch pad.

DFRduino UNO R3 (Similar as Arduino UNO)
Gravity: IO Expansion Shield for Arduino V7.1
LED lamp
Vibration motor
Infrared distance sensor

Firefly Code Generator by Andy Payne
Copyright 2011 All Rights Reserved
Code Generated on 11/09/2015 21:17:31
Special thanks to Panagiotis Michalatos.
For more information visit: http://www.fireflyexperiments.com
#include “FFCasts.h”
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created
int pos = 0;
void setup() {
pinMode(2, INPUT);
pinMode(8, OUTPUT);
pinMode(6, OUTPUT);
void loop() {
int DPin2 = digitalRead(2);
if (DPin2 == 0) {
} else {


In our daily life, we only need to open the tap to get flowing water. You may not feel water crisis at all. However, water which we live on is increasingly in shortage actually, so we shall cherish every drop of water and save the water from the start. Therefore, I came up with an idea of making an interactive lamp to remind people of tightly close the tap readily.

Such lamp is triggered by human body infrared movement pyroelectric sensor. When someone passes by, the LED lamp will be switched on and emit the water dropping sound at the same time, to remind him/her to tightly close the tap in form of interactive lamp to save water.

Arduino UNO *1
Gravity: IO Expansion Shield for Arduino V7.1 *1
Gravity: Digital PIR (Motion) Sensor For Arduino *5
DFPlayer – A Mini MP3 Player For Arduino *1
SD/MicroSD Memory Card *1
Stereo Enclosed Speaker *1
Gravity: Digital LED String Lights *1
Resistance 1k *2
Jumper Wires *5

Structure Making:
The model of tap structure is downloaded from the Internet, including four parts: tap, arm, connecting rod and water dropping part. The model is directly printed after cut processing.

Spray white and silver paint on the connecting rod and tap respectively

Connect two water drops with a fine line, and glue one end of the line at the tap opening with adhesive.

For the water pipe, I bought PVC pipe and bend from a hardware store, and glue the tap and the water pipe with AB adhesive.

Base Modeling:
To achieve the complete function of tap-shaped lamp above, I designed a base to collect electronic devices such as main controller and support the tap in the meantime.

Circuit connection

Voice Materials:
Download or record part of voice materials and copy them into the TF card. The file folder in the TF card shall be named as mp3 and placed in the root directory. Mp3 file shall be also named as 4-bit number, e.g., “0001.mp3”, and placed under mp3 file folder. The Chinese or English name may be added at the rear of number if required, e.g., “0001hello.mp3” or “0001voice.mp3”.

#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
void setup() {
mp3_set_serial (Serial); //setSerial for DFPlayer-mini mp3 module
mp3_set_volume (100);
void loop() {
if (digitalRead(5)==HIGH)
{ digitalWrite(12,HIGH);
mp3_play (0001);

Power-on Test


In recent years, non-contact infrared thermometer is increasingly applied in medical treatment, environmental monitoring, home automation, automotive electronics, aviation and military field. I made a type of non-contact infrared thermometer myself here.

DFRduino Nano 3.0 (compatible with Arduino Nano: (1 pc)
Nano I/O Shield For Arduino Nano: (1 pc)
Toggle switch, 2 grades, 3 pins, SS-12F15G5 (1 pc)
I2C LCD1602 module (1 pc)
Non-contact infrared temperature sensor (1 pc)
7.4V 2500MA lithium battery (1 pc)
7.4V lithium-ion battery charger
A number of Jumper Wires
3D printer (Overlord pro)
Gray PLA, white PLA

Electrical Connection:
1. Overlay DFRduino Nano 3.0 on the expansion board of Nano I/O Shield For Arduino Nano as per corresponding pins.
2. Insert four lines of LCD 1602 module onto the I2C ports on the expansion board of Nano I/O Shield For Arduino Nano correspondingly, and connect the non-contact infrared temperature sensor with the same method.
3. As shown in the figure below, cut the positive wire of lithium battery and connect onto two pins of toggle switch respectively, and connect with the expansion board of Nano I/O Shield For Arduino Nano.

#include <Wire.h>
#include <IR_Thermometer_Sensor_MLX90614.h>
#include <LiquidCrystal_I2C.h>
IR_Thermometer_Sensor_MLX90614 MLX90614 = IR_Thermometer_Sensor_MLX90614();
LiquidCrystal_I2C lcd(0x20,16,2);
void setup() {
lcd.print(“Hello world…”);
lcd.setCursor(0, 1);

void loop() {
Serial.print(“Object = “);
Serial.println(” *C”);

Conduct structure

Model print

Measure method
This work is enabled by infrared temperature measurement module. The FOV(field of view) is determined by the temperature of the stack of 50% of the radiation signal to determine and is related to the main axis of the sensor.

Mark the size of FOV. The measured temperature is actually the temperature-weighted average of the measured object in the FOV, and only the measure accuracy is ensured only when the FOV of infrared sensor is completely covered by the measured object.


I made a low-cost conversion device to enable an ordinary multimeter to measure temperature myself.

Waterproof DS18B20 Digital Temperature Sensor for Arduino
Cheapduino (5Pcs)
Heat shrink tube, conductor and banana plug, etc.
4.7 k resistor *1

Although LZ multimeter does not have function of temperature measurement, it can be still used to measure the frequency. We can use Cheapduino to read the sensor value. Then, output corresponding frequency and show it with the display screen of multimeter.

Compared with Arduino+ LCD, its costs are much lower and it is also easy to carry.

Making Method:
Download the attached program on the plate with FPC program and matched FPC.

Weld the data sheet bus of sensor on D9 and add a 4.7 K pull-up resistor between D9 and VCC.

Weld two Dupont lines with VCC and GND for power supply.

Take two banana plugs and weld with lines, and connect another end of two plugs to GND and D10 respectively.

Switch the multimeter to the frequency (Hz) grade and power it on to test it. A few seconds later, the small white lamp on the plate will be switched on. Then, you may read the temperature smoothly. However, the unit shown is kHz. You just need to ignore the unit.

Use the heat shrink tube, and open a hole at the position where the small lamp is located on the plate.

#include <OneWire.h>

OneWire ds(9);

void setup(void) {

void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;

if ( !ds.search(addr)) {
Serial.println(“No more addresses.”);

Serial.print(“ROM =”);
for( i = 0; i < 8; i++) {
Serial.write(‘ ‘);
Serial.print(addr[i], HEX);

if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println(“CRC is not valid!”);

// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
type_s = 1;
case 0x28:
type_s = 0;
case 0x22:
type_s = 0;

ds.write(0x44,1); // start conversion, with parasite power on at the end

delay(10); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.

present = ds.reset();
ds.write(0xBE); // Read Scratchpad

for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();

unsigned int raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// count remain gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 – data[6];
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
// default is 12 bit resolution, 750 ms conversion time
celsius = (float)raw / 16.0;
Serial.print(” Temperature = “);
Serial.print(” Celsius, “);

Based on this idea, you may measure most of physical quantities with multimeter as long as you find corresponding sensor


When we drink water at ordinary times, we do not know the specific water temperature in the cup. Hence, when we get a cup of hot water in summer, the water in the cup cannot be cooled for a long time, so we cannot drink water in a short time. If there is a cup with water drinking time settable and the cup cover will be opened based on such time, we can drink water in the desired time. In winter, the hot water gets cool very soon, so we often forget to drink water. When we remember to drink water, the water in the cup will become cold. If we can real-timely know the temperature in the cup, the problems above will be avoided, so I designed the cup with the functions above.

Design Achievements:
1. The smart water cup includes two temperature sensors: one for measuring the interior temperature and one for measuring the exterior temperature, and the data will be shown on 1602 display screen.
2. The smart water cup includes two steering engines, and the opening and closing of steering engine cup cover can be controlled through the button.
3. Through the knob, the drinking time is settable on 1602 display screen, to control the cup cover opening angle through the steering engine to make the cup emit different heat and drink water in different time.
4. The temperature may be transmitted to the mobile phone real-timely through Bluetooth to allow real-time checking on the mobile phone.
5. Red, blue and white flux LED lamps can be used to represent excessively high temperature, appropriate temperature and excessively low temperature.
6. A main switch is mounted on the base to control the overall opening and closing of smart cup.

Temperature sensor × 2
1602 LCD screen × 1
Red, blue, white piranha LED lights each × 1
Analog rotary angle sensor × 1
Button x 1
Active buzzer × 1
Self-locking button × 1
180 ° steering gear x 2
7.4V battery × 1
DFRobot Bluno M3 controller × 1
Arduino expansion board × 1
Bluetooth module × 1

Making Procedure:
1. Connect each sensor and battery on the main control panel of arduino.

2. Design the cup and the cover to be placed in the cup with Solidworks.

3. Inlay the self-locking keys at the side of box.

4. Drill small holes for inlaying temperature sensor and steering engine on the original cover with perforating machine and inlay them in the holes.

5. Thread Dupont lines through the small holes respectively.

6. Fix each sensor on the cup with transparent adhesive tape at first, to design the cup body which can be fixed on the cover and fix each sensor.

7. Fix each sensor on the cup body with screws.

8. Design a cup cover which can fix the steering engine.

9. Lengthen the Dupont line with electrowelding, because the Dupont line is not long enough.

10. Inlay the original cup cover into the printed cup cover.

11. Design the support of steering engine, and bond the steering engine on the cup cover with hot melt adhesive.

12. Insert the cup and a smart cup is made.


Arduino open source hardware is used to match with PM2.5 air quality sensor and infrared CO2 sensor to make a small indoor air quality test bench.

Bluno M3 – A STM32 ARM with Bluetooth 4.0
1602 LCD Keypad Shield For Arduino
Gravity: UART Infrared CO2 Sensor (0-50000ppm)
Gravity: Laser PM2.5 Air Quality Sensor For Arduino

Bluno M3 is not a common Arduino board but is an Arduino-compatible board developed by DF based on STM32. Its advantages are low price and plenty of pin resources; however, its disadvantages are also evident. It is not compatible with ordinary Arduino board (Arduino is 8-bit computer and STM32 is 32-bit computer, so it’s normal to have partial incompatibility problem). I choose M3 because M3 has 5 UART ports, and both PM2.5 and infrared sensor are serial port equipments, which are sufficient for M3; Bluetooth is provided; at last, this board is mounted. UNO, Leonardo and Mega2560, etc. may also have the same effect.

Hardware Operation:
1. Double PH2.0 connectors are used for infrared carbon dioxide, and you should modify one as XH2.54 connector (You may also directly insert Dupont line with male & female connector but you shall fasten it).

2. Select two serial ports: Serial1 and Serial5 of Bluno M3 as UART communication port of PM2.5 and CO2 respectively. Serial1 is directly connected to PM2.5 interface on LCD, so it does not need to be changed. However, the pin header needs to be also bent for UART5 to make convenience for insertion.

3. Connect lines based on drawing

#include <Arduino.h>
#define LENG 31 //0x42 + 31 bytes equal to 32 bytes
unsigned char buf[LENG];
unsigned char hexdata[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; //Read the CO2 gas density command /Don’t change the order
long hi, lo, CO2;
int PM2_5Value = 0; //define PM2.5 value of the air detector module

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // select the pins used on the LCD panel

void setup()
Serial1.begin(9600); //PM2.5 串口1
Serial5.begin(9600); //CO2 串口5 使用UNO和Leonardo的童鞋可以用软串口
Serial1.setTimeout(1500); //设置超时时间为1500毫秒(大于传感器传送数据周期1秒)
lcd.begin(16, 2); // LCD 初始化

void loop()

//CO2 value
Serial5.write(hexdata, 9);

for (int i = 0, j = 0; i < 9; i++)
if (Serial5.available() > 0)

int ch = Serial5.read();

if (i == 2) {
hi = ch; //High concentration
if (i == 3) {
lo = ch; //Low concentration
if (i == 8) {
CO2 = hi * 256 + lo; //CO2 concentration


if (Serial1.find(0x42)) { //检测到0x42时,开始读取
Serial1.readBytes(buf, LENG);

if (buf[0] == 0x4d) {
if (checkValue(buf, LENG)) {
PM2_5Value = transmitPM2_5(buf); //count PM2.5 value of the air detector modul

// LCD显示

static unsigned long OledTimer = millis();
if (millis() – OledTimer >= 1000)
OledTimer = millis();

lcd.setCursor(0, 0); // set the LCD cursor position

lcd.print(“PM2.5: “);
lcd.println(” ug/m3 “);
lcd.setCursor(0, 1); // set the LCD cursor position
lcd.print(“CO2: “);
lcd.print(” PPM “);


char checkValue(unsigned char *thebuf, char leng)
char receiveflag = 0;
int receiveSum = 0;

for (int i = 0; i < (leng – 2); i++) {
receiveSum = receiveSum + thebuf[i];
receiveSum = receiveSum + 0x42;

if (receiveSum == ((thebuf[leng – 2] << 8) + thebuf[leng – 1])) //check the Serial1 data
receiveSum = 0;
receiveflag = 1;
return receiveflag;

//transmit PM Value to PC
int transmitPM2_5(unsigned char *thebuf)
int PM2_5Val;
PM2_5Val = ((thebuf[5] << 8) + thebuf[6]); //count PM2.5 value of the air detector module
return PM2_5Val;

After successful uploading, PM2.5 data will be provided 15 s later. The indoor air is good, but the concentration of carbon dioxide is a little high (If the concentration of carbon dioxide is 65536 from the start, press the reset button at first).

The PM2.5 concentration of Shanghai on the day is as shown in the figure below, dropping from 190 to 180 in the morning.

Summary: PM accuracy is OK, except that CO2 concentration is high. After several breaths, it reaches 30000 above. NDIR testing method is a little slow in respect of response speed. Although the official website provides 90s, but it is still slow.