salve, sono nuovo e sono un principiante. mi sto approcciando da pochi mesi al mondo di arduino, e vorrei portare all'esame di stato un piccolo progetto, su cui incentro tutta la mia tesina, una macchina enigma.
uso come componenti: tre led (verde, giallo, rosso), un ricevitore IR con telecomando, display e potenziometro
ho già sviluppato un po di programma. sono riuscito a fare la sequenza di sblocco della macchina enigma, dove viene confrontata la sequenza data da me con quella predefinita.
il programma inizia cosi:
- i tre led si accendono e poi si spegnano, facendo capire che il programma è partito.
-sul display LCD, esce scritto ''Inserire pin'', cosi si può iniziare ad inserire una sequenza che poi sarà confrontata con quella predefinita per sbloccare la macchina.
-ad ogni input dato dal telecomando, corrisponde un blink giallo, arrivati a 4 numeri, viene confrontata la sequenza, per dirmi infine se la password è giusta o meno.
ora non so come andare avanti.
l'idea è quella di associare ad ogni numero del telecomando IR una lettera dell'alfabeto (tipo 1=a, 2=b, ecc..), naturalmente, inserisco un numero e dopo clicco il pulsante POWER, come se fosse il pulsante INVIO del Pc, questo per prevenire errori quanto inserisco i numeri a due cifre, quindi l'arduino aspetta fino a quando non gli do l'input del tasto POWER, per convertirlo poi nella lettera corrispondente.
cosi l'idea di criptografia è inserire determinati numeri che corrispondono alle lettere dell'alfabeto, per poi essere convertite dall'arduino, che mi mostra la parola decriptata sul display LCD.
cosi si forma una parola, una macchina enigma semplice, non complessa.
vi prego, aiutatemi, sono leggermente nel panico visto che gli esami sono alle porte.
vi allego il file di quello che ho programmato
#include "IRremote.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd (2,3,4,5,6,7);
int ricevitore=11;
int sequenza[]={3,4,5,6};
int codice[4];
/*
ho solo portato i led a 3
*/
int ledrosso=8;
int ledgiallo=9;
int ledverde=10;
int counter = 0;
/*
questi due servono uno per l'assegnamento della funzione
dimmipulsanti e l'altro per la sequenza dei led
*/
int risultato = 0;
int intro = 0;
boolean t=true;
IRrecv irrecv(ricevitore);
decode_results results;
/*
Invece di fare un return che con il telecomando
tramite il monitor seriale ho notato desse risultati
imprevedibili, usiamo una variabile così da avere
un risultato preciso
*/
int dimmipulsanti()
{
switch(results.value){
case 0xFF6897: risultato = 00; break;
case 0xFF30CF: risultato = 1; break;
case 0xFF18E7: risultato = 2; break;
case 0xFF7A85: risultato = 3; break;
case 0xFF10EF: risultato = 4; break;
case 0xFF38C7: risultato = 5; break;
case 0xFF5AA5: risultato = 6; break;
case 0xFF42BD: risultato = 7; break;
case 0xFF4AB5: risultato = 8; break;
case 0xFF52AD: risultato = 9; break;
default:
risultato = 10;
}
delay(500);
/*
delay tra le letture, per stessa ammissione
della elegoo il ricevitore ir fa un poco
schifo, e potrebbe segnalare un falso
positivo sul pulsante premuto
*/
}
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(ledrosso,OUTPUT);
pinMode(ledverde,OUTPUT);
pinMode(ledgiallo,OUTPUT);
/*
ho usato 3 led di colore diverso
per farti rendere conto dei vari passaggi
*/
lcd.begin(16, 2);
lcd.print("Inserire pin");
}
void loop() {
/*
È una semplice sequenza per farti capire che
il loop è ricominciato
*/
if(intro == 0)
{
delay(500);
digitalWrite(ledrosso, HIGH);
delay(500);
digitalWrite(ledgiallo, HIGH);
delay(500);
digitalWrite(ledverde, HIGH);
delay(500);
digitalWrite(ledrosso, LOW);
digitalWrite(ledgiallo,LOW);
digitalWrite(ledverde,LOW);
intro = 1;
}
if(irrecv.decode(&results))
{
dimmipulsanti(); // questa volta lo usiamo così perchè assegnamo una variabile nella funzione
codice[counter] = risultato; // e la scriviamo nell'array
/*
se apri il serial monitor queste due
righe di codice ti fanno vedere il
valore che hai appena messo e il
valore del counter
*/
lcd.setCursor(0,1);
lcd.print(codice[counter]);
digitalWrite(ledgiallo, HIGH); // accendo un attimo il led per mezzo secondo
delay(200);
digitalWrite(ledgiallo, LOW); // lo spengo
delay(200);
counter++;
irrecv.resume();
if(counter == 4) //se abbiamo inserito 4 cifre
{
counter = 0;
intro = 0;
for(int a=0;a<4;a++){
t= codice[a] == sequenza[a];
}
if(t==true){
digitalWrite(ledverde,HIGH);
lcd.setCursor(0, 1);
lcd.print("Password giusta");
delay(1000);
digitalWrite(ledverde,LOW);
for(int b=0;b<16;b++){
lcd.setCursor(b,1);
lcd.print(' ');
}
}
else{
digitalWrite(ledrosso,HIGH);
lcd.setCursor(0, 1);
lcd.print("Password errata");
delay(1000);
digitalWrite(ledrosso,LOW);
for(int b=0;b<16;b++){
lcd.setCursor(b,1);
lcd.print(' ');
}
}
}
}
}
sketch_mar03b.ino (4.25 KB)