.. note::
Hello, welcome to the SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community on Facebook! Dive deeper into Raspberry Pi, Arduino, and ESP32 with fellow enthusiasts.
**Why Join?**
- **Expert Support**: Solve post-sale issues and technical challenges with help from our community and team.
- **Learn & Share**: Exchange tips and tutorials to enhance your skills.
- **Exclusive Previews**: Get early access to new product announcements and sneak peeks.
- **Special Discounts**: Enjoy exclusive discounts on our newest products.
- **Festive Promotions and Giveaways**: Take part in giveaways and holiday promotions.
👉 Ready to explore and create with us? Click [|link_sf_facebook|] and join today!
Lesson 2 Flowing LED Lights
=================================
**Introduction**
------------------
In this lesson, we will learn how to make eight LEDs blink as flowing
water based on Raspberry Pi.
**Newly Added Components**
-----------------------------
.. image:: media_pi/image200.png
:width: 800
:align: center
**Schematic Diagram**
-------------------------
In this experiment, connect **220Ω**\ resistors to the anode (the longer
pin of the LED) respectively, then the resistors to Pin **11, 12, 13,
15, 16, 18, 22** and **24** of Raspberry Pi, and connect the cathode
(the short pin) of the LEDs to **GND**. We can see from the schematic
diagram that the anode of LED connect to a current-limiting resistor and
then to Raspberry Pi. Therefore, to turn on an LED, we need to make pins
high level. This process can be realized by programming.
.. image:: media_pi/image201.png
:width: 800
:align: center
**Build the Circuit**
-----------------------
.. image:: media_pi/image202.png
:width: 800
:align: center
**For C Language Users:**
--------------------------
**Command**
^^^^^^^^^^^^^
**1.** Go to the folder of the code.
.. raw:: html
.. code-block::
cd /home/pi/electronic-kit/for-raspberry-pi/c/Lesson_2_FlowingLedLights
**2.** Compile the code.
.. raw:: html
.. code-block::
gcc 2_FlowingLedLights.c -lwiringPi
.. note::
When using the gcc command, if you do not use -o,
it will automatically output as a.out.
**3.** Run the executable file.
.. raw:: html
.. code-block::
sudo ./a.out
Now, you will see these 8 LEDs are lit one by one from left
to right, and then one by one from right to left.
.. note::
If it does not work after running, or there is an error prompt: \"wiringPi.h: No such file or directory\", please refer to :ref:`C code is not working?`.
**Code**
^^^^^^^^^^^^
.. code-block:: C
#include
#include
const int LedPin[]={0,1,2,3,4,5,6,10}; //Define 8 LED pin
int main(void)
{
// When initialize wiring failed, print message to screen
if(wiringPiSetup() == -1){
printf("setup wiringPi failed !");
return 1;
}
for(int j=0;j<8;j++)
{
pinMode(LedPin[j], OUTPUT);// Set LedPin as output to write value to it.
digitalWrite(LedPin[j], LOW);
}
while(1){
for(int i=0;i<8;i++)
{
// LED on
digitalWrite(LedPin[i], HIGH);
delay(100);
}
for(int i=7;i>-1;i--)
{
// LED off
digitalWrite(LedPin[i], LOW);
delay(100);
}
}
return 0;
}
**Code Explanation**
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: C
4.const int LedPin[]={0,1,2,3,4,5,6,10};
Create an array, **LedPin** to define the eight LEDs then
connect them to **GPIO0** ~ **GPIO6**, **GPIO10** respectively.
.. code-block:: C
14. for(int j=0;j<8;j++)
15. {
16. pinMode(LedPin[j], OUTPUT);
17. digitalWrite(LedPin[j], LOW);
18. }
Use a **for** loop to set all 8 pins connected
to LEDs to **OUTPUT** mode and **LOW** level.
.. code-block:: c
21. for(int i=0;i<8;i++)
22. {
23. // LED on
24. digitalWrite(LedPin[i], HIGH);
25. delay(100);
26. }
Light up the LEDs in GPIO0~6 and GPIO10 successively.
i increases progressively from **0** to **7**, LED0 to LED7
changes accordingly, making it like a flowing LED light
from left to right.
.. code-block:: c
27. for(int i=7;i>-1;i--)
28. {
29. // LED off
30. digitalWrite(LedPin[i], LOW);
31. delay(100);
32. }
Close the LEDs in GPIO0~6 and GPIO10 successively. i
increases progressively from **7**
to **0**, LED0 to LED7 changes accordingly,
making it like a flowing LED light from right to left.
**For Python Language Users**
---------------------------------
**Command**
^^^^^^^^^^^^^
**1.** Go to the folder of the code
.. raw:: html
.. code-block::
cd /home/pi/electronic-kit/for-raspberry-pi/python
**2.** Run the code.
.. raw:: html
.. code-block::
sudo python3 2_FlowingLed.py
Now, you will see these 8 LEDs are lit one by one from left to right,
and then one by one from right to left.
**Code**
^^^^^^^^^^
.. note::
You can **Modify/Reset/Copy/Run/Stop** the code below. But before that, you need to go to source code path like ``electronic-kit/for-raspberry-pi/python``. After modifying the code, you can run it directly to see the effect.
.. raw:: html
.. code-block:: python
import RPi.GPIO as GPIO
import time
pins = [17,18,27,22,23,24,25,8]
# Define a setup function for some setup
def setup():
GPIO.setmode(GPIO.BCM)
for i in range(0, 8, 1):
GPIO.setup(pins[i], GPIO.OUT, initial=GPIO.LOW)
# Define a main function for main process
def main():
while True:
# print ('...LED ON')
# Turn on LED
for i in range(0, 8, 1):
GPIO.output(pins[i], GPIO.HIGH)
time.sleep(0.1)
# print ('LED OFF...')
# Turn off LED
for i in range(7, -1, -1):
GPIO.output(pins[i], GPIO.LOW)
time.sleep(0.1)
# Define a destroy function for clean up everything after the script finished
def destroy():
# Turn off LED
for i in range(0, 8, 1):
GPIO.output(pins[i], GPIO.LOW)
# Release resource
GPIO.cleanup()
# If run this script directly, do:
if __name__ == '__main__':
setup()
try:
main()
# When 'Ctrl+C' is pressed, the child program
# destroy() will be executed.
except KeyboardInterrupt:
destroy()
**Code Explanation**
^^^^^^^^^^^^^^^^^^^^^^
.. code-block::
9. for i in range(0, 8, 1):
10. GPIO.setup(pins[i], GPIO.OUT, initial=GPIO.LOW)
Use a **for** loop to set all 8 pins connected to LEDs to output mode
and LOW level.
.. code-block::
17. for i in range(0, 8, 1):
18. GPIO.output(pins[i], GPIO.HIGH)
19. time.sleep(0.1)
Variable **i** increases progressively from **0** to **8**,
increasing by 1 every time. Accordingly, set the pins in the array
**pins[i]** to **HIGH** respectively to light up the LEDs and the
lighting time is **0.1**\ s. Then, you will see 8 LEDs light up one
by one.
.. code-block::
23. for i in range(7, -1, -1):
24. GPIO.output(pins[i], GPIO.LOW)
25. time.sleep(0.1)
Variable **i** decreases progressively from **7** to **-1**,
decreasing by 1 every time. Then LED0~LED7 change accordingly, making
it like a flowing LED light from right to left.
**Phenomenon Picture**
-----------------------------
.. image:: media_pi/image203.png
:width: 800
:align: center