02-16-2022, 01:11 AM
(Ten post był ostatnio modyfikowany: 02-16-2022, 02:22 AM przez stAch.
Powód edycji: kod
)
Przy okazji testów nakładki GSM wpadł mi w ręce multiplekser CD74HC4067. Za ok 5zł i trochę czekania na paczkę z chin możemy w prosty sposób z 4 wejść lub wyjść otrzymać ich aż 16!
Mała płytka z jednej strony posiada kanały C0->C15 a z drogiej interfejs I/0 i tak S0->S3 podpinamy do INP1D->INP4D VCC do +5V GND i EN do masy wielkiej filozofii tu nie ma... podając +5v na SIG zniemiamy kierunek transmisji i 4 portami OUT możemy steroważ aż 16 przekazników!
Ja skupię tu się na wejściach cyfrowych bo tych brakuje mi w w LK - podpinam bowiem alarm a w zasadzie jego czujki do LK i miałem problem wpięcia kilku HC-SR501 pod jeden port aż wpadłem na ta stronę http://bildr.org/2011/02/cd74hc4067-arduino/
Podając na wejście C0 stan wysoki w zasadzie nic się nie dzieje bo LK odczytuje nam stany wejść jako 0000 lecz dalej zaczyna się zabawa
poniżej rozpiska wszystkich kanałów.
{0,0,0,0}, //channel 0
{1,0,0,0}, //channel 1
{0,1,0,0}, //channel 2
{1,1,0,0}, //channel 3
{0,0,1,0}, //channel 4
{1,0,1,0}, //channel 5
{0,1,1,0}, //channel 6
{1,1,1,0}, //channel 7
{0,0,0,1}, //channel 8
{1,0,0,1}, //channel 9
{0,1,0,1}, //channel 10
{1,1,0,1}, //channel 11
{0,0,1,1}, //channel 12
{1,0,1,1}, //channel 13
{0,1,1,1}, //channel 14
{1,1,1,1} //channel 15
może by dodać jego obsługę do LK. wizualizacja 16 kanałów-> 4 kolejne kanały odpowiadają strefie, każdy kanał strefy ustawia stan wysoki strefy. strefa zachowuje się jak dotychczas INP1D w zadaniach i innych opcjach by zbytnio nie gmatwać kodu np 4 pierwsze kanały alarmu powodują zdarzenie inp1d kolejne 4 zdarzenie imp2d itd
Mała płytka z jednej strony posiada kanały C0->C15 a z drogiej interfejs I/0 i tak S0->S3 podpinamy do INP1D->INP4D VCC do +5V GND i EN do masy wielkiej filozofii tu nie ma... podając +5v na SIG zniemiamy kierunek transmisji i 4 portami OUT możemy steroważ aż 16 przekazników!
Ja skupię tu się na wejściach cyfrowych bo tych brakuje mi w w LK - podpinam bowiem alarm a w zasadzie jego czujki do LK i miałem problem wpięcia kilku HC-SR501 pod jeden port aż wpadłem na ta stronę http://bildr.org/2011/02/cd74hc4067-arduino/
Podając na wejście C0 stan wysoki w zasadzie nic się nie dzieje bo LK odczytuje nam stany wejść jako 0000 lecz dalej zaczyna się zabawa
poniżej rozpiska wszystkich kanałów.
{0,0,0,0}, //channel 0
{1,0,0,0}, //channel 1
{0,1,0,0}, //channel 2
{1,1,0,0}, //channel 3
{0,0,1,0}, //channel 4
{1,0,1,0}, //channel 5
{0,1,1,0}, //channel 6
{1,1,1,0}, //channel 7
{0,0,0,1}, //channel 8
{1,0,0,1}, //channel 9
{0,1,0,1}, //channel 10
{1,1,0,1}, //channel 11
{0,0,1,1}, //channel 12
{1,0,1,1}, //channel 13
{0,1,1,1}, //channel 14
{1,1,1,1} //channel 15
może by dodać jego obsługę do LK. wizualizacja 16 kanałów-> 4 kolejne kanały odpowiadają strefie, każdy kanał strefy ustawia stan wysoki strefy. strefa zachowuje się jak dotychczas INP1D w zadaniach i innych opcjach by zbytnio nie gmatwać kodu np 4 pierwsze kanały alarmu powodują zdarzenie inp1d kolejne 4 zdarzenie imp2d itd
Kod:
//http://bildr.org/2011/02/cd74hc4067-arduino
int s0 = 8; //Mux control pins
int s1 = 9;
int s2 = 10;
int s3 = 11;
int SIG_pin = 0; //Mux in “SIG” pin
void setup() {
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
Serial.begin(9600);
}
void loop() {
//Loop through and read all 16 values Reports back Value at channel 6 is: 346
for (int i = 0; i < 16; i++) {
Serial.print("Value at channel ");
Serial.print(i);
Serial.print("is : ");
Serial.println(readMux(i));
delay(1000);
}
}
int readMux(int channel) {
int controlPin[] = {s0,s1,s2,s3};
int muxChannel[16][4] = {
{0,0,0,0}, //channel 0
{1,0,0,0}, //channel 1
{0,1,0,0}, //channel 2
{1,1,0,0}, //channel 3
{0,0,1,0}, //channel 4
{1,0,1,0}, //channel 5
{0,1,1,0}, //channel 6
{1,1,1,0}, //channel 7
{0,0,0,1}, //channel 8
{1,0,0,1}, //channel 9
{0,1,0,1}, //channel 10
{1,1,0,1}, //channel 11
{0,0,1,1}, //channel 12
{1,0,1,1}, //channel 13
{0,1,1,1}, //channel 14
{1,1,1,1} //channel 15
}; //loop through the 4 sig
for(int i = 0; i < 4; i ++){ digitalWrite(controlPin[i], muxChannel[channel][i]); } //read the value at the SIG pin
int val = analogRead(SIG_pin); //return the value
return val;
}
e-chata.hyzne.com | LK1 - sterowniki akwarystyki | LK2 - sterowniki ihome | LK3 - niezliczone ilości wersji/nakładek na farmach PV i nie tylko | LK4 - testy bezprzewodowe