Passer au contenu principal Passer à la recherche Passer à la navigation principale
Menu

DIY RGB enseigne lumineuse avec Arduino


Dans ce tutoriel, nous vous montrons comment fabriquer vous-même une enseigne lumineuse RGB décorative et la contrôler avec un Arduino.

Ignorer la galerie de produits
Filament PLA yourDroid Noir 1,75 mm 1 kg Filament PLA yourDroid Noir 1,75 mm 1 kg – Image 2

Note moyenne de 4.88 sur 5 étoiles

(64)
Filament PLA yourDroid Noir 1,75 mm 1 kg
RBS13427

Disponible immédiatement

Prix régulier : 10,95 €
Filament PLA yourDroid Blanc 1,75 mm 1 kg Filament PLA yourDroid Blanc 1,75 mm 1 kg – Image 2

Note moyenne de 4.88 sur 5 étoiles

(57)
Filament PLA yourDroid Blanc 1,75 mm 1 kg
RBS13426

Disponible immédiatement

Prix régulier : 10,95 €
10
Filament PLA yourDroid bleu cobalt 1,75 mm 1 kg Filament PLA yourDroid bleu cobalt 1,75 mm 1 kg – Image 2

Note moyenne de 0 sur 5 étoiles

Filament PLA yourDroid bleu cobalt 1,75 mm 1 kg
RBS18080

Disponible immédiatement

Prix de vente : A partir de 13,19 € Prix régulier : 14,65 €
Étain à souder sans plomb 1mm 250g Sn99Cu1 avec âme de flux Étain à souder sans plomb 1mm 250g Sn99Cu1 avec âme de flux – Image 2

Note moyenne de 5 sur 5 étoiles

(3)
Étain à souder sans plomb 1mm 250g Sn99Cu1 avec âme de flux
RBS11018

Actuellement non disponible

Contenu : 0.25 Kilogramm (106,60 € / 1 Kilogramm)

Prix régulier : A partir de 26,65 €
Étain à souder 0,5mm 100g sans plomb Étain à souder 0,5mm 100g sans plomb – Image 2

Note moyenne de 5 sur 5 étoiles

(3)
Étain à souder 0,5mm 100g sans plomb
RBS15924

Disponible immédiatement

Contenu : 0.1 Kilogramm (98,00 € / 1 Kilogramm)

Prix régulier : A partir de 9,80 €
1 mètre de bande LED WS2812B ÉTANCHE 5050RGB DC5V 60 LED/m

Note moyenne de 5 sur 5 étoiles

(1)
1 mètre de bande LED WS2812B ÉTANCHE 5050RGB DC5V 60 LED/m
RBS14030

Actuellement non disponible

Prix régulier : A partir de 7,49 €
20
yourDroid UNO R3 carte de développement ATMEGA328P-PU compatible arduino yourDroid UNO R3 carte de développement ATMEGA328P-PU compatible arduino – Image 2

Note moyenne de 5 sur 5 étoiles

(6)
yourDroid UNO R3 carte de développement ATMEGA328P-PU compatible arduino
RBS14165

Disponible immédiatement

Prix de vente : A partir de 10,12 € Prix régulier : 12,65 €
Câbles jumper 40 broches femelle-mâle 20 cm

Note moyenne de 4.87 sur 5 étoiles

(30)
Câbles jumper 40 broches femelle-mâle 20 cm
RBS10038

Actuellement non disponible

Prix régulier : A partir de 1,09 €
Câble servo fiche-connecteur 3 broches 1 mètre

Note moyenne de 5 sur 5 étoiles

(1)
Câble servo fiche-connecteur 3 broches 1 mètre
RBS12958

Actuellement non disponible

Prix régulier : A partir de 1,25 €
Alimentation yourDroid 5V 3A avec connecteur DC 5,5x2,1 mm yourDroid Alimentation 12V 3A 5,5x2,1mm connecteur DC

Note moyenne de 5 sur 5 étoiles

(9)
Alimentation yourDroid 5V 3A avec connecteur DC 5,5x2,1 mm
RBS14095

Disponible immédiatement

Prix régulier : A partir de 7,39 €
Câble USB 2.0 USB-A vers USB-B 30 cm

Note moyenne de 0 sur 5 étoiles

Câble USB 2.0 USB-A vers USB-B 30 cm
RBS12341

Disponible immédiatement

Prix régulier : A partir de 0,75 €
yourDroid station de soudage réglable 48W ZD-99 avec accessoires yourDroid station de soudage réglable 48W ZD-99 avec accessoires – Image 2

Note moyenne de 4.87 sur 5 étoiles

(15)
yourDroid station de soudage réglable 48W ZD-99 avec accessoires
RBS13328

Disponible immédiatement

Prix régulier : A partir de 24,95 €
Coupe-fil / Pince coupante pour travaux électroniques Coupe-fil / Pince coupante pour travaux électroniques – Image 2

Note moyenne de 4.98 sur 5 étoiles

(26)
Coupe-fil / Pince coupante pour travaux électroniques
RBS10220

Disponible immédiatement

Prix régulier : A partir de 1,59 €
10
BST-5023 Pince à dénuder pour câbles 0,25-0,80 mm² 20-30 AWG BST-5023 Pince à dénuder pour câbles 0,25-0,80 mm² 20-30 AWG – Image 2

Note moyenne de 4.67 sur 5 étoiles

(3)
BST-5023 Pince à dénuder pour câbles 0,25-0,80 mm² 20-30 AWG
RBS12231

Disponible immédiatement

Prix de vente : A partir de 5,54 € Prix régulier : 6,15 €
ZD-10D Troisième main aide à la soudure avec loupe

Note moyenne de 4.5 sur 5 étoiles

(4)
ZD-10D Troisième main aide à la soudure avec loupe
RBS11380

Disponible immédiatement

Prix régulier : A partir de 5,65 €
Étape 1

Tout d'abord, les lettres doivent être imprimées sur une imprimante 3D dans la taille souhaitée. Pour cela, nous avons utilisé ce modèle gratuit de Thingiverse . Les fichiers indispensables sont les lettres individuelles ainsi que leurs couvercles correspondants, par exemple les fichiers Letter_R.stl et Letter_R_lens.stl pour la lettre R.

Étape 2

La bande LED est découpée en morceaux le long des pastilles de soudure, selon la longueur nécessaire pour chaque lettre. Trois câbles Dupont avec connecteur sont soudés aux pastilles de soudure de la première bande, qui seront ensuite connectés à l'Arduino. De l'autre côté, qui mènera à la lettre suivante, un câble normal est installé, puis soudé à nouveau à la bande LED.

Il est utile de torsader d'abord les extrémités des câbles dénudés et de les étamer avec un peu d'étain à souder.

Vous pouvez également appliquer un peu d'étain sur les pastilles de soudure de la bande LED au préalable. Il suffit alors de réchauffer brièvement l'étain déjà appliqué, et les câbles et la bande LED se connecteront plus facilement.

Il est extrêmement important de faire attention à la direction des bandes LED indiquée par des flèches.

Étape 3

La bande LED est maintenant fixée latéralement dans la lettre avec un peu de colle chaude, la LED étant dirigée vers l'intérieur et les câbles passés à travers les trous existants. Pour la lettre suivante, répétez l'opération décrite ci-dessus jusqu'à ce que toutes les lettres soient équipées de bandes LED.

Étape 4

Les capuchons de protection sont maintenant enfichés dans les lettres.

Étape 5

Les câbles Dupont soudés à la première lettre sont maintenant connectés à l'Arduino.
« 5V » de la bande LED est connecté à la broche 5 volts de l'Arduino.
« G » est connecté à GND et « D » est branché sur la broche 6 de l'Arduino.

Programmer l'Arduino

L'Arduino est connecté à la prise USB de l'ordinateur et nous lançons l'environnement de programmation « Arduino IDE ».

Pour notre exemple, nous avons d'abord besoin de la bibliothèque « Adafruit Neopixel », que nous ajoutons via « Outils » > « Gérer les bibliothèques... ».

Ensuite, nous ajoutons le code suivant dans le croquis et modifions encore la valeur derrière “#define LED_COUNT”. C'est là que le nombre de LED installées dans l'enseigne lumineuse est saisi. Ensuite, nous chargeons le code sur l'Arduino

Afficher / masquer les codes

1. Code principal : enregistrement des temps par RFID

#include "MFRC522.h"
#include "SPI.h"
#include "SdFat.h"
#include "RTClib.h"
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

// Name des RTC-Moduls
RTC_DS3231 rtc;

// Adressierung des OLED-Displays
#define I2C_ADDRESS 0x3C

// Buttons definieren
#define greenButton 2
#define redButton 3

// RFID Anschlüsse definieren
#define SDA 7
#define RST 9

// Name des OLED-Displays
SSD1306AsciiWire oled;

// Bezeichnung der SD-Karte
SdFat SD;

// Bezeichnung der CSV-Datei
File Zeiterfassung;

// RFID-Empfänger benennen und Pins zuordnen
MFRC522 mfrc522(SDA, RST);

// Pin der SD-Karte
int DatenPin = 10;

// Pin des Buzzer
int buzzer = 4;

// Wert zum Auslesen der Aktivität
int ButtonValue = 0;

// Variable zum Verfolgen der RFID-Aktivität
bool rfidGelesen = false;

// Trennzeichen für die CSV-Datei
const String TrennZeichen = ",";
String Mitarbeiter;

void setup() {
  Serial.begin(9600);
  SPI.begin();

  // OLED mit 128x64 Pixeln starten
  Wire.begin();
  oled.begin(&Adafruit128x64, I2C_ADDRESS);

  // Schriftart festlegen
  oled.setFont(Arial14);
  oled.println(F(" kommen gehen"));
  oled.println(F(" "));
  oled.println(F(" Zur Zeiterfassung"));
  oled.println(F(" Taste druecken!"));

  // Initialisierung des RFID-Empfängers
  mfrc522.PCD_Init();

  // Buttons als Input deklarieren
  pinMode(greenButton, INPUT_PULLUP);
  pinMode(redButton, INPUT_PULLUP);

  // Buzzer als Output deklarieren
  pinMode(buzzer, OUTPUT);

  // RTC-Modul starten
  if (!rtc.begin()) {
    Serial.println(F("RTC Initialisierung fehlgeschlagen!"));
    while (1);
  } else if (rtc.lostPower()) {
    // Setze die Uhrzeit nur, wenn die RTC ihre Zeit verloren hat
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    Serial.println(F("RTC Uhrzeit auf Kompilierzeit eingestellt!"));
  } else {
    Serial.println(F("RTC bereit und Uhrzeit korrekt!"));
  }

  // SD-Karte starten
  if (!SD.begin(DatenPin)) {
    Serial.println(F("Initialisierung der SD-Karte fehlgeschlagen!"));
  } else {
    Serial.println(F("SD-Karte gestartet!"));
  }

  // rtc.now() -> aktuelle Zeit holen
  DateTime aktuell = rtc.now();

  // Format des Datums festlegen
  char Datum[] = "DD.MM.YYYY";

  // Datum in String umwandeln und anzeigen
  Serial.print(aktuell.toString(Datum));

  // Format der Zeitangabe festlegen
  char Zeit[] = "hh:mm:ss";

  // Zeitangabe in String umwandeln und anzeigen
  Serial.print(aktuell.toString(Zeit));
}

void loop() {
  // Wenn grüner Button gedrückt wird
  if (digitalRead(greenButton) == LOW) {
    oled.clear();
    oled.println(F(" kommen"));
    oled.println(F(" "));
    oled.println(F(" Karte an das"));
    oled.println(F(" Lesegeraet halten!"));
    ButtonValue = 1; // Setze ButtonValue auf 1
    digitalWrite(buzzer, HIGH); // Ton an
    delay(100);
    digitalWrite(buzzer, LOW); // Ton aus
    delay(1000);
    rfidGelesen = true; // Erlaube das Lesen des RFID-Chips
  }

  // Wenn roter Button gedrückt wird
  if (digitalRead(redButton) == LOW) {
    oled.clear();
    oled.println(F(" gehen"));
    oled.println(F(" "));
    oled.println(F(" Karte an das"));
    oled.println(F(" Lesegeraet halten!"));
    ButtonValue = 2; // Setze ButtonValue auf 2
    digitalWrite(buzzer, HIGH); // Ton an
    delay(100);
    digitalWrite(buzzer, LOW); // Ton aus
    delay(1000);
    rfidGelesen = true; // Erlaube das Lesen des RFID-Chips
  }

  // Wenn RFID-Chip noch nicht gelesen wurde und einer der Buttons gedrückt wurde
  if (rfidGelesen == false) {
    return; // Warte auf Button-Druck
  }

  // vom RFID ermittelter Wert der Karte als Folge von Dezimalzahlen
  String WertDEZ;

  // String Mitarbeiter löschen, damit falsche Karte erkannt wird
  Mitarbeiter = "";

  // Wenn keine Karte in Reichweite ist
  if (!mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Wenn kein RFID-Sender ausgewählt wurde
  if (!mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  Serial.println(F("Karte entdeckt!"));
  digitalWrite(buzzer, HIGH); // Ton an
  delay(100);
  digitalWrite(buzzer, LOW); // Ton aus
  delay(1000);

  // Dezimal-Werte in String WertDEZ schreiben
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    WertDEZ = WertDEZ + String(mfrc522.uid.uidByte[i], DEC) + " ";
  }

  // dezimalen Wert anzeigen
  Serial.println("Wert in dezimal: " + WertDEZ);

  // Leerzeichen am Ende entfernen
  WertDEZ.trim();

  /*
  Karten abfragen und Namen der Mitarbeiter*innen zuordnen
  */
  if (WertDEZ == "227 211 219 29") Mitarbeiter = " Max Mustermann";
  if (WertDEZ == "147 50 48 28") Mitarbeiter = " Maxi Musterfrau";

  // Namen abfragen
  if (Mitarbeiter == " Max Mustermann" || Mitarbeiter == " Maxi Musterfrau") {
    // Daten in die Datei schreiben
    DatenSchreiben();
  }
  // bei falscher Karte
  else {
    Serial.println(F("Falsche Karte!"));
    oled.clear();
    oled.print(F(" Falsche Karte!"));
    delay(2000);
    oled.clear();
    oled.println(F(" kommen gehen"));
    oled.println(F(" "));
    oled.println(F(" Zur Zeiterfassung"));
    oled.println(F(" Taste druecken!"));
    ButtonValue = 0;
    rfidGelesen = false;
  }

  // Pause, damit die Daten nicht mehrfach geschrieben werden
  delay(2000);
}

void DatenSchreiben() {
  // Meldungen im Seriellen Monitor
  Serial.println(F("Schreibe Daten in Zeiterfassung.csv ... "));

  // Name der Mitarbeiter*in
  Serial.println("Mitarbeiter*in: " + Mitarbeiter);
  Serial.println(F("-----------------------------"));

  // rtc.now() -> aktuelle Zeit holen
  DateTime aktuell = rtc.now();
  char Datum[] = "DD.MM.YYYY ";

  // Datum in String umwandeln und anzeigen
  Serial.print(aktuell.toString(Datum));

  // Format der Zeitangabe festlegen
  char Zeit[] = "hh:mm:ss";

  // Zeitangabe in String umwandeln und anzeigen
  Serial.println(aktuell.toString(Zeit));

  // Ausgabe OLED
  oled.clear();
  oled.println(Mitarbeiter);
  oled.println(aktuell.toString(Datum));
  oled.println(aktuell.toString(Zeit));
  delay(2000);
  oled.clear();
  oled.print(F(" Gespeichert!"));
  delay(2000);

  // Reset für den nächsten Durchlauf
  rfidGelesen = false;

  /*
  FILE_WRITE - Datei zum Schreiben öffnen
  */
  Zeiterfassung = SD.open("Zeiterfassung.csv", FILE_WRITE);
  if (Zeiterfassung) {
    // Überschrift nach jedem Datensatz wiederholen
    Zeiterfassung.print(F("Mitarbeiter*in:"));
    Zeiterfassung.print(TrennZeichen);
    Zeiterfassung.print(F("Datum:"));
    Zeiterfassung.print(TrennZeichen);
    Zeiterfassung.print(F("Zeit"));
    Zeiterfassung.print(TrennZeichen);
    Zeiterfassung.print(F("Aktion"));
    Zeiterfassung.println();

    // Daten in die Datei schreiben
    Zeiterfassung.print(Mitarbeiter);
    Zeiterfassung.print(TrennZeichen);
    Zeiterfassung.print(Datum);
    Zeiterfassung.print(TrennZeichen);
    Zeiterfassung.print(Zeit);
    Zeiterfassung.print(TrennZeichen);
    if (ButtonValue == 1) {
      Zeiterfassung.print(F("kommen"));
    } else if (ButtonValue == 2) {
      Zeiterfassung.print(F("gehen"));
    }
    Zeiterfassung.println();
    Zeiterfassung.println();
  }

  // Datei schließen
  Zeiterfassung.close();
  Serial.println(F("Speichern abgeschlossen."));
  Serial.println();
  delay(200);

  // Reset für den nächsten Durchlauf
  ButtonValue = 0;
  oled.clear();
  oled.println(F(" kommen gehen"));
  oled.println(F(" "));
  oled.println(F(" Zur Zeiterfassung"));
  oled.println(F(" Taste druecken!"));
}

2. Configuration et test séparés du module RTC

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;

void setup() {
  Serial.begin(9600);
  Wire.begin();

  if (!rtc.begin()) {
    Serial.println("RTC konnte nicht gefunden werden!");
    while (1);
  }

  // RTC auf das Kompilierdatum und -zeit einstellen
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  Serial.println("RTC erfolgreich auf das Kompilierdatum und -zeit eingestellt!");
}

void loop() {
  // Hier können weitere Anweisungen eingefügt werden
}

3. Contrôle des LED NeoPixel (effets arc-en-ciel)

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
 
#define LED_PIN 6 // Der Pin an den "D" vom LED Streifen angeschlossen ist
#define LED_COUNT 80 // Anzahl der in der Leuchtschrift verbauten LED
 
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
 
void setup() {
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
 
  strip.begin();
  strip.show();
  strip.setBrightness(80); // Helligkeit 0 - 100
}
 
void loop() {
  rainbow(10);
  theaterChaseRainbow(50);
}
 
void colorWipe(uint32_t color, int wait) {
  for(int i=0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, color);
    strip.show();
    delay(wait);
  }
}
 
void theaterChase(uint32_t color, int wait) {
  for(int a=0; a<10; a++) {
    for(int b=0; b<3; b++) {
      strip.clear();
      for(int c=b; c < strip.numPixels(); c += 3) {
        strip.setPixelColor(c, color);
      }
      strip.show();
      delay(wait);
    }
  }
}
 
void rainbow(int wait) {
  for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
    for(int i=0; i < strip.numPixels(); i++) {
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show();
    delay(wait);
  }
}
 
void theaterChaseRainbow(int wait) {
  int firstPixelHue = 0;
  for(int a=0; a<30; a++) {
    for(int b=0; b<3; b++) {
      strip.clear();
      for(int c=b; c < strip.numPixels(); c += 3) {
        int hue = firstPixelHue + c * 65536L / strip.numPixels();
        uint32_t color = strip.gamma32(strip.ColorHSV(hue));
        strip.setPixelColor(c, color);
      }
      strip.show();
      delay(wait);
      firstPixelHue += 65536 / 90;
    }
  }
}