Мигание светодиодом (COM-порт)

Arduino + Python 3
05.01.2021

(Всего голосов: 0)

Нам понадобятся:

1) Arduino (Uno, Nano или Mega).

Для программирования:

1) Среда разработки Python (у меня PyCharm);

2) Среда разработки Arduino IDE.

 

Посредством программы Arduino IDE загружаем скетч в плату Arduino:

int datafromUser = 0;

void setup(){
Serial.begin(9600); //инициализируем работу порта на скорости 9600 бод
pinMode(LED_BUILTIN, OUTPUT); //pin 13 (встроенный светодиод на Ардуино) инициализируем в качестве выхода
digitalWrite (LED_BUILTIN, LOW); //убираем напряжение с 13 пина (гасим светодиод)
Serial.println("Hi! I am Arduino"); //сигнал в порт о готовности к работе
}

void loop(){
while (Serial.available() != 0){ //пока есть доступные (полученные) данные
datafromUser = Serial.read();
if (datafromUser == '1'){
digitalWrite (LED_BUILTIN, HIGH); //в случае 1 светодиод загорается
}
if (datafromUser == '0'){
digitalWrite (LED_BUILTIN, LOW); //в случае 0 светодиод гаснет
}
}
}

 

Программу Arduino IDE можно закрыть, она нам больше не понадобится.

 

Управление светодиодом путем отправки "0" и "1" в порт

Загружаем код в среду разработки Python (перед запуском необходимо выбрать порт, к которому подключен модуль, у меня СОМ3):

#для взаимодействия с портом
import serial
#для использования функций времени
import time

#выбор порта и частоты обмена данными
ArduinoSerial = serial.Serial('COM3', 9600)
#ждем 2 секунды для стабилизации
time.sleep(2)

#вывод данных из порта
print(ArduinoSerial.readline())
print("Enter 1 to turn ON LED and 0 to turn OFF LED")

while 1: #Do this forever
    #чтение введенных пользователем данных
    var = input()
    #подтверждение ввода
    print("you entered", var)
    #в случае 1 светодиод загорается
    if var == '1':
        ArduinoSerial.write(b'1')
        print ("LED turned ON")
        time.sleep(1)
    #в случае 0 светодиод гаснет
    if var == '0':
        ArduinoSerial.write(b'0')
        print ("LED turned OFF")
        time.sleep(1)

 

Управление горением светодиода с помощью конопок "Включить" и "Выключить" посредством библиотеки Tkinter

Загружаем код в среду разработки Python (перед запуском необходимо выбрать порт, к которому подключен модуль, у меня СОМ3):

from tkinter import Tk, BOTH, Frame, Button
import serial
import time

class Example(Frame):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        #создание корневого окна; виджет Frame занимает все клиентское пространство корневого окна
        self.master.title("Мигание светодиодом")
        self.pack(fill=BOTH, expand=True)
        #стиль текста font = ("DejavuSansLight", "Arial", "TimesNewRoman", "ComicSans", "FreeSerif", "LatoThin")
        #по нажатию кнопки вызов функции led_on
        onButton = Button(self, text="Включить", font="Arial", command=self.led_on)
        #содание сетки; координаты кнопки в сетке (0, 0); padx (pady) - отступы по оси х (у)
        onButton.grid(row=0, column=0, padx=5, pady=5)
        #по нажатию кнопки вызов функции led_off
        offButton = Button(self, text="Выключить", font="Arial", command=self.led_off)
        #координаты кнопки в сетке (0, 1)
        offButton.grid(row=0, column=1, padx=5, pady=5)

    def led_on(self):
        #отправление '1' в порт
        ArduinoSerial.write(b'1')
        #ждем 1 секунду для стабильности
        time.sleep(1)

    def led_off(self):
        #отправление '0' в порт
        ArduinoSerial.write(b'0')
        time.sleep(1)

def main():

    global ArduinoSerial
    ArduinoSerial = serial.Serial('COM3', 9600)
    time.sleep(2)
    print(ArduinoSerial.readline())

    root = Tk()
    root.geometry("300x200+300+300")
    app = Example()
    root.mainloop()

if __name__ == '__main__':
    main()

Для более подробного изучения кода жми сюда.

 

Управление горением светодиода с помощью одной кнопки-переключателя

Загружаем код в среду разработки Python (перед запуском необходимо выбрать порт, к которому подключен модуль, у меня СОМ3):

from tkinter import Tk, BOTH, Frame, Button
import serial
import time

class Example(Frame):

    def __init__(self):
        super().__init__()
        #задаем переменную flash логического типа
        self.flash = False
        self.initUI()

    def initUI(self):
        self.master.title("Мигание светодиодом")
        self.pack(fill=BOTH, expand=True)
        ledButton = Button(self, text="Led", command=self.led)
        ledButton.pack(pady = 30)

    def led(self):
        if self.flash == False:
            ArduinoSerial.write(b'1')
        else:
            ArduinoSerial.write(b'0')
        self.flash = not self.flash
        time.sleep(1)

def main():

    global ArduinoSerial
    ArduinoSerial = serial.Serial('COM3', 9600)
    time.sleep(2)
    print(ArduinoSerial.readline())

    root = Tk()
    root.geometry("300x200+300+300")
    app = Example()
    root.mainloop()

if __name__ == '__main__':
    main()

 

Делаем дизайнерскую кнопку с помощью картинки png или jpg

Добавляем код в среду разработки Python.

Перед запуском необходимо:

1) выбрать порт, к которому подключен модуль (у меня СОМ3);

2) добавить картинку в папку, где хранится код и правильно ее проинициализировать. Учтите, большой размер картинки ограничит возможности размещения кнопки на экране.

 

from tkinter import Tk, BOTH, Frame, Button, FLAT, RAISED
from PIL import Image, ImageTk
import serial
import time

class Example(Frame):

    def __init__(self):
        super().__init__()
        self.flash = False
        self.initUI()

    def initUI(self):
        self.master.title("Мигание светодиодом")
        self.pack(fill=BOTH, expand=True)

        #создание кнопки
        toolbar = Frame(self.master, bd=1, relief=RAISED)
        self.img = Image.open("png/LED.png")
        eimg = ImageTk.PhotoImage(self.img)
        ledButton = Button(toolbar, image=eimg, relief=FLAT, command=self.led)
        ledButton.image = eimg
        ledButton.pack(padx=2, pady=2)
        toolbar.pack()

    def led(self):
        if self.flash == False:
            ArduinoSerial.write(b'1')
        else:
            ArduinoSerial.write(b'0')
        self.flash = not self.flash
        time.sleep(1)

def main():

    global ArduinoSerial
    ArduinoSerial = serial.Serial('COM3', 9600)
    time.sleep(2)
    print(ArduinoSerial.readline())

    root = Tk()
    root.geometry("300x200+300+300")
    app = Example()
    root.mainloop()

if __name__ == '__main__':
    main()


Оставить комментарий