OUTPUT – 7-segment display

Deze numerieke display is een basis unit voor de arduino. Hierboven op de foto staat de waarde van een lichtsensor. Het ‘min’ teken heb ik er zelf voorgezet.

Dit 4 x 7 segment display wordt aangestuurd door een heuse Atmel MEGA328P chip. Dezelfde die in de Arduino zit. Deze is alleen geprogrammeerd om alle individuele segmenten aan te sturen vanuit seriële opdrachten.

Je ziet dat ik naast 5 Volt (mag tussen 2,6 en 5,5 Volt zijn. Niet hoger!) alleen een geel draadje heb vast gesoldeerd aan de Rx-pin. Dit is de Recieve-pin. Er is geen Tx-pin (Transmit -pin), want er wordt alleen geschreven naar het display.

De gele Rx-draad gaat naar de Arduino. Misschien dat je denkt: “hey, bij digitale pin 0 op de arduino staat ook Rx, daar moet het gele draadje vast naartoe.” Maar dat is niet juist. Een zender moet altijd op een ontvanger worden aangesloten en andersom een ontvanger op de zender. De Rx van het display gaat naar de Tx op de arduino.

“Goed”, zul je zeggen, “Bij digitale pin 1 op de arduino staat Tx. Stop ik de gele draad daarin.” Helaas ook niet de beste oplossing.

Digitale Pin 0 en 1 van de Arduino Uno zijn gemarkeerd als Tx en Rx, omdat ze deel uitmaken van de seriële lijn die hardwarematig in de arduino zit gebakken. Dit is de seriële lijn die je gebruikt om je sketch te uploaden, en waarlangs je op je eigen computer data van de arduino kunt uitlezen (via de seriële monitor, die je onder het tabblad TOOLS in de arduino IDE vindt).

Je kunt de Rx van het display op de Tx van de Arduino zetten. Dan “ziet” het display de Tx van de arduino.

Je kunt ook de Rx van het display op de Rx van de Arduino zetten. Dan “ziet” het display de Tx van de computer waaraan je je arduino hebt hangen. Via de seriële monitor van de arduino IDE kun je dan het display aansturen. De Arduino is dan louter een doorgeefluik van seriële opdrachten.

Het is echter beter digitale pin 0 en 1 de mijden. Er is een goed alternatief die SOFTWARESERIAL heet. Hiermee kun je twee andere pinnetjes aanwijzen als Tx en Rx. In de sketch hieronder zie je dan ook twee Seriële communicatielijnen opengaan. De ‘normale’ Serial.begin(9600), die via pin 0 en 1 gaat. Daarnaast een softwareserial via pin 2 & 3.

Arduino Sketch

#include <SoftwareSerial.h>
   // routines inladen die nodig zijn voor
   // de softwareserial opdrachten

SoftwareSerial tweede_Rx_Tx(2, 3);
   // digitale pin 2 & 3 worden hier 2de Rx en Tx

void setup(){
  Serial.begin(9600);
   // openzetten 'noramale Rx & Tx'
  Serial.println("Deze tekst gaat via digitale pin 1");

  tweede_Rx_Tx.begin(9600);
   // het display werkt toevallig ook op 9600 baud.
   // Kun je overigens wel veranderen.
  tweede_Rx_Tx.write(0x76);
   // reset display, ofwel: zet 'cursor' aan het begin
   // van het display  
  tweede_Rx_Tx.write(0x77);
   // interpunctie wordt bepaald door de laatste 7 bits
   // van het volgende getal:
  tweede_Rx_Tx.write(0x80);
   // 0x80 = 10000000 Dus de laatste 7 bits zijn nul.
   //  (dus geen punten op display)
  tweede_Rx_Tx.write(0x7A);
   // contrast
  tweede_Rx_Tx.write(0x0F);
   // helderheid van 0x01 - 0xFF ( dus van 0-255)
}

void loop(){
  int licht = analogRead(A0);
   // lees de lichtsensor uit
  licht = map(licht,0,1023,0,999);
   // door de 'map()' opdracht, weet ik dat de waarde
   // hooguit 999 is. Dus 3 van de 4 beschikbare cijfers op
   // het display. Vandaar het min-teken om het gat te vullen.
  tweede_Rx_Tx.write("-");
  tweede_Rx_Tx.print(licht);
   // hier gaat de sensorwaarde naar de display
   // via pin 3 van de arduino, ofwel de Tx van de
   // software-serial.
  delay(500); // wacht 500 miliseconden voor nieuwe ronde
}

Output:

Hier de tabel met alle seriele opdrachten:

Er zijn een paar speciale opdrachten:

Hier een kleine sketch die de onderste 4 punten ‘bedient’ gebruikt:

#include <SoftwareSerial.h>
SoftwareSerial tweede_Rx_Tx(2, 3);

int teller = 0;

void setup(){
  tweede_Rx_Tx.begin(9600);
  tweede_Rx_Tx.write(0x76);
 }

void loop(){
  teller++;
  if (teller > 15){teller = 0;}
  tweede_Rx_Tx.write(0x77);
  tweede_Rx_Tx.write((0x80+teller));
  delay(500); // wacht 500 miliseconden voor nieuwe ronde
}

Output:

2 Responses to OUTPUT – 7-segment display

  1. Freek says:

    Leuke tutorial wederom :)
    Evt. kun je bij het mappen van de licht-waarde ook ‘constraint()’ gebruiken, gewoon omdat het kan…

  2. Paul says:

    Min, max, contraint en map hebben een logica die aardig obereenkomt met pannen, zoemen en grenzen stellen. Was al van plan dat in de ‘ tutorial’ te verwerken.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>