Ciao a tutti. Sarebbe mia intenzione realizzare un controllo per gli ingressi di un amplificatore stereo. Utilizzando Arduino UNO, ho realizzato quindi due sketch, il principale che prevede pulsanti, un ricevitore IR e led (che andranno poi sostituiti con dei transistor) e un secondo che serve per visualizzare in un display oled il volume, il mute, l'ingresso, ed il tempo trscorso. Sono rimasti disponibili solo i pin A4 e A5 per la comunicazione I2C per il display. I due sketch, caricati singolarmente, funzionano, ma quando al primo unisco il secondo, il programma non gira più. Ho cercato di documentarmi, ma non ho trovato nulla che mi chiarisse il motivo di questo malfunzionamento. Spero che possiate aiutarmi. Grazie in anticipo. Questi sono gli sketch:
#include <OneButton.h>
#include <EEPROM.h>
#include <IRremote.h> //versione libreria 3.5.0
//const int RECV_PIN = 9;
int RECV_PIN = 9; //PIN a cui è collegato il ricevitore
IRrecv irrecv(RECV_PIN);
decode_results results; //Variabile che conterrà i valori ricevuti decodificati
#define cellaLed 0
OneButton button1(2, false); //false = pulldown resistenza da 10k verso massa
OneButton button2(7, false); //true = pullup resistenza 10k verso positivo
int led1 = 13;
int led2 = 12;
int led3 = 11;
int led4 = 10;
int buttonUp = 6;
int buttonDown = 5;
//int ledIngressi = 0;
int ledIngressi = EEPROM.read(cellaLed);
int ledOnOff = 0;
int ledMute = 0;
//int buzzer = 15;
static void click1();
static void click2();
//#define led_up 19
//#define led_down 18
#define led_up 15
#define led_down 3
#define puls_volume_up 17
#define puls_volume_down 16
int valore_up = 0;
int valore_down = 0;
void setup() {
Serial.begin(9600); // inizializza monitor seriale
irrecv.enableIRIn(); // inizializza il ricevitore IR
pinMode(16, INPUT); // vol+
pinMode(17, INPUT);
pinMode(8, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
pinMode(15, OUTPUT);
button1.setDebounceMs(20);
button1.attachClick(click1);
button2.setDebounceMs(20);
button2.attachClick(click2);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(buttonUp, INPUT);
pinMode(buttonDown, INPUT);
digitalWrite(buttonUp, HIGH); //abilitazione resistenze interne di pullup sugli ingressi
digitalWrite(buttonDown, HIGH); //Pulsanti avanti e indietro canali ingresso
}
void loop() {
button1.tick();
button2.tick();
valore_up = digitalRead(puls_volume_up);
if (valore_up == HIGH) {
digitalWrite(led_up, HIGH);
} else {
digitalWrite(led_up, LOW);
}
valore_down = digitalRead(puls_volume_down);
//int vol_down = digitalRead(16);
if (valore_down == HIGH) {
digitalWrite(led_down, HIGH);
} else {
digitalWrite(led_down, LOW);
if (digitalRead(buttonUp) == 0) {
//digitalWrite(buzzer, HIGH);
//delay(50);
//digitalWrite(buzzer, LOW);
ledIngressi++;
if (ledIngressi > 4) {
ledIngressi = 1;
}
delay(250);
}
if (digitalRead(buttonDown) == 0) {
//digitalWrite(buzzer, HIGH);
// delay(50);
//digitalWrite(buzzer, LOW);
ledIngressi--;
if (ledIngressi < 1) {
ledIngressi = 4;
}
delay(250);
}
if (ledIngressi == 1) {
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
}
if (ledIngressi == 2) {
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
}
if (ledIngressi == 3) {
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
digitalWrite(led4, LOW);
}
if (ledIngressi == 4) {
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, HIGH);
}
if (irrecv.decode(&results)) { //Decodifica i dati ricevuti e salva i dati in results
IrReceiver.resume();
if (results.bits > 0) {
//Controlla che i valori ricevuti abbiano un contenuto
Serial.println(F("======== COMANDO RICEVUTO =======")); //La macro (F("Testo qualsiasi")); stampa su monitor seriale
// ma non scrive in memoria perché utilizza la memoria flash
Serial.print("Valore: 0x");
Serial.println(results.value, HEX);
switch (results.value) {
//Comando registrato con 0x come prefisso, utilizzare una case per ogni comando.
//case 0x4DB23BC4:
//digitalWrite(buzzer, HIGH);
// delay(50);
// digitalWrite(buzzer, LOW);
// digitalWrite(led_up, HIGH);
// delay(250);
// digitalWrite(led_up, LOW);
// break;
case 0xFF18E7:
// digitalWrite(buzzer, HIGH);
// delay(50);
// digitalWrite(buzzer, LOW);
digitalWrite(led_up, HIGH);
delay(100);
digitalWrite(led_up, LOW);
//digitalWrite(led_down, HIGH);
break;
irrecv.resume();
case 0xFF4AB5:
// digitalWrite(buzzer, HIGH);
// delay(50);
//digitalWrite(buzzer, LOW);
digitalWrite(led_down, HIGH);
delay(1000);
digitalWrite(led_down, LOW);
break;
irrecv.resume();
case 0xFF629D: // tasto mute
digitalWrite(8, !digitalRead(8));
break;
irrecv.resume();
case 0xFFA25D: //tasto on off
digitalWrite(4, !digitalRead(4));
ledOnOff = digitalRead(4);
EEPROM.update(0, ledIngressi);
delay(200);
if (ledOnOff == LOW) {
digitalWrite(led_up, HIGH);
delay(5000); // Porta a zero il volume
digitalWrite(led_up, LOW);
break;
irrecv.resume();
case 0xFF10EF: // pulsante indietro --
ledIngressi--;
if (ledIngressi < 1) {
ledIngressi = 4;
}
delay(250);
break;
irrecv.resume();
case 0xFF5AA5: // pulsante avanti ++
ledIngressi++;
if (ledIngressi > 4) {
ledIngressi = 1;
}
delay(250);
break;
irrecv.resume();
default:
//case UNKNOWN:
Serial.println(F("Comando sconosciuto"));
irrecv.resume();
break;
}
irrecv.resume();
}
}
}
}
}
static void click1() { //pulsante di accensione on/off
//int ledOnOff = 0;
EEPROM.update(0, ledIngressi);
delay(200);
digitalWrite(4, !digitalRead(4));
int ledOff = 0;
ledOff = digitalRead(4);
if (ledOff == LOW) {
digitalWrite(led_up, HIGH);
delay(5000);
digitalWrite(led_up, LOW);
}
}
static void click2() { //pulsante mute
int ledMute = 0;
digitalWrite(8, !digitalRead(8));
ledMute = digitalRead(8);
if (ledMute == HIGH) {
Serial.println("MUTE ON");
} else {
Serial.println("MUTE OFF");
}
}
#include <Adafruit_SSD1306.h>
#define OLED_I2C_ADDRESS 0x3C
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
#define INPUT_PIN A0
Adafruit_SSD1306 oled(OLED_WIDTH, OLED_HEIGHT);
unsigned long tmp;
int secondi;
int minuti = 0;
int ore = 0;
int giorni = 0;
unsigned long variabile = 0;
void setup() {
if (!oled.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDRESS)) {
while (true)
;
}
oled.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDRESS);
oled.clearDisplay();
showHeader();
oled.display();
}
void loop() {
int potenziometroPin = analogRead(A0); //variabile (potenziometroPin) lettura valore potenziometro
float voltage = potenziometroPin * (5.0 / 1024.0);
int percentuale = map(potenziometroPin, 0, 1023, 0, 100);
tmp = (millis() / 1000);
secondi = tmp - (variabile * 10);
if (secondi > 60) {
secondi = secondi - 60;
}
if (secondi == 60) {
minuti = minuti + 1;
variabile = variabile + 6;
}
if (minuti >= 60) {
minuti = 0;
ore = ore + 1;
}
showValue("VOLUME " + String(percentuale) + " %");
// showValue("VOLUME " + String(percentuale));
oled.display();
delay(100);
}
void showHeader() {
oled.setTextSize(1);
oled.setTextColor(WHITE);
// oled.setCursor(OLED_WIDTH / 2, 4);
oled.setCursor(0, 4);
oled.print("AMPLIFICATORE 20+20W");
//oled.print("Voltmetro");
// oled.setCursor(112, 4);
//oled.print("A0");
//oled.drawLine(0, 15, 128, 15, WHITE);
oled.drawLine(0, 15, 128, 15, WHITE);
}
void showValue(String value) {
oled.fillRect(0, 16, 128, 48, BLACK);
oled.setTextSize(1);
// oled.setCursor(OLED_WIDTH / 2, OLED_HEIGHT / 2 + 8);
oled.setCursor(2, 25);
//printCenteredText(value);
oled.print(value);
oled.setCursor(2, 35);
oled.print("MUTE: MUTE");
oled.setCursor(2, 45);
oled.print("INGRESSO: PHONO ");
oled.setCursor(2, 55);
oled.print("TIMER ");
//oled.setCursor(20,50);
//oled.print(" :");
oled.print(ore);
oled.print(":");
oled.print(minuti);
oled.print(":");
oled.print(secondi);
//oled.print(millis()/1000/60);
//oled.print (" m");
}