Nota

Ciao, benvenuti nella Comunità degli Appassionati di SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Esplorate più a fondo Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati.

Perché unirsi?

  • Supporto Esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara & Condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime Esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e anteprime.

  • Sconti Speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni Festive e Regali: Partecipa a regali e promozioni festive.

👉 Pronto a esplorare e creare con noi? Clicca [qui] e unisciti oggi!

Lezione 53: Indicatore di Direzione

Questo progetto Arduino inizializza un display OLED e legge gli input da un joystick connesso ai pin analogici A0 e A1. Monitora continuamente la posizione del joystick per determinare la sua direzione di inclinazione e visualizza una freccia appropriata (su, giù, sinistra o destra) o un cerchio (se il joystick è centrato) sul display OLED.

Componenti Necessari

Per questo progetto, abbiamo bisogno dei seguenti componenti.

È decisamente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Universal Maker Sensor Kit

94

Universal Maker Sensor Kit

Puoi anche acquistarli separatamente dai link sottostanti.

Introduzione ai Componenti

Link di Acquisto

Arduino UNO R3 o R4

ACQUISTA

Modulo Joystick

ACQUISTA

Modulo Display OLED (SSD1306)

-

Breadboard

ACQUISTA

Cablaggio

../_images/Lesson_53_Direction_indicatorr_uno_bb.png

Codice

Nota

Per installare la libreria, utilizza il Gestore Librerie Arduino e cerca «Adafruit SSD1306» e «Adafruit GFX» e installale.

Analisi del Codice

  1. Inclusione delle librerie necessarie

    Il progetto utilizza tre librerie: Wire.h per la comunicazione I2C, Adafruit_GFX.h per le primitive grafiche e Adafruit_SSD1306.h per il controllo del display OLED.

    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    
  2. Definizione delle costanti e creazione di un oggetto display OLED

    Vengono definite le costanti per le dimensioni e l’indirizzo del display OLED. Viene creato l’oggetto display con questi parametri.

    #define SCREEN_WIDTH 128  // Larghezza del display OLED, in pixel
    #define SCREEN_HEIGHT 64  // Altezza del display OLED, in pixel
    #define OLED_RESET -1  // Pin di reset (o -1 se condivide il pin di reset di Arduino)
    #define SCREEN_ADDRESS 0x3C
    Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
    
  3. Definizioni dei pin e soglia per il joystick

    I pin analogici A0 e A1 sono utilizzati per il joystick, e viene definita una soglia per determinare se il joystick è centrato.

    const int xPin = A0;  // VRX collegato a
    const int yPin = A1;  // VRY collegato a
    const int threshold = 50;  // soglia per considerare il joystick centrato
    
  4. Funzione di setup: inizializzazione della comunicazione seriale e del display OLED

    Viene inizializzata la comunicazione seriale per il debug, e il display OLED viene inizializzato e pulito.

    void setup() {
      Serial.begin(9600);
      if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
        Serial.println(F("SSD1306 allocation failed"));
        for (;;);
      }
      display.clearDisplay();
    }
    
  5. Ciclo principale: lettura dei valori del joystick, determinazione della direzione e visualizzazione delle forme

    Il ciclo principale legge i valori del joystick, determina la direzione in base a questi valori e visualizza la forma corrispondente sul display OLED.

    ../_images/Lesson_53_Code_Analysis.png

    void loop() {
      display.clearDisplay();
      int xValue = analogRead(xPin);
      int yValue = analogRead(yPin) * -1;
      Serial.print("X: ");
      Serial.print(xValue);
      Serial.print("|Y: ");
      Serial.println(-yValue);
    
      float yLine1 = line1(xValue);
      float yLine2 = line2(xValue);
    
      int relX = xValue - 512;
      int relY = -yValue - 512;
    
      if (abs(relX) < threshold && abs(relY) < threshold) {
        drawCircle();
      } else if (yValue > yLine1 && yValue > yLine2) {
        drawUpArrow();
      } else if (yValue < yLine1 && yValue < yLine2) {
        drawDownArrow();
      } else if (yValue < yLine1 && yValue > yLine2) {
        drawRightArrow();
      } else if (yValue > yLine1 && yValue < yLine2) {
        drawLeftArrow();
      }
    
      display.display();
      delay(80);
    }
    
  6. Funzioni di aiuto: calcolo delle linee e disegno delle forme

    Queste funzioni aiutano nel calcolo delle linee utilizzate per la determinazione della direzione e nel disegno delle forme sul display OLED.

    float line1(float x) {
      return x - 1023;
    }
    
    float line2(float x) {
      return -x;
    }
    
    void drawUpArrow() {
      display.fillTriangle(49, 30, 64, 15, 79, 30, WHITE);
      display.fillRect(59, 30, 10, 20, WHITE);
    }
    
    void drawDownArrow() {
      display.fillTriangle(49, 36, 64, 51, 79, 36, WHITE);
      display.fillRect(59, 16, 10, 20, WHITE);
    }
    
    void drawRightArrow() {
      display.fillTriangle(70, 15, 85, 30, 70, 45, WHITE);
      display.fillRect(50, 25, 20, 10, WHITE);
    }
    
    void drawLeftArrow() {
      display.fillTriangle(60, 15, 45, 30, 60, 45, WHITE);
      display.fillRect(60, 25, 20, 10, WHITE);
    }
    
    void drawCircle() {
      display.fillCircle(64, 32, 10, WHITE);
      display.fillCircle(64, 32, 8, BLACK);
    }
    

Riferimento