Progetto realizzato da Andrea Bellu, Stefano Longhena, Leonardo Baccalario.
Il progetto consisteva nel realizzare un circuito con un led RGB utilizzabile tramite un telecomando. Abbiamo poi realizzato un bot di telegram interfacciato con arduino tramite python e la sua libreria pyserial.
- Elegoo Mega2560
- RGB led
- 3x Resistenze 220Ω
- LCD1602 Module
- Potentiometer 10kΩ
- IR Receiver Module
- Remote Control
- Cavi
Utilizzando la libreria PySerial possiamo semplicemente mettere in "collegamento" arduino e python mediante una sola riga di codice:
ser = serial.Serial('nome porta')
Per passare dei comandi da python e arduino basterà eseguire:
ser.write("nome comando".encode())
che verrà letto da arduino utilizzando la funzione:
Serial.readStringUntil('\n');
Esempio del funzionamento del bot:
#main
def main() -> None:
update = Updater(data['TOKEN'], use_context=True)
dispatcher = update.dispatcher
dispatcher.add_handler(CommandHandler("disco", disco))
L'Updater è l'elemento che ci permette di interfacciarci direttamente col bot, mentre il dispatcher fa da "controllore". In questo snippet di codice vediamo come, nel caso ricevessimo dall'utente su telegram il comando '\disco', verrebbe chiamata la funzione disco.
#funzione disco
@restricted
def disco(update: tg.Update, context: CallbackContext) -> None:
update.message.reply_markdown_v2(
fr"DISCO MODE\!✨"
)
ser.write("disco".encode())
Quando la funzione disco viene chiamata il bot manda semplicemente un messaggio di feedback e la funzione manda la keyword ad arduino.
@restricted perchè le funzioni, e di conseguenza il bot, sono utilizzabili solo dagli utenti autorizzati.
def restricted(func): @wraps(func) def wrapped(update, context, *args, **kwargs): user_id = update.effective_user.id if user_id not in data['admins']: print(fr"Unauthorized access denied for {user_id}.") update.message.reply_markdown_v2(fr"Access denied for {update.effective_user.mention_markdown_v2()}\!") return return func(update, context, *args, **kwargs) return wrapped
Inizializzata quando il bot viene startato. Codice:
def start(update: tg.Update, context: CallbackContext):
...
reply_keyboard = [['/on', '/off', '/color', '/blink'], ['/disco', '/quit']]
update.message.reply_text(
'Choose an option:',
reply_markup=tg.ReplyKeyboardMarkup(
reply_keyboard, one_time_keyboard=False,
input_field_placeholder='Option?'),
)
Output:
Inizializzata quando viene chimato il comando '/color'. Codice:
@restricted
def color(update: tg.Update, context: CallbackContext) -> None:
inline_keyboard = [
[
tg.InlineKeyboardButton("Red", callback_data='Red'),
tg.InlineKeyboardButton("Green", callback_data='Green'),
],
[
tg.InlineKeyboardButton("Blue", callback_data='Blue'),
tg.InlineKeyboardButton("Yellow", callback_data='Yellow'),
],
[
tg.InlineKeyboardButton("Purple", callback_data='Purple'),
tg.InlineKeyboardButton("Light Blue", callback_data='Light blue'),
]
]
reply_markup = tg.InlineKeyboardMarkup(inline_keyboard)
update.message.reply_text('Choose a color:', reply_markup=reply_markup)
Output:
Tutti i comandi sono preceduti dallo '/':
- start: starta il bot;
- on: accende il led (luce bianca);
- off: spegne il led;
- color: (menù per cambiare colori);
- Colori disponibili:
- rosso;
- verde;
- blu;
- giallo;
- viola;
- azzurro;
- Colori disponibili:
- fastblink: lampeggio led (150ms delay);
- disco: sequenza casuale colori.
- quit: chiude la comunicazione con la seriale
- power button: accende/spegne il led (colore bianco);
- 1: accende il colore rosso;
- 2: accende il colore verde;
- 3: accende il colore blu;
- 4: spegne il colore rosso;
- 5: spegne il colore verde;
- 6: spegne il colore blu.
Per far funzionare il bot sarà necessario utilizzare il file .json nella repository ed aggiornarlo col token del bot che si vuole utilizzare e aggiungere l'id degli utenti autorizzati (l'id degli utenti che non sono autorizzati sono visualizzabili nel terminle del file python durante l'esecuzione del programma).
{ "TOKEN": "", "admins": [] }