Ultimate Guide For Arduino Sensors And Modules
User Manual:
Open the PDF directly: View PDF .
Page Count: 164
Download | |
Open PDF In Browser | View PDF |
Download other RNT products Random Nerd Tutorials is an online resource with electronics projects, tutorials and reviews. Creating and posting new projects takes a lot of time. At this moment, Random Nerd Tutorials has more than 200 free blog posts with complete tutorials using open-source hardware that anyone can read, remix and apply to their own projects: http://randomnerdtutorials.com To keep free tutorials coming, there’s also paid content or as I like to call “Premium Content”. To support Random Nerd Tutorials you can download Premium content here. Check all our products below. Arduino Step-by-step Projects Course This is a step-by-step course to get you building cool Arduino projects even with no prior experience! This Arduino course is a compilation of 25 projects divided into 5 Modules that you can build by following clear step-by-step instructions with schematics and downloadable code. Click the figure below to check out the course. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 2 Home Automation Using ESP8266 (3rd Edition) Home Automation Using ESP8266 (3rd Edition) is my step-by-step guide designed to help you get started with this amazing WiFi module called ESP8266. This eBook contains all the information you need to get up to speed quickly and start your own venture with the ESP8266 applied to Home Automation! Read full product description. Learn ESP32 with Arduino IDE This is a practical course where you’ll learn how to take the most out of the ESP32 using the Arduino IDE. This is our complete guide to program the ESP32 with Arduino IDE, including projects, tips, and tricks! Read product description. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 3 Build a Home Automation System for $100 Learn Raspberry Pi, ESP8266, Arduino and Node-RED. This is a premium step-by-step course to get you building a real world home automation system using open-source hardware and software. Read full product description. Android Apps for Arduino with MIT App Inventor 2 Android Apps for Arduino with MIT App Inventor 2 is a practical course in which you’re going to build 8 Android applications to interact with the Arduino. Read full product description. Find the Best Price Maker Advisor is part of the Random Nerd Tutorials website. We find the best deals, flash sales and coupons for tools and gear that makers, hobbyists and DIYers like. We share daily deals, write unbiased reviews and compare tools. Visit Maker Advisor to check the latest deals. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 4 About the Authors Hi there! Thank you for reading the “Ultimate Guide for Arduino Sensors and Modules”. “I’m Rui Santos, I have a master’s degree in Electrical and Computer Engineering. I have more than four years of experience teaching electronics and programming with the Random Nerd Tutorials blog. I’m also founder of RNTLab.com and author of BeagleBone For Dummies and 20 Easy Raspberry Pi Projects book. My projects and tutorials are related with Arduino, Home Automation, ESP8266, ESP32, and Raspberry Pi.” “I’m Sara Santos, I have a master’s degree in Bioengineering and I’ve been working with Rui at Random Nerd Tutorials since 2015 as a content editor. I’m the co-author of the 20 Easy Raspberry Pi Projects book and I also write and build courses with Rui.” LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 5 Table of Contents DHT11/DHT22 Temperature and Humidity Sensor ..................................................................... 7 BMP180 Barometric Sensor .......................................................................................................... 13 FC-37 or YL-83 Rain Sensor ........................................................................................................... 21 YL-69 or HL-69 Soil Moisture Sensor ............................................................................................ 26 DS18B20 Temperature Sensor ..................................................................................................... 31 DS1307 or DS3231 Real Time Clock (RTC) ................................................................................... 37 MQ-2 Gas/Smoke Sensor ............................................................................................................... 43 HC-SR04 Ultrasonic Sensor ........................................................................................................... 49 PIR Motion Sensor .......................................................................................................................... 53 Tilt Sensor ........................................................................................................................................ 57 Microphone Sound Sensor ............................................................................................................ 62 Reed Switch ..................................................................................................................................... 66 MRFC522 RFID ................................................................................................................................. 70 Relay Module .................................................................................................................................. 77 nRF24L01 ......................................................................................................................................... 83 433 MHz Transmitter/Receiver ..................................................................................................... 91 8x8 Dot Matrix ..............................................................................................................................102 WS2812B Addressable RGB LED Strip ........................................................................................108 Membrane Keypad .......................................................................................................................114 1.8 TFT Display ..............................................................................................................................118 SIM900 GSM GPRS Shield ............................................................................................................127 SD Card Module ............................................................................................................................146 TCS3200 color sensor...................................................................................................................152 LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 6 DHT11/DHT22 Temperature and Humidity Sensor These DHTXX sensors are very popular among the Arduino Tinkerers. The DHT sensors are inexpensive sensors for measuring temperature and humidity. These sensors contain a chip that does analog to digital conversion and spits out a digital signal with the temperature and humidity. These signals are easy to read with any microcontroller (MCU). Specifications DHT11 vs DHT22 There are two versions of the DHT sensor: DHT11 Range: 20-90% Absolute accuracy: ±5% Repeatability: ±1% Long term stability: ±1% per year Price: $1 to $5 LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 7 DHT22 Range: 0-100% Absolute accuracy: ±2% Repeatability: ±1% Long term stability: ±0.5% per year Price: $4 to $10 As you can see from the specs above, the DHT22 is a bit more accurate. Where to buy? Click the links below to compare the sensor at different stores and find the best price: Click here to see DHT11 on Maker Advisor Click here to see DHT22 on Maker Advisor Arduino with DHT11 Sensor For this example you need the following components: Figure Name Arduino UNO 1x DHT11 Breadboard 10KΩ Resistor (or 4.7KΩ) Jumper Wires Check Price Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 8 Schematic Here’s how to connect the DHT11 to an Arduino: Pin Wiring to Arduino UNO 1st pin - VCC 5V 2nd pin - Data OUT Digital pin 2 3rd pin Don’t connect 4th pin - GND GND LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 9 Source code Below you can find the code you need for this project. But first you need to install the DHT library. 1. Download the DHT11 library here 2. Unzip the DHT library 3. Rename the extracted folder to DHT and remove the “-“. Otherwise your Arduino IDE won’t recognize your library 4. Install the DHT11 in your Arduino IDE: go to Sketch Include Library Add . ZIP library and select the library you’ve just downloaded 5. Restart your Arduino IDE 6. Go to File Examples DHT sensor library DHTtester 7. Upload the code // Example testing sketch for various DHT humidity/temperature sensors // Written by ladyada, public domain #include "DHT.h" #define DHTPIN 2 // what digital pin we're connected to // Uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) // // // // // // Connect pin 1 (on the left) of the sensor to +5V NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1 to 3.3V instead of 5V! Connect pin 2 of the sensor to whatever your DHTPIN is Connect pin 4 (on the right) of the sensor to GROUND Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor // Initialize DHT sensor. // Note that older versions of this library took an optional third parameter to // tweak the timings for faster processors. This parameter is no longer needed // as the current DHT reading algorithm adjusts itself to work on faster procs. DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 10 void loop() { // Wait a few seconds between measurements. delay(2000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) float f = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; } // Compute heat index in Fahrenheit (the default) float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius (isFahreheit = false) float hic = dht.computeHeatIndex(t, h, false); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.print(" *F\t"); Serial.print("Heat index: "); Serial.print(hic); Serial.print(" *C "); Serial.print(hif); Serial.println(" *F"); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/DHTtester.ino Demonstration In this project the Arduino is measuring the temperature and humidity. Those two measurements are being displayed on the serial monitor. Here’s what you should see in your Arduino IDE serial monitor. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 11 LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 12 BMP180 Barometric Sensor The BMP180 barometric sensor (model GY-68) is the one in the following figure (front and back view). It is a very small module with 1mm x 1.1mm (0.039in x 0.043in). It measures the absolute pressure of the air around it. It has a measuring range from 300hPa to 1100hPa with an accuracy down to 0.02hPa. It can also measure altitude and temperature. The BMP180 barometric sensor communicates via I2C interface. This means that it communicates with the Arduino using just 2 pins. Where to buy? Click the link below to compare the sensor at different stores and find the best price: BMP180 barometric sensor LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 13 Schematic Wire your sensor to the Arduino as shown in the schematic diagram below. Wiring the sensor to the Arduino UNO is pretty straightforward: Pin Wiring to Arduino Uno Vin 5V GND GND SCL A5 SDA A4 LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 14 Code To control the BMP180 barometric sensor, you need to install the SFE_BMP180 Library. Installing the SFE_BMP180 Library 1. Click here to download the SFE_BMP180 library. You should have a .zip folder in your Downloads folder 2. Unzip the .zip folder and you should get BMP180_Breakout_Arduino_Librarymaster folder 3. Rename your folder from BMP180_Breakout_Arduino_Library-master to BMP180_Breakout_Ardui no_Library 4. Move the BMP180_Breakout_Arduino_Library folder to your Arduino IDE installation libraries folder 5. Finally, re-open your Arduino IDE Uploading the code Go to File Examples SparkfunBMP180 SFE_BMP180_example. This example is very well commented and explained on how the sensor reads the pressure, temperature and computes the altitude. Don’t upload the code now, you need to set the altitude first. /* SFE_BMP180 library example sketch This sketch shows how to use the SFE_BMP180 library to read the Bosch BMP180 barometric pressure sensor. https://www.sparkfun.com/products/11824 Like most pressure sensors, the BMP180 measures absolute pressure. This is the actual ambient pressure seen by the device, which will vary with both altitude and weather. Before taking a pressure reading you must take a temparture reading. This is done with startTemperature() and getTemperature(). The result is in degrees C. Once you have a temperature reading, you can take a pressure reading. This is done with startPressure() and getPressure(). The result is in millibar (mb) aka hectopascals (hPa). If you'll be monitoring weather patterns, you will probably want to remove the effects of altitude. This will produce readings that can LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 15 be compared to the published pressure readings from other locations. To do this, use the sealevel() function. You will need to provide the known altitude at which the pressure was measured. If you want to measure altitude, you will need to know the pressure at a baseline altitude. This can be average sealevel pressure, or a previous pressure reading at your altitude, in which case subsequent altitude readings will be + or - the initial baseline. This is done with the altitude() function. Hardware connections: - (GND) to GND + (VDD) to 3.3V (WARNING: do not connect + to 5V or the sensor will be damaged!) You will also need to connect the I2C pins (SCL and SDA) to your Arduino. The pins are different on different Arduinos: Any Arduino pins labeled: Uno, Redboard, Pro: Mega2560, Due: Leonardo: SDA A4 20 2 SCL A5 21 3 Leave the IO (VDDIO) pin unconnected. This pin is for connecting the BMP180 to systems with lower logic levels such as 1.8V Have fun! -Your friends at SparkFun. The SFE_BMP180 library uses floating-point equations developed by the Weather Station Data Logger project: http://wmrx00.sourceforge.net/ Our example code uses the "beerware" license. You can do anything you like with this code. No really, anything. If you find it useful, buy me a beer someday. V10 Mike Grusin, SparkFun Electronics 10/24/2013 V1.1.2 Updates for Arduino 1.6.4 5/2015 */ // Your sketch must #include this library, and the Wire library. // (Wire is a standard library included with Arduino.): #include#include // You will need to create an SFE_BMP180 object, here called "pressure": SFE_BMP180 pressure; LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 16 #define ALTITUDE 1655.0 // Altitude of SparkFun's HQ in Boulder, CO. in meters void setup() { Serial.begin(9600); Serial.println("REBOOT"); // Initialize the sensor (it is important to get calibration values stored on the device). if (pressure.begin()) Serial.println("BMP180 init success"); else { // Oops, something went wrong, this is usually a connection problem, // see the comments at the top of this sketch for the proper connections. Serial.println("BMP180 init fail\n\n"); while(1); // Pause forever. } } void loop() { char status; double T,P,p0,a; // Loop here getting pressure readings every 10 seconds. // If you want sea-level-compensated pressure, as used in weather reports, // you will need to know the altitude at which your measurements are taken. // We're using a constant called ALTITUDE in this sketch: Serial.println(); Serial.print("provided altitude: "); Serial.print(ALTITUDE,0); Serial.print(" meters, "); Serial.print(ALTITUDE*3.28084,0); Serial.println(" feet"); // If you want to measure altitude, and not pressure, you will instead need // to provide a known baseline pressure. This is shown at the end of the sketch. // You must first get a temperature measurement to perform a pressure reading. // Start a temperature measurement: // If request is successful, the number of ms to wait is returned. // If request is unsuccessful, 0 is returned. status = pressure.startTemperature(); if (status != 0) { // Wait for the measurement to complete: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 17 delay(status); // Retrieve the completed temperature measurement: // Note that the measurement is stored in the variable T. // Function returns 1 if successful, 0 if failure. status = pressure.getTemperature(T); if (status != 0) { // Print out the measurement: Serial.print("temperature: "); Serial.print(T,2); Serial.print(" deg C, "); Serial.print((9.0/5.0)*T+32.0,2); Serial.println(" deg F"); // Start a pressure measurement: // The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait). // If request is successful, the number of ms to wait is returned. // If request is unsuccessful, 0 is returned. status = pressure.startPressure(3); if (status != 0) { // Wait for the measurement to complete: delay(status); // Retrieve the completed pressure measurement: // Note that the measurement is stored in the variable P. // Note also that the function requires the previous temperature measurement (T). // (If temperature is stable, you can do one temperature number of pressure measurements.) // Function returns 1 if successful, 0 if failure. status = pressure.getPressure(P,T); if (status != 0) { // Print out the measurement: Serial.print("absolute pressure: "); Serial.print(P,2); Serial.print(" mb, "); Serial.print(P*0.0295333727,2); Serial.println(" inHg"); // The pressure sensor returns abolute pressure, which // To remove the effects of altitude, use the sealevel current altitude. // This number is commonly used in weather reports. // Parameters: P = absolute pressure in mb, ALTITUDE = m. measurement for a varies with altitude. function and your current altitude in // Result: p0 = sea-level compensated pressure in mb p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO) Serial.print("relative (sea-level) pressure: "); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 18 Serial.print(p0,2); Serial.print(" mb, "); Serial.print(p0*0.0295333727,2); Serial.println(" inHg"); // On the other hand, if you want to determine your altitude from the pressure reading, // use the altitude function along with a baseline pressure (sea-level or other). // Parameters: P = absolute pressure in mb, p0 = baseline pressure in mb. // Result: a = altitude in m. a = pressure.altitude(P,p0); Serial.print("computed altitude: "); Serial.print(a,0); Serial.print(" meters, "); Serial.print(a*3.28084,0); Serial.println(" feet"); } else Serial.println("error retrieving pressure measurement\n"); } else Serial.println("error starting pressure measurement\n"); } else Serial.println("error retrieving temperature measurement\n"); } else Serial.println("error starting temperature measurement\n"); delay(5000); // Pause for 5 seconds. } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/SFE_BMP180_example.ino Set the altitude Before uploading the code, you need to set up your current altitude. Go to elevationmap.net, insert your address and check your altitude’s location. Set your altitude in the code. The place where you should write your altitude is commented. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 19 Demonstration After uploading the code, open your serial monitor at a baud rate of 9600. You’ll see your sensor readings. Wrapping up The BMP180 is an interesting sensor to be used in your own weather station. Because the pressure changes with the altitude, this sensor can also compute the altitude. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 20 FC-37 or YL-83 Rain Sensor The rain sensor is used to detect water and it can detect beyond what a humidity sensor can. The FC-37 rain sensor (or other versions like YL-83) is set up by two pieces: the electronic board (at the left) and the collector board (at the right) that collects the water drops, as you can see in the following figure: The rain sensor has a built-in potentiometer for sensitivity adjustment of the digital output (D0). It also has a power LED that lights up when the sensor is turned on and a digital output LED. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 21 How does it work? In simple terms, the resistance of the collector board varies accordingly to the amount of water on its surface. When the board is: Wet: the resistance increases, and the output voltage decreases Dry: the resistance is lower, and the output voltage is higher Where to buy? Click the link below to compare the sensor at different stores and find the best price: YL-83 rain sensor Example: Rain Sensor with Arduino This is a simple example to show you how you can use the rain sensor in your projects with Arduino. You will read the analog sensor values and print them in the Arduino IDE serial monitor. For this example, you’ll need the following parts: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 22 Figure Name Check Price Find best price on Arduino UNO Maker Advisor Find best price on YL-83 Rain Sensor Maker Advisor Find best price on Breadboard Maker Advisor Find best price on 2× 220Ω resistor Maker Advisor Find best price on 2× LEDs Maker Advisor Find best price on Jumper Wires Maker Advisor Pin Wiring Sensor Pin Wiring to Arduino Uno A0 Any analog pin (A5 in this example) D0 Digital pins GND GND VCC 5V LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 23 Schematic Follow the next schematic diagram to complete the project: Code Upload the following sketch to your Arduino board (feel free to adjust the variable thresholdValue with a different threshold value): /* All the resources for this project: http://randomnerdtutorials.com/ */ int rainPin = A0; int greenLED = 6; int redLED = 7; // you can adjust the threshold value int thresholdValue = 500; void setup(){ pinMode(rainPin, INPUT); pinMode(greenLED, OUTPUT); pinMode(redLED, OUTPUT); digitalWrite(greenLED, LOW); digitalWrite(redLED, LOW); Serial.begin(9600); } void loop() { // read the input on analog pin 0: int sensorValue = analogRead(rainPin); Serial.print(sensorValue); if(sensorValue < thresholdValue){ Serial.println(" - It's wet"); digitalWrite(greenLED, LOW); digitalWrite(redLED, HIGH); } else { Serial.println(" - It's dry"); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 24 digitalWrite(greenLED, HIGH); digitalWrite(redLED, LOW); } delay(500); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/rain_sensor_arduino.ino Open the Arduino IDE serial monitor to see the results. Then, add drops of water to the collector board and see how that changes the readings. When the value goes below a certain threshold, a red LED will light up, and when the value goes above a certain threshold, a green LED will light up. Wrapping up If you want to know when it’s raining, you need to set up your rain sensor with the Arduino outside. Be aware that you should protect your Arduino and your circuit from water. A waterproof project box can be handy in this situation. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 25 YL-69 or HL-69 Soil Moisture Sensor The soil moisture sensor or the hygrometer is usually used to detect the humidity of the soil. So, it is perfect to build an automatic watering system or to monitor the soil moisture of your plants. The sensor is set up by two pieces: the electronic board (at the right), and the probe with two pads, that detects the water content (at the left). The sensor has a built-in potentiometer for sensitivity adjustment of the digital output (D0), a power LED and a digital output LED, as you can see in the following figure. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 26 How does it work? The voltage that the sensor outputs changes accordingly to the water content in the soil. When the soil is: Wet: the output voltage decreases Dry: the output voltage increases The output can be a digital signal (D0) LOW or HIGH, depending on the water content. If the soil humidity exceeds a certain predefined threshold value, the modules outputs LOW, otherwise it outputs HIGH. The threshold value for the digital signal can be adjusted using the potentiometer. The output can also be an analog signal and so you’ll get a value between 0 and 1023. Where to buy? Click the link below to compare the sensor at different stores and find the best price: HL-69 soil moisture sensor LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 27 Soil Moisture Sensor with the Arduino In this example, you’ll read the analog sensor output values using the Arduino and print those readings in the Arduino IDE serial monitor. For this example, you’ll need the following components: Figure Name Check Price Find best price on Arduino UNO Maker Advisor Find best price on HL-69 Rain Sensor Maker Advisor Find best price on Breadboard Maker Advisor Find best price on 2× 220Ω Resistor Maker Advisor Find best price on 2× LEDs Maker Advisor Find best price on Jumper Wires Maker Advisor Pin Wiring Sensor Pin Wiring to Arduino Uno A0 Any analog pin (A5 in this example) D0 Digital pins GND GND VCC 5V LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 28 Schematic To complete the project, follow the next schematic diagram: Code Upload the following sketch to your Arduino board: /* All the resources for this project: http://randomnerdtutorials.com/ */ int rainPin = A0; int greenLED = 6; int redLED = 7; // you can adjust the threshold value int thresholdValue = 800; void setup(){ pinMode(rainPin, INPUT); pinMode(greenLED, OUTPUT); pinMode(redLED, OUTPUT); digitalWrite(greenLED, LOW); digitalWrite(redLED, LOW); Serial.begin(9600); } void loop() { // read the input on analog pin 0: int sensorValue = analogRead(rainPin); Serial.print(sensorValue); if(sensorValue < thresholdValue){ LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 29 Serial.println(" - Doesn't need watering"); digitalWrite(redLED, LOW); digitalWrite(greenLED, HIGH); } else { Serial.println(" - Time to water your plant"); digitalWrite(redLED, HIGH); digitalWrite(greenLED, LOW); } delay(500); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/soil_moisture_sensor_arduino.ino Open the Arduino IDE serial monitor to see the values. Then, try your sensor in a wet and in a dry soil and see what happens. When the analog value goes above a certain threshold, a red LED will turn on (indicates that the plant needs watering), and when the value goes below a certain threshold, a green LED will turn on (indicates that the plant is ok). Wrapping up The moisture sensor allows to monitor the water content in the soil. This is useful if you want to build an automatic watering system. You can also use it to just monitor your plants soil moisture. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 30 DS18B20 Temperature Sensor The DS18B20 temperature sensor is a 1-wire digital temperature sensor. This means that you can read the temperature with a very simple circuit setup. It communicates on common bus, which means that you can connect several devices and read their values using just one digital pin of the Arduino. The sensor has just three pins as you can see in the following figure: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 31 The DS18B20 is also available in waterproof version: Features Here’s some main features of the DS18B20 temperature sensor: Communicates over 1-wire bus communication Operating range temperature: -55ºC to 125ºC Accuracy +/-0.5 ºC (between the range -10ºC to 85ºC) Where to buy? Click the link below to compare the sensor at different stores and find the best price: DS18B20 digital temperature sensor DS18B20 temperature sensor with the Arduino In this example, you’ll read the temperature using the DS18B20 sensor and the Arduino. The readings will be displayed on the Arduino Serial Monitor. For this example, you’ll need the following parts: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 32 Figure Name Arduino UNO DS18B20 temperature sensor Breadboard 4.7kΩ Resistor Jumper Wires Check Price Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Schematic The sensor can operate in two different modes: Normal mode: 3-wire connection is needed. Here’s the schematic you need to follow: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 33 Parasite mode: only 2 wires required, the data and ground. The sensor derives its power from the data line. In this case, here’s the schematic you need to follow: You can read the temperature of more than one sensor at the same time using just one digital Arduino pin. For that, you just need to connect all the DQ pins to any digital Arduino pin. Code You’ll need to install the OneWire Library and DallasTemperature Library. Installing the OneWire Library 1. Click here to download the OneWire library. You should have a .zip folder in your Downloads 2. Unzip the .zip folder and you should get OneWire-master folder 3. Rename your folder from OneWire-master to OneWire 4. Move the OneWire folder to your Arduino IDE installation libraries folder 5. Finally, re-open your Arduino IDE Installing the DallasTemperature Library 1. Click here to download the DallasTemperature library. You should have a .zip folder in your Downloads LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 34 2. Unzip the .zip folder and you should get Arduino-Temperature-ControlLibrary-master folder 3. Rename your folder from Arduino-Temperature-Control-Library- master to DallasTemperature 4. Move the DallasTemperature folder to your Arduino IDE installation libraries folder 5. Finally, re-open your Arduino IDE After installing the needed libraries, upload the following code to your Arduino board. /* Rui Santos Complete project details at http://randomnerdtutorials.com Based on the Dallas Temperature Library example */ #include #include // Data wire is connected to the Arduino digital pin 2 #define ONE_WIRE_BUS 2 // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); void setup(void) { // Start serial communication for debugging purposes Serial.begin(9600); // Start up the library sensors.begin(); } void loop(void){ // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus sensors.requestTemperatures(); Serial.print("Celsius temperature: "); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire Serial.print(sensors.getTempCByIndex(0)); Serial.print(" - Fahrenheit temperature: "); Serial.println(sensors.getTempFByIndex(0)); delay(1000); } LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 35 SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/DS18B20_Temperature_Sensor_Arduino.ino Finally, you should open the Arduino IDE serial monitor at a 9600 baud rate and you’ll see the temperature displayed in both Celsius and Fahrenheit: Wrapping up The DS18B20 temperature sensor is a very useful one. It allows you to read the temperature both in Celsius and Fahrenheit via One Wire communication. This means you can have readings from several sensors without multiplying the connections to the Arduino. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 36 DS1307 or DS3231 Real Time Clock (RTC) The real time clock module is the one in the figure below (front and back view). When you first use this module, you need to solder some header pins. As you can see in the picture above, the module has a backup battery installed. This allows the module to retain the time, even when it’s not being powered up by the Arduino. This way, every time you turn on and off your module, the time doesn’t reset. This module uses I2C communication. This means that it communicates with the Arduino using just 2 pins. Where to buy? Click the link below to compare the module at different stores and find the best price: DS1307 Real Time Clock Module LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 37 Pin wiring Module Pin Wiring to Arduino Uno SCL A5 SDA A4 VCC 5V GND GND If you’re using other Arduino board rather than the Uno, check out what are their SCL and SDA pins. Nano: SDA (A4); SCL(A5) MEGA: SDA (20); SCL(21) Leonardo: SDA (20); SCL(21) Displaying date and time in the serial monitor In this example you’ll display the data and time in the serial monitor. Schematics Connect your Real Time Clock module to your Arduino as in the schematics below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 38 Code Working with the RTC requires two important steps: setting the current time, so that the RTC knows what time is it retaining the time, so that the RTC always gives the correct time, even when it is turned off Set the current time in the Real Time Clock For setting the current time you need to change the code provided. Set your current time in the function setDS3231time() The parameters for the function are highlighted in red: seconds, minutes, hours, day of the week, date, month and year (in this order). Sunday is the day 1 of the week and Saturday is 7. Don’t forget to uncomment that line of code. After setting the current time, you can upload the provided code with the required modifications. The code provided was written by John Boxall from tronixstuff. You can read his tutorial here. // Written by John Boxall from http://tronixstuff.com #include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val){ return( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val){ return( (val/16*10) + (val%16) ); } void setup(){ Wire.begin(); Serial.begin(9600); // set the initial time here: // DS3231 seconds, minutes, hours, day, date, month, year setDS3231time(30,42,16,5,13,10,16); } void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year){ LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 39 // sets time and date data to DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set next input to start at the seconds register Wire.write(decToBcd(second)); // set seconds Wire.write(decToBcd(minute)); // set minutes Wire.write(decToBcd(hour)); // set hours Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday) Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31) Wire.write(decToBcd(month)); // set month Wire.write(decToBcd(year)); // set year (0 to 99) Wire.endTransmission(); } void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year){ Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set DS3231 register pointer to 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes of data from DS3231 starting from register 00h *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } void displayTime(){ byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // retrieve data from DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // send it to the serial monitor Serial.print(hour, DEC); // convert the byte variable to a decimal number when displayed Serial.print(":"); if (minute<10){ Serial.print("0"); } Serial.print(minute, DEC); Serial.print(":"); if (second<10){ Serial.print("0"); } Serial.print(second, DEC); Serial.print(" "); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 40 Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" Day of week: "); switch(dayOfWeek){ case 1: Serial.println("Sunday"); break; case 2: Serial.println("Monday"); break; case 3: Serial.println("Tuesday"); break; case 4: Serial.println("Wednesday"); break; case 5: Serial.println("Thursday"); break; case 6: Serial.println("Friday"); break; case 7: Serial.println("Saturday"); break; } } void loop(){ displayTime(); // display the real-time clock data on the Serial Monitor, delay(1000); // every second } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/rtc_example.ino Retain the time in the Real Time Clock If you don’t want to reset the time every time the RTC is turned off, you should do the following: after setting up the time, you should comment the function that sets the time and upload the code again. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 41 This is a very important step to set up the time in your RTC. If you don’t do this, every time your RTC resets, it will display the time that you’ve set up previously instead of the current time. Demonstration Open the serial monitor at a baud rate of 9600 and you’ll see the results. Here’s the Serial Monitor displaying the current date and time. Wrapping up The RTC module is useful and you can use it as a clock, timer, etc. A very interesting project to do with the RTC is an alarm clock with and OLED display, for example. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 42 MQ-2 Gas/Smoke Sensor This guide shows how to build a smoke detector that beeps when it detects flammable gas or smoke. The MQ-2 smoke sensor is shown in the following figure: The MQ-2 smoke sensor is sensitive to smoke and to the following flammable gases: LPG, butane, propane, methane, alcohol and hydrogen. The resistance across the sensor is different depending on the type of the gas. The smoke sensor has a builtin potentiometer that allows you to adjust the sensor digital output (D0) threshold. This threshold sets the value above which the digital pin will output a HIGH signal. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 43 How does it work? The voltage that the sensor outputs changes accordingly to the smoke/gas level that exists in the atmosphere. The sensor outputs a voltage that is proportional to the concentration of smoke/gas. In other words, the relationship between voltage and gas concentration is the following: The greater the gas concentration, the greater the output voltage The lower the gas concentration, the lower the output voltage The output can be an analog signal (A0) that can be read with an analog input of the Arduino or a digital output (D0) that can be read with a digital input of the Arduino. Where to buy? Click the link below to compare the sensor at different stores and find the best price: MQ-2 Gas and Smoke Sensor Gas Sensor with Arduino In this example, you will read the sensor analog output voltage. When the smoke reaches a certain level, it will make sound a buzzer and a red LED will turn on. When the output voltage is below that level, a green LED will be on. For this example, you’ll need the following parts: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 44 Figure Name Check Price Find best price on Arduino UNO Maker Advisor Find best price on MQ-2 gas/smoke sensor Maker Advisor Find best price on Breadboard Maker Advisor Find best price on 2 x LEDs Maker Advisor Find best price on 3 x 220kΩ Resistor Maker Advisor Find best price on Piezo buzzer Maker Advisor Find best price on Jumper Wires Maker Advisor Pin wiring Sensor Pin Wiring to Arduino Uno A0 Analog pins D0 Digital pins GND GND VCC 5V LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 45 Schematic Follow the next schematic diagram to complete the project: Code Upload the following sketch to your Arduino board (feel free to adjust the variable sensorThres with a different threshold value): /******* All the resources for this project: http://randomnerdtutorials.com/ *******/ int redLed = 12; int greenLed = 11; int buzzer = 10; int smokeA0 = A5; // Your threshold value int sensorThres = 400; LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 46 void setup() { pinMode(redLed, OUTPUT); pinMode(greenLed, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(smokeA0, INPUT); Serial.begin(9600); } void loop() { int analogSensor = analogRead(smokeA0); Serial.print("Pin A0: "); Serial.println(analogSensor); // Checks if it has reached the threshold value if (analogSensor > sensorThres) { digitalWrite(redLed, HIGH); digitalWrite(greenLed, LOW); tone(buzzer, 1000, 200); } else { digitalWrite(redLed, LOW); digitalWrite(greenLed, HIGH); noTone(buzzer); } delay(100); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/smoke_detector.ino Demonstration When you press a lighter next to the sensor, the red LED lights up and the buzzer beeps. You can also see at the serial monitor, the values changing and surpassing the threshold value. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 47 Wrapping up The MQ-2 gas sensor allows you to detect a wide variety of gases in the environment. It is very useful to build a smoke detector at home. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 48 HC-SR04 Ultrasonic Sensor The HC-SR04 ultrasonic sensor uses sonar to determine distance to an object like bats do. It offers excellent non-contact range detection with high accuracy and stable readings in an easy-to-use package. From 2 cm to 400 cm or 1” to 13 feet. It comes complete with ultrasonic transmitter and receiver module. The HC-SR04 ultrasonic sensor is shown in the following figure: Features Power Supply :+5V DC Quiescent Current : <2mA Working Current: 15mA Effectual Angle: <15° Ranging Distance : 2cm – 400 cm/1″ – 13ft Resolution : 0.3 cm Measuring Angle: 30 degree Trigger Input Pulse width: 10uS Dimensions: 45mm x 20mm x 15mm LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 49 Where to buy? Click the link below to compare the sensor at different stores and find the best price: HC-SR04 Ultrasonic Sensor Arduino with HC – SR04 Sensor In this project the ultrasonic sensor reads and writes the distance in the serial monitor. Note: There’s an Arduino library called NewPing that can make your life easier when using this sensor. Schematic Wire your sensor by following the schematic diagram below. Sensor Pin Wiring to Arduino Uno VCC 5V Trig Trigger (INPUT) D9 Echo Echo (OUTPUT) D12 GND GND LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 50 Source code Upload the following code to your Arduino IDE. /* * created by Rui Santos, http://randomnerdtutorials.com * * Complete Guide for Ultrasonic Sensor HC-SR04 * Ultrasonic sensor Pins: VCC: +5VDC Trig : Trigger (INPUT) - Pin11 Echo: Echo (OUTPUT) - Pin 12 GND: GND */ int trigPin = 11; int echoPin = 12; long duration, cm, inches; void setup() { //Serial Port begin Serial.begin (9600); //Define inputs and outputs pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { // The sensor is triggered by a HIGH pulse of 10 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: digitalWrite(trigPin, LOW); delayMicroseconds(5); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Read the signal from the sensor: a HIGH pulse whose // duration is the time (in microseconds) from the sending // of the ping to the reception of its echo off of an object. pinMode(echoPin, INPUT); duration = pulseIn(echoPin, HIGH); // convert the time into a distance cm = (duration/2) / 29.1; inches = (duration/2) / 74; Serial.print(inches); Serial.print("in, "); Serial.print(cm); Serial.print("cm"); Serial.println(); delay(250); } LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 51 SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/Ultrasonic_Sensor_HC-SR04.c Source code with NewPing Below there is an example using the NewPing library. Download the library here. /* * Posted on http://randomnerdtutorials.com * created by http://playground.arduino.cc/Code/NewPing */ #include #define TRIGGER_PIN 12 #define ECHO_PIN 11 #define MAX_DISTANCE 200 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance. void setup() { Serial.begin(9600); } void loop() { delay(50); unsigned int uS = sonar.ping_cm(); Serial.print(uS); Serial.println(‘‘cm’’); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/Ultrasonic_Sensor_HC-SR04_with_NewPing.c LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 52 PIR Motion Sensor The PIR motion sensor is ideal to detect movement. PIR stand for “Passive Infrared”. Basically, the PIR motion sensor measures infrared light from objects in its field of view. So, it can detect motion based on changes in infrared light in the environment. It is ideal to detect if a human has moved in or out of the sensor range. The sensor in the figure above has two built-in potentiometers to adjust the delay time (the potentiometer at the left) and the sensitivity (the potentiometer at the right). Where to buy? Click the link below to compare the sensor at different stores and find the best price: PIR Motion Sensor (HC-SR501) LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 53 Detecting motion with the PIR motion sensor In this example an LED will light up when movement is detected. For this example, you need the following parts: Figure Name Arduino UNO PIR motion sensor 2 x LEDs Jumper Wires Check Price Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Schematic Assemble all the parts by following the schematic below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 54 Pin wiring Sensor Pin Wiring to Arduino Uno GND GND OUT Arduino digital pin 5V 5V Code Upload the following code. /* Arduino with PIR motion sensor For complete project details, visit: http://RandomNerdTutorials.com/pirsensor Modified by Rui Santos based on PIR sensor by Limor Fried */ int int int int led = 13; sensor = 2; state = LOW; val = 0; void setup() { pinMode(led, OUTPUT); pinMode(sensor, INPUT); Serial.begin(9600); } void loop(){ val = digitalRead(sensor); if (val == HIGH) { digitalWrite(led, HIGH); delay(100); // // // // the pin that the LED is atteched to the pin that the sensor is atteched to by default, no motion detected variable to store the sensor status (value) // initalize LED as an output // initialize sensor as an input // initialize serial // // // // read sensor value check if the sensor is HIGH turn LED ON delay 100 milliseconds if (state == LOW) { Serial.println("Motion detected!"); state = HIGH; // update variable state to HIGH } } else { digitalWrite(led, LOW); // turn LED OFF delay(200); // delay 200 milliseconds if (state == HIGH){ Serial.println("Motion stopped!"); state = LOW; // update variable state to LOW LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 55 } } } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/Arduino_with_PIR_motion_sensor.ino LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 56 Tilt Sensor The tilt sensor is many times referred to as inclinometer, tilt switch or rolling ball sensor. Using a tilt sensor is a simple way to detect orientation or inclination. The tilt sensor module is the one in the following figure. The tilt sensor allows to detect orientation or inclination. It detects if the sensor is completely upright or if it is tilted. This makes it very useful to be used, for example, in toys, robots and other appliances whose working methodology depends on inclination. How does it work? The tilt sensor is cylindrical and contains a free conductive rolling ball inside with two conductive elements (poles) beneath. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 57 Here's how it works: When the sensor is completely upright, the ball falls to the bottom of the sensor and connects the poles, allowing the current to flow. When the sensor is tilted, the ball doesn't touch the poles, the circuit is open, and the current doesn't flow. This way, the tilt sensor acts like a switch that is turned on or off depending on its inclination. So, it will give digital information to the Arduino, either a HIGH or a LOW signal. Where to buy? Click the link below to compare the sensor at different stores and find the best price: Tilt Sensor Pin wiring Wiring the tilt sensor to you Arduino is straightforward. You just need to connect one pin to the Arduino digital pins and the GND to the GND. If you connect the sensor like so, you need to activate the Arduino internal pull-up resistor for the digital pin to which your sensor is connected to. Otherwise, you should use a 10kOhm pull up resistor in your circuit. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 58 Example: Tilt sensitive LED This is just a simple example for you to start put hands on your tilt sensor. In this example, an LED will be turned off if the sensor is upright and will be turned on if the sensor is tilted. Figure Name Arduino UNO Tilt Sensor Breadboard 2 x LEDs 220Ω Resistor Check Price Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE Maker Advisor 59 Jumper Wires Find best price on Maker Advisor Schematics For this example, you just need to add an LED to the schematics in the "Pin Wiring" section. Code To complete this example, upload the following code. /* * Rui Santos * Complete Project Details http://randomnerdtutorials.com */ int ledPin = 12; int sensorPin = 4; int sensorValue; int lastTiltState = HIGH; // the previous reading from the tilt sensor // the following variables are long's because the time, measured in miliseconds, // will quickly become a bigger number than can be stored in an int. long lastDebounceTime = 0; // the last time the output pin was toggled long debounceDelay = 50; // the debounce time; increase if the output flickers void setup(){ pinMode(sensorPin, INPUT); digitalWrite(sensorPin, HIGH); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 60 pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop(){ sensorValue = digitalRead(sensorPin); // If the switch changed, due to noise or pressing: if (sensorValue == lastTiltState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: lastTiltState = sensorValue; } digitalWrite(ledPin, lastTiltState); Serial.println(sensorValue); delay(500); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/Arduino_tilt_sensor.ino Demonstration In the end, this is what you'll have. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 61 Microphone Sound Sensor This guide shows how to use the microphone sound sensor with the Arduino. The microphone sound sensor, as the name says, detects sound. It gives a measurement of how loud a sound is. There is a wide variety of these sensors. The figure below you can see the most common ones used with the Arduino. At the left you can see the KY-038 and at the right the LM393 microphone sound sensors. Both sensor modules have a built-in potentiometer to adjust the sensitivity of the digital output pins. Where to buy? Click the link below to compare the sensor at different stores and find the best price: Microphone sound sensor KY-038 LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 62 Pin wiring Sensor Pin Wiring to Arduino Uno A0 Analog pins D0 Digital pins GND GND VCC 5V If you're using the LM 393 module, you should connect the OUT pin to an Arduino digital pin. Example: Sound Sensitive Lights In this example, a microphone sensor will detect the sound intensity of your surroundings and will light up and LED if the sound intensity is above a certain threshold. You can modify this project by adding more LEDs. You can also adjust your sensor sensitivity so that the LEDs are turned on or off accordingly to the beat of a music. For this example, you’ll need the following components. Figure Name Arduino UNO Microphone sound sensor Breadboard LED 220Ω Resistor Check Price Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE Maker Advisor 63 Jumper Wires Find best price on Maker Advisor Schematic Assemble all the parts by following the schematic below: Code Upload the following code to your Arduino. /* * Rui Santos * Complete Project Details http://randomnerdtutorials.com */ int ledPin=13; int sensorPin=7; boolean val =0; void setup(){ pinMode(ledPin, OUTPUT); pinMode(sensorPin, INPUT); Serial.begin (9600); } void loop (){ LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 64 val =digitalRead(sensorPin); Serial.println (val); // when the sensor detects a signal above the threshold value, LED flashes if (val==HIGH) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/Arduino_microphone_sensor.ino Demonstration After uploading the code, you can clap next to the sensor. If the LED is not turning on, you need to change the sensor sensitivity by rotating the potentiometer. You can also adjust the sensitivity so that the LED follows the beat of a certain music. Add more LEDs to a more spectacular effect. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 65 Reed Switch A magnetic contact switch is basically a reed switch encased in a plastic shell so that you can easily apply them in a door, a window or a drawer to detect if the door is open or closed. The switch that we are going to use has two parts: the switch itself, that usually comes opened and the magnet. When you buy this switch, it also comes with 4 screws, so that you can attach it to your door. How does it work? It’s very simple. The electrical circuit is closed when a magnet is near the switch (less than 13 mm (0.5’’) away). When the magnet is far away from the switch, the circuit is open. See the figure below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 66 Where to buy? Click the link below to compare the sensor at different stores and find the best price: Magnetic reed switch Project example In this example, we will turn on a red LED if your door is open and a green LED if your door is closed. Figure Name Arduino UNO Magnetic reed switch Breadboard Check Price Find best price on Maker Advisor Find best price on Maker Advisor Find best price on LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE Maker Advisor 67 LED 2x 220Ω Resistor, 1x 10kΩ Resistor Jumper Wires Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Schematic Follow the next schematic diagram to complete this project. Code For this example, upload the following code: /* Created by Rui Santos All the resources for this project: http://randomnerdtutorials.com/ */ int ledOpen=8; LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 68 int ledClose=10; int switchReed=6; void setup(){ pinMode(ledOpen, OUTPUT); pinMode(ledClose, OUTPUT); pinMode(switchReed, INPUT); Serial.begin(9600); } void loop(){ if (digitalRead(switchReed)==HIGH){ digitalWrite(ledOpen, LOW); digitalWrite(ledClose, HIGH); Serial.println("Your Door is Closed"); } else { digitalWrite(ledOpen, HIGH); digitalWrite(ledClose, LOW); Serial.println("Your Door is Open"); } delay(1); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/Magnetic_Contact_Switch.ino Demonstration You can watch this video demonstration to see the project in action: https://youtu.be/yY0DK8fe04w LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 69 MRFC522 RFID RFID means radio-frequency identification. RFID uses electromagnetic fields to transfer data over short distances. RFID is useful to identify people, to make transactions, etc. You can use an RFID system to open a door. For example, only the person with the right information on his card can enter. An RFID system uses: tags attached to the object to be identified, in this example we have a keychain and an electromagnetic card. Each tag has his own unique identification (UID). two-way radio transmitter-receiver, the reader, that send a signal to the tag and read its response. Specifications Input voltage: 3.3V Frequency: 13.56MHz LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 70 Where to Buy? Click the link below to compare the module at different stores and find the best price: MRFC522 RFID Pin wiring Sensor Pin Wiring to Arduino Uno SDA Digital 10 SCK Digital 13 MOSI Digital 11 MISO Digital 12 IRQ Don’t connect GND GND RST Digital 9 3.3V 3.3V Reading Data from a RFID tag In this example you will read data from an RFID tag. You will authorize a predetermined tag and deny the others. Schematic Wire your RFID reader module as in the schematic below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 71 Library download You need the RFID library for this project: 1. Click here to download the RFID library here created by miguelbalboa. You should have a .zip folder in your Downloads folder. 2. Unzip the .zip folder and you should get rfid-master folder. 3. Rename your folder from rfid-master to rfid. 4. Move the rfid folder to your Arduino IDE installation libraries folder. 5. Finally, re-open your Arduino IDE. 6. Restart your Arduino IDE Go to File Examples MFRC522 DumpInfo and upload the code. This code will be available in your Arduino IDE (after installing the RFID library). Then, open the serial monitor. You should see something like the figure below: Approximate the RFID card or the keychain to the reader. Let the reader and the tag closer until all the information is displayed. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 72 This is the information that you can read from the card, including the card UID that is highlighted in yellow. The information is stored in the memory that is divided into segments and blocks as you can see in the previous picture. You have 1024 bytes of data storage divided into 16 sectors. Write down your UID card because you’ll need it later. Then, you need the following code (don’t upload it now). LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 73 /* * * All the resources for this project: http://randomnerdtutorials.com/ * Modified by Rui Santos * * Created by FILIPEFLOP * */ #include #include #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. void setup() { Serial.begin(9600); // Initiate a serial communication SPI.begin(); // Initiate SPI bus mfrc522.PCD_Init(); // Initiate MFRC522 Serial.println("Approximate your card to the reader..."); Serial.println(); } void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Show UID on serial monitor Serial.print("UID tag :"); String content= ""; byte letter; for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); content.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println(); Serial.print("Message : "); content.toUpperCase(); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 74 if (content.substring(1) == "BD 31 15 2B") //change here the UID of the card/cards that you want to give access { Serial.println("Authorized access"); Serial.println(); delay(3000); } else { Serial.println(" Access denied"); delay(3000); } } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/MFRC522_RFID_Reader_with_Arduino.ino In the piece of code above you need to change the line if (content.substring(1) == “REPLACE WITH YOUR UID”) and type the UID card you’ve written previously. Demonstration Now, upload the code to your Arduino and open the serial monitor. Approximate the card you’ve chosen to give access and you’ll see: If you approximate another tag with another UID, the denial message will show up: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 75 You can watch the following video demonstration to see the project in action: https://youtu.be/mpLzcBDBl1U Wrapping up The MFRC522 RFID reader allows you to do a project in which you have security access to something. For example, only the right tag can open a specific door. This is just a simple guide to show you how this reader works. Now, the idea is for you to apply this knowledge and use your imagination to make your own projects. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 76 Relay Module A relay is an electrically operated switch of mains voltage. It can be turned on or off, letting the current go through or not. The relay module is shown in the figure below. This module has two channels (those blue cubes). Where to buy? Click the link below to compare the module at different stores and find the best price: Relay module Mains voltage connections In relation to mains voltage, relays have 3 possible connections: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 77 COM: common pin NO: normally open – there is no contact between the common pin and the normally open pin. So, when you trigger the relay, it connects to the COM pin and power is provided to the load (a desktop lamp, in our case). NC: normally closed – there is contact between the common pin and the normally closed pin. There is always connection between the COM and NC pins, even when the relay is turned off. When you trigger the relay, the circuit is opened and there is no supply provided to the load. If you want to control a lamp for example, it is better to use a normally-open circuit, because we just want to light up the lamp occasionally. Pin wiring The connections between the relay and the Arduino are simple: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 78 GND: goes to ground IN1: controls the first relay. Should be connected to an Arduino digital pin IN2: controls the second relay. Should be connected to an Arduino digital pin if you are using this second relay. Otherwise, you don’t need to connect it. VCC: goes to 5V. Controlling a Lamp with a Relay Module and PIR Motion Sensor In this example you will create a motion sensitive lamp. A lamp will light up for 10 seconds every time motion is detected. Motion will be detected using a PIR motion sensor. Figure Name Arduino UNO Relay Module Check Price Find best price on Maker Advisor Find best price on Maker Advisor Lamp Cord Set PIR Motion Sensor Jumper Wires Find best price on Maker Advisor Find best price on Maker Advisor Schematic Assemble all the parts by following the schematic diagram below. Be very careful with the mains voltage connections. Make sure you have the relay unplugged from mains voltage when assembling the circuit. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 79 Code Copy the following code to your Arduino IDE and upload it to your Arduino board. /********* Rui Santos Complete project details at http://randomnerdtutorials.com *********/ // Relay pin is connected to D8. The active wire is connected to Normally open and common int relay = 8; volatile byte relayState = LOW; // PIR Motion Sensor is connected to D2. int PIRInterrupt = 2; // Timer Variables long lastDebounceTime = 0; long debounceDelay = 10000; void setup() { // Pin for relay module set as output pinMode(relay, OUTPUT); digitalWrite(relay, HIGH); // PIR motion sensor set as an input pinMode(PIRInterrupt, INPUT); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 80 // Triggers detectMotion function on rising mode to turn the relay on, if the condition is met attachInterrupt(digitalPinToInterrupt(PIRInterrupt), detectMotion, RISING); // Serial communication for debugging purposes Serial.begin(9600); } void loop() { // If 10 seconds have passed, the relay is turned off if((millis() - lastDebounceTime) > debounceDelay && relayState == HIGH){ digitalWrite(relay, HIGH); relayState = LOW; Serial.println("OFF"); } delay(50); } void detectMotion() { Serial.println("Motion"); if(relayState == LOW){ digitalWrite(relay, LOW); } relayState = HIGH; Serial.println("ON"); lastDebounceTime = millis(); } LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 81 Demonstration Now, when movement is detected your lamp lights up. Wrapping up Controlling a relay module with the Arduino is as simple as controlling an output. With the relay module you can control almost any AC electronics appliance (not just lamps). LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 82 nRF24L01 These RF modules are very popular among the Arduino tinkerers. The nRF24L01 is used on a wide variety of applications that require wireless control. They are transceivers which means that each module can transmit and receive data. These modules are very cheap and you can use them with any microcontroller (MCU). Specifications nRF24L01 – 2.4GHz RF Transceiver Low cost single-chip 2.4GHz GFSK RF transceiver IC Range with Antenna: 250Kb rate (Open area) >1000 meter Power: Ultra low power consumption Input Voltage: 3.3V Pins: 5V tolerant Price: $2 Where to buy? Click the link below to compare these modules at different stores and find the best price: nRF24L01/2.4GHz RF LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 83 Arduino with nRF24L01 You need the following components to complete the instructions in this example: Figure Name Arduino UNO 2x nRF24L01 Breadboard Jumper Wires Check Price Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Library For this project you need the RadioHead library. 1. Click here to download the RadioHead library 2. Unzip the .zip folder and you should get RadioHead-1.46 folder. 3. Rename your folder from RadioHead-1.46 to RadioHead. 4. Move the RadioHead folder to your Arduino IDE installation libraries folder. 5. Finally, re-open your Arduino IDE. The RadioHead library is great and it works with almost all RF modules in the market. You can read more about this project here. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 84 Pinout Here’s the top view of NRF24L01 Client circuit WARNING Input voltage is of 1.9V~3.6V, do not exceed this voltage, otherwise it will fry your module. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 85 Follow the circuit above for your client. Then upload the code below which can be found in your Arduino IDE (after installing the RadioHead library). Go to File Examples RadioHead nrf24 nrf24_client. // nrf24_client #include #include // Singleton instance of the radio driver RH_NRF24 nrf24; // RH_NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf // RH_NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin // RH_NRF24 nrf24(8, 7); // For RFM73 on Anarduino Mini void setup() { Serial.begin(9600); while (!Serial) ; // wait for serial port to connect. Needed for Leonardo only if (!nrf24.init()) Serial.println("init failed"); // Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm if (!nrf24.setChannel(1)) Serial.println("setChannel failed"); if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm)) Serial.println("setRF failed"); } void loop() { Serial.println("Sending to nrf24_server"); // Send a message to nrf24_server uint8_t data[] = "Hello World!"; nrf24.send(data, sizeof(data)); nrf24.waitPacketSent(); // Now wait for a reply uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN]; uint8_t len = sizeof(buf); if (nrf24.waitAvailableTimeout(500)) { // Should be a reply message for us now if (nrf24.recv(buf, &len)) { Serial.print("got reply: "); Serial.println((char*)buf); } else LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 86 { Serial.println("recv failed"); } } else { Serial.println("No reply, is nrf24_server running?"); } delay(400); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/nrf24_client.ino Server circuit WARNING Input voltage is of 1.9V~3.6V, do not exceed this voltage, otherwise it will fry your module. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 87 Follow the circuit above for your server. Then upload the code below which can be found in your Arduino IDE (after installing the RadioHead library). Go to File Examples RadioHead nrf24 nrf24_server. // nrf24_server #include #include // Singleton instance of the radio driver RH_NRF24 nrf24; // RH_NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf // RH_NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin // RH_NRF24 nrf24(8, 7); // For RFM73 on Anarduino Mini void setup() { Serial.begin(9600); while (!Serial) ; // wait for serial port to connect. Needed for Leonardo only if (!nrf24.init()) Serial.println("init failed"); // Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm if (!nrf24.setChannel(1)) Serial.println("setChannel failed"); if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm)) Serial.println("setRF failed"); } void loop() { if (nrf24.available()) { // Should be a message for us now uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN]; uint8_t len = sizeof(buf); if (nrf24.recv(buf, &len)) { // NRF24::printBuffer("request: ", buf, len); Serial.print("got request: "); Serial.println((char*)buf); // Send a reply uint8_t data[] = "And hello back to you"; nrf24.send(data, sizeof(data)); nrf24.waitPacketSent(); Serial.println("Sent a reply"); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 88 } else { Serial.println("recv failed"); } } } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/nrf24_server.ino Demonstration In this project the client is sending a message “Hello World!” to the server via RF and the server is sending back the following message “And hello back to you”. Those messages are being displayed in the serial monitor. Here’s what you should see in your serial monitor and terminal windows (see Figure below). Note: On the left window, I’m establishing a serial communication with PuTTY.org. On the right window, I’m using the Arduino IDE Serial Monitor. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 89 Wrapping up You need to have some realistic expectations when using this module. They work very well when the receiver and transmitter are quite close to each other. If you separate them too far, you’ll lose the communication. The communication range will vary. It depends on how much noise in your environment, if there’s any obstacles and if you’re using an external antenna. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 90 433 MHz Transmitter/Receiver These RF modules are very popular among the Arduino tinkerers. The 433MHz is used on a wide variety of applications that require wireless control. These modules are very cheap, and you can use them with any microcontroller (MCU). Specifications RF 433MHz Receiver Frequency Range: 433.92 MHz Modulation: ASK Input Voltage: 5V Price: $1 to $2 Specifications RF 433MHz Transmitter Frequency Range: 433.92MHz Input Voltage: 3-12V Price: $1 to $2 Where to buy? Click the link below to compare the sensor at different stores and find the best price: 433 MHz Transmitter/Receiver LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 91 Arduino with RF 433MHz Modules This is a simple example to transmit a message via RF. Library download Here’s the library you need for this project: 1. Download the RadioHead library 2. Unzip the RadioHead library 3. Install the RadioHead library in your Arduino IDE 4. Restart your Arduino IDE The RadioHead library is great and it works with almost all RF modules in the market. You can read more about this project here. Receiver circuit LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 92 Follow the circuit above for your receiver. Then upload the code below. #include #include // Not actualy used but needed to compile RH_ASK driver; void setup() { Serial.begin(9600); // Debugging only if (!driver.init()) Serial.println("init failed"); } void loop() { uint8_t buf[12]; uint8_t buflen = sizeof(buf); if (driver.recv(buf, &buflen)) // Non-blocking { int i; // Message with a good checksum received, dump it. Serial.print("Message: "); Serial.println((char*)buf); } } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/433MHz/receiver.ino LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 93 Transmitter circuit Follow the circuit above for your transmitter. Then upload the code below. #include #include // Not actually used but needed to compile RH_ASK driver; void setup() { Serial.begin(9600); // Debugging only if (!driver.init()) Serial.println("init failed"); } void loop() { const char *msg = "Hello World!"; driver.send((uint8_t *)msg, strlen(msg)); driver.waitPacketSent(); delay(1000); } LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 94 SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/433MHz/transmitter.ino Demonstration In this project the transmitter is sending a message “Hello World!” to the receiver via RF. Those messages are being displayed in the serial monitor from the receiver. Here’s what you should see in your Arduino IDE serial monitor. Wrapping up You need to have some realistic expectations when using this module. They work very well when the receiver and transmitter are close to each other. If you separate them too far you’ll lose the communication. The communication range will vary. It depends on how much voltage that you’re supplying to your transmitter module, RF noise in your environment and if you’re using an external antenna. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 95 OLED Display The OLED display is shown in the following figure: It is a very small display made of 128 by 64 individual OLED pixels and no backlight is required. That OLED display is monochrome (white color), but there are other models with several colors. This display uses I2C communication. This means that it communicates with the Arduino using just 2 pins. Where to buy? Click the link below to compare the sensor at different stores and find the best price: 0.96 inch OLED display LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 96 Pin wiring OLED Pin Wiring to Arduino Uno Vin 5V GND GND SCL A5 SDA A4 If you’re using other Arduino board rather than the UNO, check out what are their SCL and SDA pins. Nano: SDA (A4); SCL(A5); MEGA: SDA (20); SCL(21); Leonardo: SDA (20); SCL(21); Libraries To control the OLED display you’ll need the “adafruit_GFX.h” library and the “adafruit_SSD1306.h” library. Installing the adafruit_GFX library 1. Click here to download the adafruit GFX library. You should have a .zip folder in your Downloads folder 2. Unzip the .zip folder and you should get Adafruit-GFX-Library-master folder 3. Rename your folder from Adafruit-GFX-Library- master to Adafruit_GFX_Library. 4. Move the Adafruit_GFX_Library folder to your Arduino IDE installation libraries folder 5. Finally, re-open your Arduino IDE Installing the adafruit_SSD1306 library 1. Click here to download the adafruit_SSD1306 library. You should have a .zip folder in your Downloads folder 2. Unzip the .zip folder and you should get Adafruit-GFX-Library-master folder LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 97 3. Rename your folder from Adafruit_SSD1306-master to Adafruit_SSD1306 4. Move the Adafruit_SSD1306 folder to your Arduino IDE installation libraries folder 5. Finally, re-open your Arduino IDE Tips for writing text using these libraries Here’s some functions that will help you handle the OLED display library to write text or draw simple graphics. display.clearDisplay() – all pixels are off display.drawPixel(x,y, color) – plot a pixel in the x,y coordinates display.setTextSize(n) – set the font size, supports sizes from 1 to 8 display.setCursor(x,y) – set the coordinates to start writing text display.print(“message”) – print the characters at location x,y Example: Display temperature and humidity In this example you will display the temperature and humidity in the OLED display. The aim of this project is to get familiar with the OLED display. The temperature and humidity will be measured using the DHT11 temperature and humidity sensor. If you’re not familiar with the DHT11 sensor we recommend that you check the DHT11/22 guide. Figure Name Arduino UNO OLED Display DHT11 Breadboard 10kΩ Resistor Check Price Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Find best price on LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE Maker Advisor 98 Jumper Wires Find best price on Maker Advisor Schematics Assemble all the parts as in the schematics below. Code Make sure you’ve installed the necessary libraries to control the OLED display. You also need to install the DHT library. Check the DHT11/22 temperature and humidity sensor guide. Then, you can upload the following code. /* * Random Nerd Tutorials - Rui Santos * Complete Project Details http://randomnerdtutorials.com */ #include #include #include #include #define DHTPIN 2 // what pin we're connected to #define DHTTYPE DHT11 // DHT 11 #define OLED_RESET 4 LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 99 Adafruit_SSD1306 display(OLED_RESET); // Initialize DHT sensor for normal 16mhz Arduino DHT dht(DHTPIN, DHTTYPE); void setup() { Wire.begin(); dht.begin(); // initialize dht display.begin(SSD1306_SWITCHCAPVCC, 0x3C);// initialize with the I2C addr 0x3C (for the 128x32)(initializing the display) Serial.begin(9600); } void displayTempHumid(){ delay(2000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius float t = dht.readTemperature(); // Read temperature as Fahrenheit float f = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { display.clearDisplay(); // clearing the display display.setTextColor(WHITE); //setting the color display.setTextSize(1); //set the font size display.setCursor(5,0); //set the cursor coordinates display.print("Failed to read from DHT sensor!"); return; } display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1); display.setCursor(0,0); display.print("Humidity: "); display.print(h); display.print(" %\t"); display.setCursor(0,10); display.print("Temperature: "); display.print(t); display.print(" C"); display.setCursor(0,20); display.print("Temperature: "); display.print(f); display.print(" F"); } void loop() { displayTempHumid(); display.display(); } LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 100 SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/display_tempreature_and_humidity_in_oled.ino Demonstration Here’s the OLED display in action after uploading the code. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 101 8x8 Dot Matrix The dot matrix that we’re going to use in this guide is an 8×8 matrix which means that it has 8 columns and 8 rows, so it contains a total of 64 LEDs. The MAX7219 chip makes it easier to control the dot matrix, by just using 3 digital pins of the Arduino board. I think the best option is to buy the dot matrix with the MAX7219 chip as a module, it will simplify the wiring. You can control more than one matrix at a time. For that you just need to connect them to each other, as they have pins in both sides to extend the dot matrix. Where to buy? Click the link below to compare the matrix at different stores and find the best price: MAX7219 LED matrix LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 102 Pin wiring You only need to connect 5 pins from the dot matrix to your Arduino board. The wiring is straightforward: Dot Matrix Pin Wiring to Arduino Uno GND GND VCC 5V DIN Digital pin CS Digital pin CLK Digital pin Libraries For making it easier to control the dot matrix, you need to download and install in your Arduino IDE the LedControl library. To install the library follow these steps: 1. Click here to download the LedControl library. You should have a .zip folder in your Downloads 2. Unzip the .zip folder and you should get LedControl-master folder 3. Rename your folder from LedControl-master to LedControl 4. Move the LedControl folder to your Arduino IDE installation libraries folder 5. Finally, re-open your Arduino IDE Using the LedControl library functions The easiest way to display something on the dot matrix is by using the functions setLed(), setRow() or setColumn(). These functions allow you to control one single led, one row or one column at a time. Here’s the parameters for each function: setLed(addr, row, col, state) addr is the address of your matrix, for example, if you have just 1 matrix, the addr will be zero. row is the row where the LED is located LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 103 col is the column where the LED is located state o It’s true or 1 if you want to turn the led on o It’s false or 0 if you want to switch it off setRow(addr, row, value) setCol(addr, column, value) Example: Displaying icons on the dot matrix In this example, you’ll display several faces sequentially on a dot matrix: a happy, a neutral, and a sad face. Index As previously stated, this matrix has 8 columns and 8 rows. Each one is indexed from 0 to 7. Here’s a figure for better understanding: If you want to display something in the matrix, you just need to know if in a determined row or column, the LEDs that are on or off. For example, if you want to display a happy face, here’s what you need to do: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 104 Schematic Connect the dot matrix as in the diagram below. Here’s a simple sketch that displays three types of faces: a sad face, a neutral face and a happy face. Upload the following code to your board: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 105 /* Created by Rui Santos All the resources for this project: http://randomnerdtutorials.com/ */ #include "LedControl.h" #include "binary.h" /* DIN connects to pin 12 CLK connects to pin 11 CS connects to pin 10 */ LedControl lc=LedControl(12,11,10,1); // delay time between faces unsigned long delaytime=1000; // happy face byte hf[8]= {B00111100,B01000010,B10100101,B10000001,B10100101,B10011001,B01000010,B00111100}; // neutral face byte nf[8]={B00111100, B01000010,B10100101,B10000001,B10111101,B10000001,B01000010,B00111100}; // sad face byte sf[8]= {B00111100,B01000010,B10100101,B10000001,B10011001,B10100101,B01000010,B00111100}; void setup() { lc.shutdown(0,false); // Set brightness to a medium value lc.setIntensity(0,8); // Clear the display lc.clearDisplay(0); } void drawFaces(){ // Display sad face lc.setRow(0,0,sf[0]); lc.setRow(0,1,sf[1]); lc.setRow(0,2,sf[2]); lc.setRow(0,3,sf[3]); lc.setRow(0,4,sf[4]); lc.setRow(0,5,sf[5]); lc.setRow(0,6,sf[6]); lc.setRow(0,7,sf[7]); delay(delaytime); // Display neutral face LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 106 lc.setRow(0,0,nf[0]); lc.setRow(0,1,nf[1]); lc.setRow(0,2,nf[2]); lc.setRow(0,3,nf[3]); lc.setRow(0,4,nf[4]); lc.setRow(0,5,nf[5]); lc.setRow(0,6,nf[6]); lc.setRow(0,7,nf[7]); delay(delaytime); // Display happy face lc.setRow(0,0,hf[0]); lc.setRow(0,1,hf[1]); lc.setRow(0,2,hf[2]); lc.setRow(0,3,hf[3]); lc.setRow(0,4,hf[4]); lc.setRow(0,5,hf[5]); lc.setRow(0,6,hf[6]); lc.setRow(0,7,hf[7]); delay(delaytime); } void loop(){ drawFaces(); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/dot_matrix_faces.ino In the end, you’ll have something like this: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 107 WS2812B Addressable RGB LED Strip The WS2812B LED strip is an addressable RGB LED strip. The information in this guide also works with other similar LED strips, such as strips of the WS28XX family, Neopixel strip and others. The WS2812B addressable LED strip comes in several varieties that differ in size, sealant or LED density. Choose the one that best fits your purposes. Where to buy? Click the link below to compare the LED strip at different stores and find the best price: WS2812B addressable RGB LED Strip LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 108 WS2812B Addressable RGB LED strip In the preceding figure you can see my WS2812B LED strip. It is 5 meters long and the LEDs are enclosed in a weatherproof silicone. In my opinion, this is the coolest type of LED strips. You can control the brightness and the color of each LED individually, which allows you to produce amazing and complex effects in a simple way. This LED strip is made by WS2812B LEDs wired in series. These LEDs have an IC built right into the LED. This allows a communication via a one-wire interface. This means that you can control lots of LEDs using just one digital pin of your Arduino. In the following figure you can see the chip inside the LED. The LED is an RGB LED and works like so. This kind of strips are very flexible and can be cut to any length you want. As you can see, the strip is divided into segments, and each segment contains one RGB LED. You can adjust its size by cutting the strip with a scissors in the right place (the proper places to cut the strip are marked). LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 109 These strips come with connectors at each end. I’ve decided to cut the connectors, and solder header pins. It’s handier if you want to connect the strip to an Arduino or to a breadboard. Powering the WS2812B LED Strip The LED strip should be powered using a 5V power source. At 5V, each LED draws about 50mA, when set to its full brightness. This means that for every 30 LEDs, the strip may draw as much as 1.5 A. Make sure you select a power source that matches the strip’s needs. If you end up using an external supply, don’t forget to connect the power supply ground to the Arduino ground. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 110 Schematics In this example, the WS2812B LED strip will be powered using the 5V Arduino pin. In my case, I’m controlling 14 LEDs. Bear in mind that if you want to control many LEDs, you’ll need to use an external power supply. Useful tips: Connect a capacitor with a capacitance between 100uF and 1000uF from power to ground to smooth out the power supply. Add a 220 or 470 Ohm resistor between the Arduino digital output pin and the strip data input pin to reduce noise on that line. Make your wires between the Arduino, power supply and the strip as short as possible to minimize voltage loss. If your strip gets damaged and doesn’t work, check if the first LED is broken. If so, cut it, resolder the header pins, and it should be working again. Code To control the WS2812B LED strip, you’ll need to download the FastLED library. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 111 Installing the FastLED library 1. Click here to download the FastLED library. You should have a .zip folder in your Downloads folder 2. Unzip the .zip folder and you should get FastLED-master folder 3. Rename your folder from FastLED-master to FastLED 4. Move the FastLED folder to your Arduino IDE installation libraries folder 5. Finally, re-open your Arduino IDE After installing the needed library, upload the following code to your Arduino board (this is an example sketch provided in the library examples folder). Go to File Examples FastLED ColorPalette or copy the code below. Note: you have to change #define NUM_LEDS to the number of LEDs that your strip currently has. SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/Arduino_WS2812B_Color_Palette.ino Demonstration In the end, this is what you’ll have. Amazing effects like this one: Or this one: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 112 And so on (…) Using an LED Strip Case These strips usually come with a removable tape, so that you can stick them wherever you want. The problem is that they don’t stick very well, so chances are that you’ll find your strip in the floor the following day. The solution: I found this strip case that diffuses the light well and you can screw it to a shelf, for example, if you want a permanent solution. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 113 Membrane Keypad A keypad allows you to interact with a microcontroller. You can salvage these keypads from old telephones or you can purchase them from most electronics stores for less than $2. They come in wide variety of shapes and sizes. The most common sizes are 3×4 and 4×4 and you can get keypads with words, letters and numbers written on the keys. These keypads very popular among the Arduino tinkerers. They are very cheap, and you can use them with any microcontroller (MCU). You can even create your own keypad from scratch. Where to buy? Click the link below to compare the sensor at different stores and find the best price: Membrane keypad How it works? A membrane keypad is a matrix consisting of rows and columns. Each key is assigned to a certain row and column (see the picture below). LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 114 On a 12 button keypad you have 4 rows and 3 columns. The first key would make a link between Row 1 and Column 1 (R1C1). 2 would be R1C2, 3 R1C3, * R4C1, 9 R3C3 and so on. Schematic Follow the next schematics. If your keypad is different from the one below, search for the datasheet online. Library download 1. Click here to download the Keypad library . You should have a .zip folder in your Downloads folder 2. Unzip the .zip folder and you should get Keypad folder 3. Move the Keypad folder to your Arduino IDE installation libraries folder 4. Finally, re-open your Arduino IDE LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 115 Code If your keypad doesn’t work with code below you might have to change the connections from the previous schematics. You have to make sure you follow your keypad’s datasheet. Note: If your keypad has more keys you can change lines 3 and 4 to add the right number of rows and columns. Then in line 5 you can change the array to match your keypad keys. #include "Keypad.h" const byte ROWS = 4; // number of rows const byte COLS = 3; // number of columns char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'#','0','*'} }; byte rowPins[ROWS] = {8, 7, 6, 5}; // row pinouts of the keypad R1 = D8, R2 = D7, R3 = D6, R4 = D5 byte colPins[COLS] = {4, 3, 2}; // column pinouts of the keypad C1 = D4, C2 = D3, C3 = D2 Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); void setup(){ Serial.begin(9600); } void loop(){ char key = keypad.getKey(); if (key != NO_KEY) Serial.println(key); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/Arduino_with_Keypad.ino LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 116 Demonstration In this project when you press a key, its value is displayed on the Arduino serial monitor. Here’s what you should see in your Arduino IDE serial monitor when you start pressing the keypad keys. Wrapping up Now you can create an interface for your Arduino using a keypad. You can also add an LCD to this project. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 117 1.8 TFT Display The 1.8 TFT is a colorful display with 128 x 160 color pixels. The display can load images from an SD card – it has an SD card slot at the back. The following figure shows the screen front and back view. This module uses SPI communication – see the wiring below. To control the display we’ll use the TFT library, which is already included with Arduino IDE 1.0.5 and later. Where to buy? Click the link below to compare the display at different stores and find the best price: 1.8 TFT display LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 118 Pin wiring The table below shows the 1.8 TFT wiring to Arduino UNO. 1.8 TFT Display Pin Wiring to Arduino Uno LED 3.3 V SCK 13 SDA 11 A0 or DC 9 RESET 8 CS 10 GND GND Note: different Arduino boards have different SPI pins. If you’re using another Arduino board, check the Arduino official documentation. Initializing the display The TFT display communicates with the Arduino via SPI communication, so you need to include the SPI library on your code. We also use the TFT library to write and draw on the display. #include #include Then, you need to define the CS, A0 (or DC) and RST pins: #define cs 10 #define dc 9 #define rst 8 Create an instance of the library called TFTscreen: TFT TFTscreen = TFT(cs, dc, rst); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 119 Finally, in the setup(), you need to initialize the library: TFTscreen.begin(); Display text To write text on the display, you can customize the screen background color, font size and color. To set the background color, use: TFTscreen.background(r, g, b); In which, r, g and b are the RGB values for a given color. To choose font color use: TFTscreen.stroke(r, g, b); To set the font size: TFTscreen.setTextSize(2); You can increase or decrease the number given as argument, to increase or decrease font size. Finally, to draw text on the display you use the following line: TFTscreen.text("Hello, World!", x, y); In which “Hello, World!” is the text you want to display and the (x, y) coordinate is the location where you want to start display text on the screen. Code The following example displays “Hello, World!” in the middle of the screen and changes the font color every 200 milliseconds. Copy the following code to your Arduino IDE and upload it to your Arduino board. /* * Rui Santos * Complete Project Details http://randomnerdtutorials.com */ // include TFT and SPI libraries LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 120 #include #include // pin definition for Arduino UNO #define cs 10 #define dc 9 #define rst 8 // create an instance of the library TFT TFTscreen = TFT(cs, dc, rst); void setup() { //initialize the library TFTscreen.begin(); // clear the screen with a black background TFTscreen.background(0, 0, 0); //set the text size TFTscreen.setTextSize(2); } void loop() { //generate a random color int redRandom = random(0, 255); int greenRandom = random (0, 255); int blueRandom = random (0, 255); // set a random font color TFTscreen.stroke(redRandom, greenRandom, blueRandom); // print Hello, World! in the middle of the screen TFTscreen.text("Hello, World!", 6, 57); // wait 200 miliseconds until change to next color delay(200); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/tft/write_text.ino LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 121 Here’s your “Hello, World!” text on the 1.8 TFT display. Display shapes The TFT library provides useful functions to draw shapes on the display: TFTscreen.point(x, y) – displays a point at the (x, y) coordinate TFTscreen.line(xStart, yStart, xEnd, yEnd) – draws a line that starts at (xStart, yStart) and ends at (xEnd, yEnd) TFTscreen.rect(xStart, yStart, width, height) – draws a rectangle with the top left corner at (xStart, yStart) with the defined width and height TFTscreen.circle(x, y, radius) – draws a circle with center at (x, y) with the specified radius Code The following example displays several shapes. Every time the code goes through the loop, the shapes change color. Copy the following code to your Arduino IDE and upload it to your Arduino board. /* * Rui Santos * Complete Project Details http://randomnerdtutorials.com */ // include TFT and SPI libraries #include LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 122 #include // pin definition for Arduino UNO #define cs 10 #define dc 9 #define rst 8 // create an instance of the library TFT TFTscreen = TFT(cs, dc, rst); void setup() { //initialize the library TFTscreen.begin(); // clear the screen with a black background TFTscreen.background(0, 0, 0); } void loop() { //generate a random color int redRandom = random(0, 255); int greenRandom = random (0, 255); int blueRandom = random (0, 255); // set the color for the figures TFTscreen.stroke(redRandom, greenRandom, blueRandom); // light up a single point TFTscreen.point(80,64); // wait 200 miliseconds until change to next figure delay(500); // draw a line TFTscreen.line(0,64,160,64); delay(500); //draw a square TFTscreen.rect(50,34,60,60); delay(500); //draw a circle TFTscreen.circle(80,64,30); delay(500); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 123 //erase all figures TFTscreen.background(0,0,0); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/tft/draw_shapes.ino Here’s the shapes on the display: Display images The 1.8 TFT display can load images from the SD card. To read from the SD card you use the SD library, already included in the Arduino IDE software. Follow the next steps to display an image on the display: 1) Solder header pins for the SD card. There are four pins opposite to the display pins, as shown in figure below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 124 2) The display can load images bigger or smaller than the display size (160 x 128 px), but for better results, edit your image size to 160 x 128 px. 3) The image should be in .bmp format. To do that, you can use a photo editing software and save the image as .bmp format. 4) Copy the image to the SD card and insert it on the SD card slot at the back of the display. 5) Wire the SD card pins to the Arduino by following the table below: SD card pins on TFT display Wiring to Arduino Uno CS 4 MOSI 11 MISO 13 SCK 12 Both the display and the SD card work with SPI communication, so you’ll have pins on the Arduino with two connections. 6) In the Arduino IDE go to File Examples TFT Arduino TFTBitmaLogo. 7) Edit the code, so that it searches for your image. Replace the “arduino.bmp” with the name of your image: // now that the SD card can be access, try to load the image file logo = TFTscreen.loadImage("arduino.bmp"); 8) Upload the code to your Arduino. Note: some people find issues with this display when trying to read from the SD card. We don’t know why that happens. In fact, we tested a couple of times and it worked well, and then, when we were about to record to show you the final result, the display didn’t recognized the SD card anymore – we’re not sure if it’s a problem with the SD card holder that doesn’t establish a proper connection with the SD card. However, we are sure these instructions work, because we’ve tested them before. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 125 Wrapping up In this guide we’ve shown you how to use the 1.8 TFT display with the Arduino: display text, draw shapes and display images. You can easily add a nice visual interface to your projects using this display. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 126 SIM900 GSM GPRS Shield The SIM900 GSM GPRS Shield is shown in figure below. GSM stands for Global System for Mobile Communications and is the global standard for mobile communications. GPRS stands for General Packet Radio Service. GPRS is a mobile service on the 2G and 3G cellular communication. Applications: The GSM GPRS shield is particularly useful as it allows to: Connect to the Internet over GPRS network Send and receive SMS Place and receive phones calls Its capabilities make it perfect for projects with Arduino like: Remote control of electronic appliances – sending an SMS to turn something on; Receive notifications – send SMS to your cell phone if movement is detected in your house; Receive sensor data – send periodic SMS to your cell phone with daily weather data. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 127 Features Here’s some of the most important features of the shield: Compatible with Arduino and clones Based on SIM900 module from SIMCOM Allows you to send SMS, MMS, GPRS and Audio via UART using AT commands. It has 12 GPIOs, 2 PWMs and built-in ADC of the SIM900 module Quad Band: 850; 900; 1800 and 1900 MHZ, so it should work in all countries with GSM (2G) networks Control via AT commands Supports RTC (real time clock) – it has a holder for a 3V CR1220 battery at the back Has microphone and headphone jacks for phone calls Where to buy? Click the link below to compare the sensor at different stores and find the best price: SIM900 GSM/GPRS Shield LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 128 Preliminary steps Before getting started with your SIM900 GSM GPRS module, you need to consider some aspects about the SIM card and the shield power supply. GSM coverage Ensure you have coverage on a GSM 850 MHz, GSM 900 MHz, DCS 1800 MHz or PCS 1900 MHz network. By GSM we mean 2G. Prepaid SIM Card We recommend that you use a prepaid plan or a plan with unlimited SMS for testing purposes. Otherwise, if something goes wrong, you may need to pay a huge bill for hundreds of SMS text messages sent by mistake. In this tutorial we’re using a prepaid plan with unlimited SMS. The shield uses the original SIM card size, not micro or nano. If you have micro or nano you may consider getting a SIM card size adapter. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 129 Turn off the PIN lock To use the SIM card with the shield, you need to turn off the pin lock. The easiest way to do this, is to insert the SIM card in your smartphone and turn off the pin lock in the phone security settings. In my case, I needed to go through: Settings Advanced Settings Security SIM lock and turn off the Lock SIM card with pin. Getting the right power supply The shield has a DC socket for power as shown in figure below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 130 Next to the power jack there is a toggle switch to select the power source. Next to the toggle switch on the board, there is an arrow indicating the toggle position to use an external power supply – move the toggle switch to use the external power supply as shown above. To power up the shield, it is advisable to use a 5V power supply that can provide 2A as the one shown below. It can also be powered with 9V 1A, or 12V 1A. You can find the right power adapter for this shield here. Make sure you select the model with 5V and 2A. SIM900 GSM GPRS Shield Hardware The figure below shows the back of the shield. It has a holder for the SIM card and for a 3V CR1220 battery for the RTC (real time clock). LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 131 The figure below shows the shield most important components on the board that you need to pay attention to. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 132 Getting started 1) Insert the SIM card into the SIM card holder – make sure you’ve read the preliminary steps in the previous section. 2) Make sure the antenna is well connected. 3) On the serial port select, make sure the jumper cap is connected as shown in figure below to use software serial. 4) Power the shield using an external 5V power supply. Make sure you select the external power source with the toggle switch next to the DC jack. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 133 5) To power up/down the shield press the power key for about 2 seconds. 6) Then, the Status LED will light up and the NetLight LED will blink every 800 ms until it finds the network. When it finds the network, the NetLight LED will start blinking every three seconds. Note: you can automatically turn on the shield via software. See how to do that in the Automatically turn on the shield section, after the code examples. 7) You can test if the shield is working properly by sending AT commands from the Arduino IDE using an FTDI programmer – as we’ll shown later in this guide. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 134 SIM900 AT commands set the SIM900 to text mode: AT+CMGF=1\r send SMS to a number: AT+CMGS=PHONE_NUMBER (in international format) read the first SMS from the inbox: AT+CMGR=1\r read the second SMS from the inbox: AT+CMGR=2\r read all SMS from the inbox: AT+CMGR=ALL\r call to a number: ATDP+ PHONE_NUMBER (in international format) hang up a call: ATH receive an incoming call: ATA For more information, you can check the SIM900 AT commands manual here. Testing the Shield with FTDI programmer To test if everything is working properly, you can test the shield by sending AT commands from the Arduino IDE serial monitor. For that, you need an FTDI programmer as the one shown in figure below. You can get an FTDI programmer like this here. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 135 1) Connect the FTDI programmer to the GSM shield as shown in figure below. 2) Open the Arduino IDE and select the right COM port. 3) Open the Serial monitor. 4) Select 19200 baud rate – the shield default setting is 19200 – and Carriage return. Write AT at the box highlighted in red and then press enter. See figure below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 136 5) The shield will respond with OK, if everything is working properly. Connecting the Shield to Arduino Connect the shield to the Arduino as shown in the schematic diagram below. Sending an SMS To send an SMS, upload the code below to your Arduino board. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 137 /********* Complete project details at http://randomnerdtutorials.com *********/ #include // Configure software serial port SoftwareSerial SIM900(7, 8); void setup() { // Arduino communicates with SIM900 GSM shield at a baud rate of 19200 // Make sure that corresponds to the baud rate of your module SIM900.begin(19200); // Give time to your GSM shield log on to network delay(20000); // Send the SMS sendSMS(); } void loop() { } void sendSMS() { // AT command to set SIM900 to SMS mode SIM900.print("AT+CMGF=1\r"); delay(100); // REPLACE THE X's WITH THE RECIPIENT'S MOBILE NUMBER // USE INTERNATIONAL FORMAT CODE FOR MOBILE NUMBERS SIM900.println("AT + CMGS = \"+XXXXXXXXXXXX\""); delay(100); // REPLACE WITH YOUR OWN SMS MESSAGE CONTENT SIM900.println("Message example from Arduino Uno."); delay(100); // End AT command with a ^Z, ASCII code 26 SIM900.println((char)26); delay(100); SIM900.println(); // Give module time to send SMS delay(5000); } LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 138 SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/GSM/sendSMS.ino In this code, you start by including the SoftwareSerial.h library and create a software serial port on pins 7 and 8 (Pin 7 is being set as RX and 8 as TX). #include SoftwareSerial SIM900(7, 8); The sendSMS() function created is what actually sends the SMS. This function uses the AT commands: AT+CMGF=1\r and AT + CMGS. You need to change the recipient’s mobile number at: (replace the X‘s with the recipient’s phone number) SIM900.println("AT + CMGS = \"++++++++++++++""); The recipient’s mobile number should be in international format. Then, at the following line you can edit the text you want to send. // REPLACE WITH YOUR OWN SMS MESSAGE CONTENT SIM900.println("Message example from Arduino Uno.") Reading received SMS To read incoming SMS, upload the code below to your Arduino. After uploading, wait 20 seconds for the shield to establish communication. Then, test the script by sending an SMS to the shield SIM card number. The SMS is shown on the Arduino serial monitor – baud rate: 19200. /********* Complete project details at http://randomnerdtutorials.com *********/ #include // Configure software serial port SoftwareSerial SIM900(7, 8); //Variable to save incoming SMS characters char incoming_char=0; LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 139 void setup() { // Arduino communicates with SIM900 GSM shield at a baud rate of 19200 // Make sure that corresponds to the baud rate of your module SIM900.begin(19200); // For serial monitor Serial.begin(19200); // Give time to your GSM shield log on to network delay(20000); // AT command to set SIM900 to SMS mode SIM900.print("AT+CMGF=1\r"); delay(100); // Set module to send SMS data to serial out upon receipt SIM900.print("AT+CNMI=2,2,0,0,0\r"); delay(100); } void loop() { // Display any text that the GSM shield sends out on the serial monitor if(SIM900.available() >0) { //Get the character from the cellular serial port incoming_char=SIM900.read(); //Print the incoming character to the terminal Serial.print(incoming_char); } } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/GSM/receiveSMS.ino In this code, you set the module to send the SMS data to the serial output: SIM900.print("AT+CNMI=2,2,0,0,0\r"); You store the incoming characters from the SMS message on the incoming_char variable. You read the chars using the SIM900.read() function. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 140 Making a phone call To make a phone call, upload the following code to your Arduino. Don’t forget to edit the code with the phone number you want to call. /********* Complete project details at http://randomnerdtutorials.com *********/ #include // Configure software serial port SoftwareSerial SIM900(7, 8); void setup() { // Arduino communicates with SIM900 GSM shield at a baud rate of 19200 // Make sure that corresponds to the baud rate of your module SIM900.begin(19200); // Give time to your GSM shield log on to network delay(20000); // Make the phone call callSomeone(); } void loop() { } void callSomeone() { // REPLACE THE X's WITH THE NUMER YOU WANT TO DIAL // USE INTERNATIONAL FORMAT CODE FOR MOBILE NUMBERS SIM900.println("ATD + +XXXXXXXXX;"); delay(100); SIM900.println(); // In this example, the call only last 30 seconds // You can edit the phone call duration in the delay time delay(30000); // AT command to hang up SIM900.println("ATH"); // hang up } LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 141 SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/GSM/makePhoneCall.ino To make the call, you use the callSomeone() function that uses the ATD command. SIM900.println("ATD + +XXXXXXXXX;"); You need to replace the X‘s (highlighted in red) with the phone number you want to call. Don’t forget to connect a microphone and earphones to make the call. In this code example, the call is hang up after 30 seconds, using the ATH command: SIM900.println("ATH"); Hanging up after 30 seconds is not very useful, but it works well for an example. The idea is that you use the ATH command when an event is triggered. For example, connect a push button to the Arduino, that when pressed sends the ATH command to hang up the phone. Answering incoming phone calls The following code answers incoming calls. /********* Complete project details at http://randomnerdtutorials.com *********/ #include // Configure software serial port SoftwareSerial SIM900(7, 8); char incoming_char=0; void setup() { // Arduino communicates with SIM900 GSM shield at a baud rate of 19200 // Make sure that corresponds to the baud rate of your module SIM900.begin(19200); // for GSM shield // For serial monitor LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 142 Serial.begin(19200); // Give time to log on to network. delay(20000); SIM900.print("AT+CLIP=1\r"); // turn on caller ID notification delay(100); } void loop() { // Display any text that the GSM shield sends out on the serial monitor if(SIM900.available() >0) { // Get the character from the cellular serial por // With an incomming call, a "RING" message is sent out incoming_char=SIM900.read(); // Check if the shield is sending a "RING" message if (incoming_char=='R') { delay(10); Serial.print(incoming_char); incoming_char=SIM900.read(); if (incoming_char =='I') { delay(10); Serial.print(incoming_char); incoming_char=SIM900.read(); if (incoming_char=='N') { delay(10); Serial.print(incoming_char); incoming_char=SIM900.read(); if (incoming_char=='G') { delay(10); Serial.print(incoming_char); // If the message received from the shield is RING // Send ATA commands to answer the phone SIM900.print("ATA\r"); } } } } } } When someone calls the SIM900 number, it sends a message saying “RING”. To know if someone is calling you, you can wait for incoming characters from the SIM900 and then, compare if it was a RING message. That’s what is done in this code. When it receives a RING message, you send the ATA command to answer the phone. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 143 SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/GSM/receiveCall.ino Automatically turn on the shield Instead of manually pressing the “power” key to turn on the shield, you can automatically turn on the shield via software. 1) First, you need to solder R13 connections on the shield as shown in the figure below – highlighted in red. 2) Connect D9 on the shield to the D9 Arduino pin as shown in the schematic below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 144 3) Add the following code snippet in the setup() function. This is the equivalent of pressing the shield “power” button. digitalWrite(9, HIGH); delay(1000); digitalWrite(9, LOW); delay(5000); Troubleshooting Shield doesn’t respond with OK Check your TX and RX connections to the Arduino. Try repeating the process by changing the TX with the RX pins. Also check if you have selected the software serial by placing the jumper cap on the appropriate place on the serial selector. Cannot see messages in the serial monitor To see the messages in the serial monitor, the shield and the Arduino’s serial port baud rate should be the same. The SIM900 GSM GPRS shield default baud rate is 19200. So, select the Arduino’s baud rate to 19200. However, if you need to change the shield baud rate, you can send the following AT command to change it to 19200 or other appropriate baud rate. AT+IPR=19200 Wrapping up This tutorial shows you how to send and receive SMS and making and receiving phone calls with the Arduino. You can apply the concepts learned in this tutorial to build your own projects to communicate over a cell network. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 145 SD Card Module The SD card module is especially useful for projects that require data logging. The Arduino can create a file in an SD card to write and save data using the SD library. There are different models from different suppliers, but they all work in a similar way, using the SPI communication protocol. The module used in this tutorial is the one shown in figure below (front and back view). This module works with micro SD card but there are others that work with SD card. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 146 Where to buy? Click the link below to compare the sensor at different stores and find the best price: Micro SD card module Pin wiring SD card module Wiring to Arduino Uno Wiring to Arduino Mega 3.3V or 5V (check module’s 3.3V or 5V (check module’s VCC datasheet) datasheet) CS 4 53 MOSI 11 51 CLK 13 52 MISO 12 50 GND GND GND Note: different Arduino boards have different SPI pins. If you’re using another Arduino board, check the Arduino official documentation. Preparing the SD card The first step when using the SD card module with Arduino is formatting the SD card as FAT16 or FAT32. Follow the instructions below. 1) To format the SD card, insert it in your computer. Go to My Computer and right click on the SD card. Select Format as shown in figure below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 147 2) A new window pops up. Select FAT32, press Start to initialize the formatting process and follow the onscreen instructions. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 148 Testing the SD card module Insert the formatted SD card in the SD card module. Connect the SD card module to the Arduino as shown in the circuit schematic below or check Pin wiring in previous section. Note: depending on the module you’re using, the pins may be in a different order. Code – CardInfo To make sure everything is wired correctly, and the SD card is working properly, in the Arduino IDE window go to File Examples SD CardInfo. Upload the code to your Arduino board. Make sure you have the right board and COM port selected. Open the Serial Monitor at a baud rate of 9600 and you should see your SD card information. If everything is working properly you’ll see a similar message on the serial monitor. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 149 Read and write to the SD card The SD library provides useful functions for easily write in and read from the SD card. To write and read from the SD card, first you need to include the SPI and SD libraries: #include #include You also have to initialize the SD card module at the Chip Select (CS) pin – in our case, pin 4. SD.begin(4); To open a new file in the SD card, you need to create a file object that refers to your data file. For example: dataFile = SD.open("data.txt", FILE_WRITE); The first parameter of this function is the name of the file, data.txt, and the FILE_WRITE argument enables you to read and write into the file. This line of code creates a file called data.txt on your SD card. If the data.txt file already exists, the Arduino will open the file instead of creating another one. To write data to the currently open file, you use: LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 150 dataFile.write(data); In which the dataFile is the file object created previously and the data is what you want to write in the file. You can also use the print() or println() functions to print data into the file: dataFile.print(data); dataFile.println(data); // followed by a new line To read the data saved on your file: dataFile.read(); You can only write within a file at once, so you need to close a file before proceeding to the next one. To close the data.txt file we’ve just created: SD.close("data.txt"); The argument of this function is the file you want to close, in this case data.txt. For a complete sketch on how to read and write, in your Arduino IDE go to File Examples SD ReadWrite. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 151 TCS3200 Color Sensor The TCS3200 color sensor can detect a wide variety of colors based on their wavelength. This sensor is especially useful for color recognition projects such as color matching, color sorting, test strip reading and much more. The TCS3200 color sensor – shown in the figure below – uses a TAOS TCS3200 RGB sensor chip to detect color. It also contains four white LEDs that light up the object in front of it. Specifications Power: 2.7V to 5.5V Size: 28.4 x 28.4mm (1.12 x 1.12″) Interface: digital TTL High-resolution conversion of light intensity to frequency Programmable color and full-scale output frequency Communicates directly to microcontroller LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 152 Where to buy? Click the link below to compare the sensor at different stores and find the best price: Color Sensor TCS3200 How does the TCS3200 sensor work? The TCS3200 has an array of photodiodes with 4 different filters. A photodiode is simply a semiconductor device that converts light into current. The sensor has: 16 photodiodes with red filter – sensitive to red wavelength 16 photodiodes with green filter – sensitive to green wavelength 16 photodiodes with blue filter – sensitive to blue wavelength 16 photodiodes without filter If you take a closer look at the TCS3200 chip you can see the different filters. By selectively choosing the photodiode filter’s readings, you’re able to detect the intensity of the different colors. The sensor has a current-to-frequency converter that converts the photodiodes’ readings into a square wave with a frequency that is proportional to the light intensity of the chosen color. This frequency is then, read by the Arduino – this is shown in the figure below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 153 Pin wiring Here’s the sensor pinout: Sensor Pin I/O Description GND (4) Power supply ground OE (3) I Enable for output frequency (active low) OUT (6) O Output frequency S0, S1(1,2) I Output frequency scaling selection inputs S2, S3(7,8) I Photodiode type selection inputs VDD(5) Voltage supply Filter selection To select the color read by the photodiode, you use the control pins S2 and S3. As the photodiodes are connected in parallel, setting the S2 and S3 LOW and HIGH in different combinations allows you to select different photodiodes. Look at the table below: Photodiode type S2 S3 Red LOW LOW Blue LOW HIGH No filter (clear) HIGH LOW Green HIGH HIGH LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 154 Frequency scaling Pins S0 and S1 are used for scaling the output frequency. It can be scaled to the following preset values: 100%, 20% or 2%. Scaling the output frequency is useful to optimize the sensor readings for various frequency counters or microcontrollers. Use the table below: Output frequency scaling S0 S1 Power down L L 2% L H 20% H L 100% H H For the Arduino, it is common to use a frequency scaling of 20%. So, you set the S0 pin to HIGH and the S1 pin to LOW. Color Sensing with Arduino and TCSP3200 In this example you’re going to detect colors with the Arduino and the TCSP3200 color sensor. This sensor is not very accurate but works fine for detecting colors in simple projects. For this example, you’ll need the following parts: Figure Name Arduino UNO TCS3200 Color Sensor Jumper Wires Check Price Find best price on Maker Advisor Find best price on Maker Advisor Find best price on Maker Advisor Schematic Wiring the TCSP3200 sensor to your Arduino is straightforward. Simply follow the next schematic diagram. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 155 Pin wiring Here’s the connections between the TCSP3200 and the Arduino: Sensor Pin Wiring to Arduino Uno S0 Digital pin 4 LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 156 S1 Digital pin 5 VCC 5V S3 Digital pin 6 S4 Digital pin 7 OUT Digital pin 8 Code You need two sketches for this project: 1. Reading and displaying the output frequency on the serial monitor. In this part you need to write down the frequency values when you place different colors in front of the sensor. 2. Distinguish between different colors. In this section you’ll insert the frequency values picked previously on your code, so that your sensor can distinguish between different colors. We’ll detect red, green and blue colors. 1. Reading the output frequency Upload the following code to your Arduino board. /********* Rui Santos Complete project details at http://randomnerdtutorials.com *********/ // TCS230 or TCS3200 pins wiring to Arduino #define S0 4 #define S1 5 #define S2 6 #define S3 7 #define sensorOut 8 // Stores frequency read by the photodiodes int redFrequency = 0; int greenFrequency = 0; int blueFrequency = 0; void setup() { // Setting the outputs LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 157 pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // Setting the sensorOut as an input pinMode(sensorOut, INPUT); // Setting frequency scaling to 20% digitalWrite(S0,HIGH); digitalWrite(S1,LOW); // Begins serial communication Serial.begin(9600); } void loop() { // Setting RED (R) filtered photodiodes to be read digitalWrite(S2,LOW); digitalWrite(S3,LOW); // Reading the output frequency redFrequency = pulseIn(sensorOut, LOW); // Printing the RED (R) value Serial.print("R = "); Serial.print(redFrequency); delay(100); // Setting GREEN (G) filtered photodiodes to be read digitalWrite(S2,HIGH); digitalWrite(S3,HIGH); // Reading the output frequency greenFrequency = pulseIn(sensorOut, LOW); // Printing the GREEN (G) value Serial.print(" G = "); Serial.print(greenFrequency); delay(100); // Setting BLUE (B) filtered photodiodes to be read digitalWrite(S2,LOW); digitalWrite(S3,HIGH); // Reading the output frequency blueFrequency = pulseIn(sensorOut, LOW); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 158 // Printing the BLUE (B) value Serial.print(" B = "); Serial.println(blueFrequency); delay(100); } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/color/Color_Sensor_TCS230_TCS3200_1.ino Open the serial monitor at a baud rate of 9600. Place a blue object in front of the sensor at different distances. You should save two measurements: when the object is placed far from the sensor and when the object is close to it. Check the values displayed on the serial monitor. The blue frequency (B) should be the lowest compared to the red (R) and green (G) frequency readings – see figure below. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 159 When we place the blue object in front of the sensor, the blue frequency (B) values oscillate between 59 and 223 (see highlighted values). Note: you can’t use these frequency values (59 and 223) in your code, you should measure the colors for your specific object with your own color sensor. Then, save your upper and bottom frequency limits for the blue color, because you’ll need them later. Repeat this process with a green and red objects and write down the upper and bottom frequency limits for each color. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 160 2. Distinguish between different colors This next sketch maps the frequency values to RGB values (that are between 0 and 255). In the previous step the maximum frequency for blue as 233 and the minimum was 59. So, 59 in frequency corresponds to 255 (in RGB) and 223 in frequency to 0 (in RGB). We’ll do this with the Arduino map() function. In the map() function you need to replace XX parameters with your own values. /********* Rui Santos Complete project details at http://randomnerdtutorials.com *********/ // TCS230 or TCS3200 pins wiring to Arduino #define S0 4 #define S1 5 #define S2 6 #define S3 7 #define sensorOut 8 // Stores frequency read by the photodiodes int redFrequency = 0; int greenFrequency = 0; int blueFrequency = 0; // Stores the red. green and blue colors int redColor = 0; int greenColor = 0; int blueColor = 0; void setup() { // Setting the outputs pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // Setting the sensorOut as an input pinMode(sensorOut, INPUT); // Setting frequency scaling to 20% digitalWrite(S0,HIGH); digitalWrite(S1,LOW); // Begins serial communication Serial.begin(9600); LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 161 } void loop() { // Setting RED (R) filtered photodiodes to be read digitalWrite(S2,LOW); digitalWrite(S3,LOW); // Reading the output frequency redFrequency = pulseIn(sensorOut, LOW); // Remaping the value of the RED (R) frequency from 0 to 255 // You must replace with your own values. Here's an example: // redColor = map(redFrequency, 70, 120, 255,0); redColor = map(redFrequency, XX, XX, 255,0); // Printing the RED (R) value Serial.print("R = "); Serial.print(redColor); delay(100); // Setting GREEN (G) filtered photodiodes to be read digitalWrite(S2,HIGH); digitalWrite(S3,HIGH); // Reading the output frequency greenFrequency = pulseIn(sensorOut, LOW); // Remaping the value of the GREEN (G) frequency from 0 to 255 // You must replace with your own values. Here's an example: // greenColor = map(greenFrequency, 100, 199, 255, 0); greenColor = map(greenFrequency, XX, XX, 255, 0); // Printing the GREEN (G) value Serial.print(" G = "); Serial.print(greenColor); delay(100); // Setting BLUE (B) filtered photodiodes to be read digitalWrite(S2,LOW); digitalWrite(S3,HIGH); // Reading the output frequency blueFrequency = pulseIn(sensorOut, LOW); // Remaping the value of the BLUE (B) frequency from 0 to 255 // You must replace with your own values. Here's an example: // blueColor = map(blueFrequency, 38, 84, 255, 0); blueColor = map(blueFrequency, XX, XX, 255, 0); // Printing the BLUE (B) value LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 162 Serial.print(" B = "); Serial.print(blueColor); delay(100); // Checks the current detected color and prints // a message in the serial monitor if(redColor > greenColor && redColor > blueColor){ Serial.println(" - RED detected!"); } if(greenColor > redColor && greenColor > blueColor){ Serial.println(" - GREEN detected!"); } if(blueColor > redColor && blueColor > greenColor){ Serial.println(" - BLUE detected!"); } } SOURCE CODE https://github.com/RuiSantosdotme/Random-NerdTutorials/blob/master/Projects/color/Color_Sensor_TCS230_TCS3200_2.ino To distinguish between different colors we have three conditions: When the R is the maximum value (in RGB parameters) we know we have a red object When G is the maximum value, we know we have a green object When B is the maximum value, we know we have a blue object Now, place something in front of the sensor. It should print in your serial monitor the color detected: red, green or blue. Your sensor can also detect other colors with more if statements. Wrapping up In this post you’ve learned how to detect colors with the TCSP3200 color sensor. You can easily build a color sorting machine by simply adding a servo motor. LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 163 Download Other RNT Products Random Nerd Tutorials is an online resource with electronics projects, tutorials and reviews. Creating and posting new projects takes a lot of time. At this moment, Random Nerd Tutorials has more than 200 free blog posts with complete tutorials using opensource hardware that anyone can read, remix and apply to their own projects: http://randomnerdtutorials.com To keep free tutorials coming, there’s also paid content or as I like to call “Premium Content”. To support Random Nerd Tutorials, you can download Premium content here. If you enjoyed this eBook, make sure you check all the others. Thanks for taking the time to read my work! Good luck with all your projects, -Rui Santos P.S. Click here for more Courses and eBooks like this one. Click here to Download other Courses and eBooks http://randomnerdtutorials.com/products LIKE ARDUINO? GET 25 ARDUINO STEP-BY-STEP PROJECTS COURSE 164
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.5 Linearized : No Page Count : 164 Language : pt-PT Title : Ultimate Guide for Arduino Sensors and Modules Author : Rui Santos;Sara Santos Creator : Microsoft® Word 2013 Create Date : 2018:09:18 11:25:14+01:00 Modify Date : 2018:09:18 11:25:14+01:00 Producer : Microsoft® Word 2013EXIF Metadata provided by EXIF.tools