
Een van mijn eerste Tkinter projecten was de PWM dimmer voor een enkele LED. Later heb ik hier een interface voor gebouwd waarbij je met PWM een 220V lamp kon dimmen. Ik heb meerdere PWM projecten gepubliceerd, maar de drie kanalen LED dimmer was de mooiste combinatie met hard- en software.
Deze tutorial is gebaseerd op de enkele PWM LED dimmer, dus bekijk deze tutorial eerst en kom daarna hier terug. Ik leg uit hoe PWM werkt. De drie kanalen LED dimmer was het ‘huiswerk’ dat ik nog moest doen… bij dezen.
Daar gaan we…
Grafische mode
Om het (grafische) resultaat te kunnen zien MOET je het script met de Tkinter onderdelen in de terminal van de desktop van de Raspberry Pi starten. Dat kan rechtstreeks op de Pi of via VNC vanaf een pc of laptop. Probeer je dit vanaf je SSH-terminal te starten, dan krijg je een foutmelding te zien zoals: tkinter.TclError: no display name and no $DISPLAY environment variable
Aansluitschema
We gebruiken drie leds. Sluit deze met de anode (+) aan op resp. pinnummer 40, 38 en 36 en iedere LED via een eigen weerstand van zo’n 220 Ohm aan de kathode (-) aan de ground (GND).
Kijk hier als je meer over de led wilt weten.
Als het script is opgestart zie je in de desktop het bedienpaneel met de drie schuiven. De bediening spreekt voor zich.
Code
from tkinter import *
import RPi.GPIO as GPIO
import time
import sys
LED1 = 40 # GPIO21
LED2 = 38 # GPIO20
LED3 = 36 # GPIO18
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(LED1, GPIO.OUT)
GPIO.setup(LED2, GPIO.OUT)
GPIO.setup(LED3, GPIO.OUT)
pwm1 = GPIO.PWM(LED1, 500)
pwm2 = GPIO.PWM(LED2, 500)
pwm3 = GPIO.PWM(LED3, 500)
pwm1.start(0)
pwm2.start(0)
pwm3.start(0)
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
data = self.read_values()
self.scaleOne = Scale(frame, from_=0, to=100, length=500, tickinterval=10, width=15,
troughcolor='red', sliderlength=30, font="Verdana 10", fg='black',
relief="groove", label="LED 1", orient=HORIZONTAL, command=self.updateOne)
self.scaleOne.grid(row=1)
self.scaleOne.set(data[0])
self.scaleTwo = Scale(frame, from_=0, to=100, length=500, tickinterval=10,
troughcolor='green', sliderlength=30, font="Verdana 10", fg='black',
relief="groove", label="LED 2", orient=HORIZONTAL, command=self.updateTwo)
self.scaleTwo.grid(row=2)
self.scaleTwo.set(data[1])
self.scaleThree = Scale(frame, from_=0, to=100, length=500, tickinterval=10,
troughcolor='blue', sliderlength=30, font="Verdana 10", fg='black',
relief="groove", label="LED 3", orient=HORIZONTAL, command=self.updateThree)
self.scaleThree.grid(row=3)
self.scaleThree.set(data[2])
Button1 = Button(root, text='Save values', font="Helvetica 10 bold", pady=5, padx=35,
bg='lightgrey', command=self.save_values)
# BUG GEREPAREERD: was self.save_values, moet self.reload_values zijn
Button2 = Button(root, text='Reload values', font="Helvetica 10 bold", pady=5, padx=35,
bg='lightgrey', command=self.reload_values)
Button3 = Button(root, text='Exit', font="Helvetica 10 bold", pady=5, padx=35,
bg='lightgrey', command=self.close_window)
Button1.pack(side=LEFT, expand=YES)
Button2.pack(side=LEFT, expand=YES)
Button3.pack(side=LEFT, expand=YES)
def close_window(self):
root.destroy()
def ensure_file_exists(self):
"""Controleer of my_file.txt bestaat; maak het aan met beginwaarde 0 als dat niet zo is."""
import os
if not os.path.isfile('my_file.txt'):
with open('my_file.txt', 'w') as f:
f.write('0\n0\n0')
print("my_file.txt niet gevonden — nieuw bestand aangemaakt met beginwaarde 0.")
def read_values(self):
"""Controleer het bestand, lees de waarden in en geef ze terug als lijst."""
self.ensure_file_exists()
with open('my_file.txt', 'r') as in_file:
data = in_file.read().split('\n')
# Zorg dat er altijd 3 geldige waarden zijn
try:
return [int(data[0]), int(data[1]), int(data[2])]
except (IndexError, ValueError):
return [0, 0, 0]
def reload_values(self):
"""Laad opgeslagen waarden in en pas de schuifregelaars aan."""
data = self.read_values()
self.scaleOne.set(data[0])
self.scaleTwo.set(data[1])
self.scaleThree.set(data[2])
print("Waardes herladen: " + str(data))
def updateOne(self, duty):
pwm1.ChangeDutyCycle(float(duty))
def updateTwo(self, duty):
pwm2.ChangeDutyCycle(float(duty))
def updateThree(self, duty):
pwm3.ChangeDutyCycle(float(duty))
def save_values(self):
"""Sla de huidige standen op in my_file.txt."""
data = [self.scaleOne.get(), self.scaleTwo.get(), self.scaleThree.get()]
with open('my_file.txt', 'w') as out_file:
out_file.write('\n'.join(str(d) for d in data))
print("Waardes " + str(data)[1:-1] + " zijn opgeslagen\n")
root = Tk()
root.geometry("550x350+250+75")
root.wm_title(' ')
Label(root, text="The PWM Dimmer", width=28, relief=RAISED, fg="black",
font=("Helvetica 24 bold")).pack()
Label(root, text="Powered by Raspberry Pi", fg="grey", font=("Helvetica 10")).pack()
app = App(root)
root.mainloop()
Conclusie
Het heeft even geduurd om het ‘huiswerk’ te maken, maar het resultaat mag er zijn. Met Tkinter is een fraaie bediening gemaakt waarmee je drie kanalen dmv PWM kunt besturen. Je kunt de waarden opslaan en op ieder gewenst moment weer opvragen.
Have A Nice Day!

Laat een reactie achter