Husnummer
Hem: 2013, 2014, 2015, 2016

Denna skiss är inte komplett, att visa alla kablar, motstånd och lysdioder blir alldeles för mycket skog.
Skissen visar I2C-bussen som är grön och gul kabel. Den gula kabeln är data och den gröna är klock.
Inget pullup-motstånd behövs när det är ett UNO-kort som är master på bussen, men kan behövas annars.
En kondensator kan vara bra att koppla mellan plus och GND nära IC om du har långa kablar med ström.

A0 till A2 är adress till expandern, se bild och tabell nedan.
P0 till P8 är IO-pinnar. Dessa är uppdelade i två grupper i detta experiment. P0 till P3 är en grupp och P4 till P7 en andra grupp.
VSS är GND.
INT är en interrupt-utgång om IC används som ingång. Den är inte kopplad i detta experiment.
SCL är I2C-bussens klocka.
SDA är I2C-bussens data.
VDD är 5 Volt in.

A0 till A2 är 3 bitar för att konfigurera IC:ens adress.
Det är viktigt att ingen lämnas okopplad, varje pinne ska kopplas till VDD eller VSS.
I exemplet ovan är det adress 21 i hex-form.
Om det ska fungera så måste varje IC ha en egen adress.
I detta experiment används adresserna 20, 21, 22. Lysdioderna får då nummer 0 till 24.
Tabellen visar vilken adress det blir.
| A2 | A1 | A0 | Hex adress |
|---|---|---|---|
| VSS | VSS | VSS | 20 |
| VSS | VSS | VDD | 21 |
| VSS | VDD | VSS | 22 |
| VSS | VDD | VDD | 23 |
| VDD | VSS | VSS | 24 |
| VDD | VSS | VDD | 25 |
| VDD | VDD | VSS | 26 |
| VDD | VDD | VDD | 27 |

Det är viktigt att vända lysdioden rätt, det långa benet är vänt mot motståndet.
Det korta kopplas till P0 till P3 eller P4 till P7.
I detta experiment används tre och en halv av dessa grupper.
3.5 x 8 = 22, alltså 22 st lysdioder.

Ena ändan av gruppens fyra motstånd tvinnas ihop och kopplas till 5 Volt.
I detta experiment är det 470 Ohm motstånd. Detta passar till lysdioder som har en framspänning från 2.7 till 3.5 Volt vid 5 Volts matning.

Kablarna från lysdioderna kopplades till IO-utgångarna nästan slumpvis.
Detta rättades till i animeringslistorna i UNO-sketchen.

Sladdar och lysdioder fixerades med smältlim.

Lådan är en tavelram som är köpt på IKEA i Kållered, tror att den heter RIBBA.
Det är distanser mellan passpartout och bakstycket så att lysdioderna får plats.
Det ser inte så snyggt ut, men du kan göra det bättre.
UNO-kortet som styr sitter ovanför ramen, kanske kan passa bättre att styra med en PRO MINI.
Längst ner på sidan finns stenciler för siffror.
Öppna de siffror (pdf-fil) du vill använda i Acrobat Reader.
Varje siffra är stor som ett A4 och vill du ha dem i mindre storlek får du välja det i utskriftshanteraren.
Välj Arkiv / Skriv ut.
Nu kan du skala din siffra så den får den storlek du vill ha.
Du bör inte skala ner dina siffror mindre än fem centimeter, för annars kommer hålen för tätt.
Tejpa fast dina siffror där du vill ha dem.
Nu kan du borra ett 5 mm hål på varje markering.
Inköpslista
- IC: PCF8574
- Blåa lysdioder
- Vita lysdioder
- Kabel
- Kopplingsdäck
- UNO-kort
- PRO MINI
Arduino-kod för Husnummer (main.cpp)
// -------------------------------------- // Husnummer // pc_h - 2015-05-23 // // Skapad av Per-Anders Hult. // Detta experiment ar for IC. PCF8574P 8-bit Expander PHILIPS I2C // Med en I2C-bus gar det att ansluta 8 st PCF8574P och varje har 8 utgangar, sa max 64 lysdioder. // I detta experiment ar det 3 st PCF8574P, sa max 24 lysdioder varav 22 anvands for att skapa "Husnummer 41" "code-preprocessor"> #include <Wire.h> // Lokalt varde och status for alla lysdioderna // Fran adress LEDs[0]=0x20=B00100000 till LEDs[7]=0x27=B00100111 byte LEDs[8] = {B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111}; // For att forsoka spara tid for I2C-bussen, sa uppdateras bara de PCF8574P som har fatt sin data andrad. byte LEDsNeedUpdate[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // Array-listor med lysdiodsnummer, det ar max 64 st sa "byte" racker till i storlek. byte row0[] = {4,10,3,9,8,5,11}; byte row1[] = {2,7,16,1,6,17}; byte row2[] = {0,15,14,13,18,12,21,20,19}; byte Char0[] = {0,1,2,3,4,5,6,7,12,13,14,15}; byte Char1[] = {8,9,10,11,16,17,18,19,20,21}; // Forsta adressen till PCF8574P byte FirstAddress = B00100000; // Hogsta nummer pa lysdioden, denna anvands vid slumpning. byte LastLed = 21; void setup(){ Wire.begin(); Serial.begin(9600); Serial.println("pc_h"); for (int i=0; i <= 7; i++){ UpdateLeds(i); } } void loop(){ // Animeringar Animatecharacters(150,25); AnimatePen(140); delay(1000); AnimateWhipeDown(200); delay(1000); AnimatePen(140); delay(1000); AnimateWhipeUp(200); delay(1000); SetAllLedOff(); delay(1000); AnimateFlicker(50,25); AnimateRandomOn(50,40); AnimateFlicker(100,10); AnimateRandomOff(50,40); delay(1000); SetChar0On(); delay(1000); SetChar1On(); delay(1000); } // Blinkar vaxlande "4" och "1" void Animatecharacters(int DelaySpeed, int Counts){ for (int c=0; c < Counts; c++){ SetAllLedOff(); for (int i=0; i < sizeof(Char0); i++){ SetLedOn(Char0[i]); } UpdateNeededLeds(); delay(DelaySpeed); SetAllLedOff(); for (int i=0; i < sizeof(Char1); i++){ SetLedOn(Char1[i]); } UpdateNeededLeds(); delay(DelaySpeed); } } void AnimateFlicker(int DelaySpeed, int Counts){ for (int i=0; i < Counts; i++){ SetAllLedOn(); delay(DelaySpeed); SetAllLedOff(); delay(DelaySpeed); } } void AnimateRandomOn(int DelaySpeed, int Counts){ SetAllLedOff(); for (int i=0; i < Counts; i++){ SetLedOn(random(0, LastLed)); UpdateNeededLeds(); delay(DelaySpeed); } SetAllLedOn(); } void AnimateRandomOff(int DelaySpeed, int Counts){ SetAllLedOn(); for (int i=0; i < Counts; i++){ SetLedOff(random(0, LastLed)); UpdateNeededLeds(); delay(DelaySpeed); } SetAllLedOff(); } void AnimateWhipeDown(int DelaySpeed){ int i; for (i=0; i < sizeof(row0); i++){ SetLedOff(row0[i]); } UpdateNeededLeds(); delay(DelaySpeed); for (i=0; i < sizeof(row1); i++){ SetLedOff(row1[i]); } UpdateNeededLeds(); delay(DelaySpeed); for (i=0; i < sizeof(row2); i++){ SetLedOff(row2[i]); } UpdateNeededLeds(); delay(DelaySpeed); } void AnimateWhipeUp(int DelaySpeed){ int i; for (i=0; i < sizeof(row2); i++){ SetLedOff(row2[i]); } UpdateNeededLeds(); delay(DelaySpeed); for (i=0; i < sizeof(row1); i++){ SetLedOff(row1[i]); } UpdateNeededLeds(); delay(DelaySpeed); for (i=0; i < sizeof(row0); i++){ SetLedOff(row0[i]); } UpdateNeededLeds(); delay(DelaySpeed); } void AnimatePen(int DelaySpeed){ SetAllLedOff(); byte a[] = {4,3,2,1,0,15,14,13,5,7,6,12,9,8,10,11,16,17,18,21,20,19}; for (int i=0; i < sizeof(a); i++){ SetLedOn(a[i]); UpdateNeededLeds(); delay(DelaySpeed); } } void SetChar0On(){ SetAllLedOff(); for (int i=0; i < sizeof(Char0); i++){ SetLedOn(Char0[i]); } UpdateNeededLeds(); } void SetChar1On(){ SetAllLedOff(); for (int i=0; i < sizeof(Char1); i++){ SetLedOn(Char1[i]); } UpdateNeededLeds(); } void SetAllLedOff(){ for (int i=0; i <= 7; i++){ LEDs[i] = B11111111; UpdateLeds(i); } } void SetAllLedOn(){ for (int i=0; i <= 7; i++){ LEDs[i] = B00000000; UpdateLeds(i); } } void SetLedOn(byte led){ byte ByteNumber = (led & B00111000) >> 3; byte BitNumber = (led & B00000111); bitClear(LEDs[ByteNumber], BitNumber); LEDsNeedUpdate[ByteNumber] = 1; } void SetLedOff(byte led){ byte ByteNumber = (led & B00111000) >> 3; byte BitNumber = (led & B00000111); bitSet(LEDs[ByteNumber], BitNumber); LEDsNeedUpdate[ByteNumber] = 1; } void UpdateNeededLeds(){ for (int i=0; i <= 7; i++){ if(LEDsNeedUpdate[i] == 1){ UpdateLeds(i); LEDsNeedUpdate[i] = 0; } } } void UpdateLeds(byte Byte){ Wire.beginTransmission(FirstAddress + Byte); Wire.write(LEDs[Byte]); Wire.endTransmission(); }
Denna sida är konverterad med hjälp av AI.
En sida för dig som bygger elektronik själv, experimenterar och laborerar.
Skapad av Per-Anders Hult för PchButik.se.




