This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| en:iot-open:remotelab:ume:smartme:b3 [2019/10/29 13:13] – pczekalski | en:iot-open:remotelab:ume:smartme:b3 [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ==== IB3: PWM mode (~) of digital pins, programming threshold values ==== | ||
| + | |||
| + | |||
| + | === Target group === | ||
| + | This hands-on lab guide is intended for the Beginners but other target groups may benefit from it, treating it as a tool for advanced projects. | ||
| + | |||
| + | === Prerequisites === | ||
| + | |||
| + | == Liquid Crystal == | ||
| + | For this library, you may refer to the [[en: | ||
| + | |||
| + | == RGB LED == | ||
| + | The SmartME Network Laboratory Arduino nodes 1-5 are equipped with an RGB LED. | ||
| + | To connect other devices, however, only the green light component is available, exposed as a separate LED. | ||
| + | To turn on the green LED, you have to follow three steps: | ||
| + | - first, you have to define a variable with the number of the pin where the LED is connected to (int greenPin = 3;); | ||
| + | - second, you need to configure this variable in output mode (OUTPUT) by invoking the pinMode(pin, | ||
| + | - finally, you need to send to this variable a HIGH signal by using the digitalWrite(pin, | ||
| + | To turn off the LED, you need to send a LOW signal value to this pin. | ||
| + | You can make the LED flashing by tuning the delay of HIGH and LOW states. | ||
| + | The digital pins either give you 5V (when turned HIGH) or 0V (when turned LOW) and the output is a square wave signal. | ||
| + | PWM stands for Pulse Width Modulation and it is a technique used in controlling the brightness of the LED. The PWM pins are labelled with ~ sign. | ||
| + | The function analogWrite() can be used to generate a PWM signal in those digital pins that are labelled with ~ sign. The frequency of this generated signal for most pins will be about 490Hz and you can give the value from 0-255 using this function | ||
| + | * analogWrite(0) means a signal of 0% duty cycle. | ||
| + | * analogWrite(127) means a signal of 50% duty cycle. | ||
| + | * analogWrite(255) means a signal of 100% duty cycle. | ||
| + | The function random() generates pseudo-random numbers. The syntax is random(max) or random(min, max), where min represents the lower bound of the random value, inclusive (optional); and max represents the upper bound of the random value, exclusive. The function returns a long random number between min and max-1. | ||
| + | |||
| + | == The circuit: == | ||
| + | RGB GREEN pin = Arduino pin 3 (~) | ||
| + | |||
| + | === Scenario === | ||
| + | |||
| + | Initialize the LCD screen with the label “rand value”, then calculates a random value. If randomValue is lower than lowThreshold, | ||
| + | |||
| + | === Result === | ||
| + | You should see the LED on or off for 1 second, a second if the value is greater or less than the predefined threshold values. Next, you should see the randomly calculated value between 0 and 255 on the LCD, at that point, the LED should assign a brightness associated with that value, and keep it for 3 seconds. | ||
| + | |||
| + | === Start === | ||
| + | There are no special steps to be performed. | ||
| + | |||
| + | === Steps === | ||
| + | |||
| + | == Step 1 == | ||
| + | Include the LCD driver library: | ||
| + | <code c> | ||
| + | #include < | ||
| + | </ | ||
| + | |||
| + | == Step 2 == | ||
| + | |||
| + | Instantiate the software controller component for the LCD display. Initialize the LED pin. Declare the threshold values. | ||
| + | |||
| + | <code c> | ||
| + | // initialize the library with the numbers of the interface pins | ||
| + | LiquidCrystal lcd(7, 6, 5, 4, 13, 2); | ||
| + | // initializing LED Pin | ||
| + | int greenPin = 3; | ||
| + | // declaring the threshold values | ||
| + | int lowThreshold = 127; | ||
| + | int highTreshold = 128; | ||
| + | </ | ||
| + | |||
| + | == Step 3 == | ||
| + | Initialize the display and declare the LED pin as OUTPUT - preferably in the setup() function: | ||
| + | |||
| + | <code c> | ||
| + | void setup(){ | ||
| + | pinMode(greenPin, | ||
| + | lcd.begin(16, | ||
| + | lcd.print(" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | == Step 4 == | ||
| + | Implement loop() to do in the order: | ||
| + | calculate a random value between 0 and 255; | ||
| + | compare the random value with the lower threshold and with the upper threshold in order to decide whether to switch the LED on or off for 1 second; | ||
| + | display the random value on the screen, and use it to assign a specific brightness value to the LED, which must be held for 3 seconds. | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | void loop() { | ||
| + | // calculate a randomValue in the range 0-255 | ||
| + | int randomValue = random(255); | ||
| + | if (randomValue < lowThreshold){ | ||
| + | digitalWrite(greenPin, | ||
| + | } | ||
| + | if (randomValue > highTreshold){ | ||
| + | digitalWrite(greenPin, | ||
| + | } | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Result validation === | ||
| + | The state of the LED will depend on the random number calculated and on the threshold values that have been set. | ||
| + | The random value will be shown by the display monitor. | ||
| + | It also will affect the LED brightness for 3 seconds. | ||
| + | |||
| + | === Platformio.ini === | ||
| + | < | ||
| + | [env:uno] | ||
| + | platform = atmelavr | ||
| + | board = uno | ||
| + | framework = arduino | ||
| + | lib_ldf_mode=deep+ | ||
| + | lib_compat_mode=strict | ||
| + | lib_deps = | ||
| + | DHT sensor library@1.3.0 | ||
| + | | ||
| + | lib_deps_external = | ||
| + | | ||
| + | </ | ||
| + | |||
| + | === IB3.cpp === | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | #include " | ||
| + | // initialize the library with the numbers of the interface pins | ||
| + | LiquidCrystal lcd(7, 6, 5, 4, 13, 2); | ||
| + | // initializing LED Pin | ||
| + | int greenPin = 3; | ||
| + | // declaring of threshold values | ||
| + | int lowThreshold = 500; | ||
| + | int highTreshold = 600; | ||
| + | |||
| + | void setup(){ | ||
| + | // declaring LED pin as output | ||
| + | pinMode(greenPin, | ||
| + | // set up the LCD's number of columns and rows | ||
| + | lcd.begin(16, | ||
| + | // print the random value label to the LCD | ||
| + | lcd.print(" | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | int randomValue = random(255); | ||
| + | if (randomValue < lowThreshold){ | ||
| + | digitalWrite(greenPin, | ||
| + | } | ||
| + | if (randomValue > highTreshold){ | ||
| + | digitalWrite(greenPin, | ||
| + | } | ||
| + | | ||
| + | // print the random value of light to the LCD | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||