Dopo il collegamento di un display oled su I2C il programma non gira più

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");
}

Benvenuto, Giordano :slight_smile:
Per cortesia, pubblica anche l'insieme dei due programmi.
Poi non trovo puls_volume_up e puls_volume_down... Dovrebbero forse essere uguali a buttonUp e buttonDown?...
Ah, scusa... ci sono due #define!
Cerca di usare nomi ben comprensibili per le variabili e metti una descrizione, altrimenti non si riesce a seguire il programma!
Descrivi anche l'uso di ingressi e uscite.
Questo, per esempio, è un mio programma:

Gianluca

Metti un po' d'ordine: i pulsanti tutti di seguito, i LED tutti di seguito e si deve anche capire quali sono pin e quali sono variabili. Per i pin usa #define e chiamali PIN_VOL_UP, PIN_LED_UP, ...
Le costanti normalmente si scrivono in MAIUSCOLO, così si riconoscono facilmente.

Scusami, ma le mie conoscenze sono piuttosto limitate. Ho messo insieme questo sketch leggendo qua e la e non mi sono reso conto del caos generato.


#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include <OneButton.h>
#include <EEPROM.h>
#include <IRremote.h>  //versione libreria 3.5.0
#define OLED_I2C_ADDRESS 0x3C
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
#define INPUT_PIN A0
#define cellaLed 0
#define led_up 15
#define led_down 3
#define puls_volume_up 17
#define puls_volume_down 16
Adafruit_SSD1306 oled(OLED_WIDTH, OLED_HEIGHT);

//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


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 ledIngressi = EEPROM.read(cellaLed);
int ledOnOff = 0;
int ledMute = 0;

int buttonUp = 6;
int buttonDown = 5;
int valore_up = 0;
int valore_down = 0;


int secondi;
int minuti = 0;
int ore = 0;
int giorni = 0;
unsigned long variabile = 0;
unsigned long tmp;

static void click1();
static void click2();

void setup() {

  if (!oled.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDRESS)) {
    while (true)
      ;
  }
  oled.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDRESS);
  oled.clearDisplay();
  showHeader();
  oled.display();

  Serial.begin(9600);   // inizializza monitor seriale
  irrecv.enableIRIn();  // inizializza il ricevitore IR
  pinMode(16, INPUT);   // vol+
  pinMode(17, INPUT);
  //pinMode(18, OUTPUT);
  //pinMode(19, OUTPUT);

  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() {

  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);

  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();
        }
      }
    }
  }
}

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");
}



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");
  }
}

Volevo comunicare che la causa del blocco del programma era dovuto alla libreria Adafruit utilizzata per il display SSD1306 I2C che probabilmente occupava tutta la memoria disponibile. Nel mio caso ho risolto utilizzando la libreria U8X8, contenuta nella libreria U8g2. Ringrazio Gianluca per i consigli sulla scrittura del codice

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.