7-Segment-LED am NXT

Die Anzeige des NXT ist von weiten schlecht ablesbar. Um einfache Zahlen anzuzeigen (z.B. aktuell gemessener Wert eines Sensors) ist eine 7-Segment-LED ideal. Diese kann man z.B. mit einem PCF8574 ansteuern. Der PCF8574 kann kaum Strom liefern aber entgegen nehmen. Daher eigenen sich nur LED-Anzeigen mit gemeinsamer Anode (also + Anschluss) wie z.B. Kingbright SA39-11GWA. Ansonsten würden die LEDs nur glimmen.

Hier ein Modell, wo eine solche LED-Anzeige zum Einsatz kommt. Dort wird eine 2-stellige LED-Anzeige benutzt und von 2 PCF8574 angesteuert.

Ein Prototyp :

led_prototyp

Den PCF8574 beschaltet man wie Folgt:

  • Pin 8 : oV an NXT-Pin 3 (rotes Kabel am NXT)
  • Pin 1,2,3: 0V (damit ist die I2C-Adresse 0x40)
  • Pin 4,5,6,7,9,10,11,12 : an die LED-Anzeige mit jeweils einem 1,5K Widerstand dazwischen
  • 13 leer
  • 14: SCL an NXT-Pin 5  (gelbes Kabel am NXT)
  • 16: SDA an NXT-Pin 6 (blaues Kabel am NXT)
  • 17: +4,3V-Power an NXT-Pin4 (grünes Kabel am NXT)

Zusätzlich kommt noch je ein 82K (PullUp-)Widerstand zwischen SCL und 4,3V-Power sowie SDA und 4,3V-Power.

Die LED-Anzeige muss auch noch an der gemeinsamen Anode mit 4,3V-Power verbunden werden (rotes Kabel). Das war’s.

Diese Schaltung verbraucht 0,1mA, wenn keine LED leuchtet und ca. 15mA wenn alle 8 (inkl. dem Punkt)  leuchten, also ca. 1,9mA je LED.

Hier ein Beispielprogramm in pbLua. Das sollte in anderen Sprachen ähnlich leicht sein.

-- test PCF8574 LED on NXT
-- 29.06.2013
-- pblua 2.0RC2

function delay(ticks)
  local t = nxt.TimerRead()
  repeat
  	until(t+ticks < nxt.TimerRead() )
end

-- waitI2C() - sits in a tight loop until the I2C system goes idle
function waitI2C(port)
  while( 0 ~= nxt.I2CGetStatus(port) ) do
  end
end

port = 1
inputType = 10
i2cAddress = 0x40 -- pcf8574

-- init
nxt.InputSetType(port, inputType)
nxt.InputSetDir(port, 1, 1)  --  digi0 and digi1 output
nxt.InputSetState(port, 1, 1) -- 0 sets the pin of digi0 and digi1 high
nxt.I2CInitPins(port)
waitI2C(port)

-- test
for i=0, 0xFF, 1 do
  nxt.I2CSendData( port, string.char(i2cAddress, i), 1 )

  waitI2C( port )

  delay(300)
end