// For Arduino UNO, o 2009
//versione con pulsante di bypass
// Questo è pensato per funzionare con un modulo HMC472
// destinato al controllo tramite encoder rotativo.
#include <Encoder.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// PCF85741A I2C interfaces usa 3Fh, indcazioni pr il tipo di display
// PCF85741 Interfaces usa 27h
LiquidCrystal_I2C lcd(0x27,20 ,4); //display 20 colonne 4 righe
Encoder enc(2, 3); //collegamenti encoder su arduino, 3 DATA - 2 CLK
float LCDdata = 0; // da 0 a 31.5 Dati per LCD
int AttenData = B00111111; // da 0 a 63 dati per l'attenuatore
//int bypass = 6;
//int bypassout = 7;
//int Relaydrive = 5; // uscita per il relè di baypass
int changerate = 4;
long lastPos = 0;
//int bypassState = 0;
void setup()
{
lcd.init(); //Inizializza l'LCD
lcd.backlight();
Serial.begin(9600); //per visualizzare sul plotter seriale
Serial.println("AttenData:"); // " " " " "
//pinMode (Relaydrive, OUTPUT);
// pinMode (bypass, INPUT);
// pinMode (bypassout, OUTPUT);
//digitalWrite (bypass, HIGH);
} //fine del Setup
// La seguente subroutine invia i dati al display LCD
void printToLCD(float)
{
lcd.setCursor(0, 0); //cursore su LCD sinistro
lcd.print("Attenuatore 0-31 dB");
lcd.setCursor(3, 1);
lcd.print(" DC - 3 Ghz");
lcd.setCursor(2, 2);
lcd.print(" Attenuazione = ");
lcd.setCursor(5, 3); // Display 20 per 4 quindi questo è l'inizio della "linea 3"
if (LCDdata < 10.0) lcd.print(" ");// mantiene stabile la posizione
lcd.print(LCDdata, 1); //con una cifra decimale
lcd.print(" dB ");
}
// fine stampa su LCD
void loop()
{
// Invia il valore dell'attenuatore alla porta B. (il bit 0 è per
// incrementi di 0,5 dB, quindi sono necessari sei bit.)
// da D8 a 13 va all'attenuatore da V1 a V6
DDRB = B00111111; //settaggio porta "B"
PORTB = AttenData;
// bypassState = digitalRead(bypass);
//if (bypassState == LOW){
//digitalWrite(bypassout, HIGH); //se premuto attiva il bypass temporaneamente
// lcd.setCursor(6, 3);
// lcd.print("bypass ");
//delay (2000);
// }
// else
//igitalWrite(bypassout, LOW);
// }
// SEZIONE ENCODER
//leggi l'encoder
// AttenData è limitato a un valore compreso tra 0 e 62
long newPos = enc.read() / changerate;
if (newPos != lastPos) //quindi l'encoder si è spostato
{
if (newPos < lastPos)
{ if (AttenData > 0) AttenData--; //se maggiore di 0 può diminuire
}
else
{ if (AttenData < 63) AttenData++;// se minore di 63 può aumentare
}
lastPos = newPos;
}
// AttenData (da 0 a 63) è diviso per due
// per ottenere da 0 a 31 per l'LCD.
LCDdata = AttenData / 2.0;
// Attendata è un int. le forze decimali/2.0
// con calcolo in virgola mobile.
LCDdata = LCDdata - 31.5; //a questo valore si può aggiungere un offset
// per i contatti di inserzione
printToLCD(AttenData);
//if (AttenData == 0)digitalWrite(Relaydrive, HIGH); //se 0 DB attiva il relè di BY-Pass
//if (AttenData > 0)digitalWrite(Relaydrive, LOW); //se maggiore di 0 DB disattiva il BY-Pass
Serial.println(newPos); //per visualizzare sul plotter seriale
delay (100); //ritardo 100ms
}