/* * Example of getting 16 i/o from 5 pins using a CD4051 * * Based on tutorial and code by david c. and tomek n.* for k3 / malmö högskola * http://www.arduino.cc/playground/Learning/4051?action=sourceblock&ref=1 */ int selPin[] = { 14, 15, 16 }; // select pins on 4051 (analog A0, A1, A2) int commonPin[] = { 17, 18}; // common in/out pins (analog A3, A4) int readPin[] = { 3, 4 }; // analog designation for common in/out int led[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW }; // stores eight LED states int CdSVal[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; // store last CdS readings int cnt = 0; // main loop counter int persistDelay = 100; // LED ontime in microseconds void setup(){ Serial.begin(9600); // serial comms for troubleshooting (always) Serial.print("CD4051 demo"); for(int pin = 0; pin < 3; pin++){ // setup select pins pinMode(selPin[pin], OUTPUT); } } void loop(){ flashLEDs(); if (cnt == 0){ readCdS(); for(int x; x < 8; x++){ if (CdSVal[x] < 250 || CdSVal[x] > 500){ led[x] = LOW; } else { led[x] = HIGH; } } } cnt++; if (cnt > 100) { cnt = 0; } } void flashLEDs() { for(int pin = 0; pin < 2; pin++) { // set common pins low pinMode(commonPin[pin], OUTPUT); digitalWrite(commonPin[pin], LOW); } for (int bank = 0; bank < 4; bank++) { for(int pin = 0; pin < 3; pin++) { // parse out select pin bits int signal = (bank >> pin) & 1; // shift & bitwise compare digitalWrite(selPin[pin], signal); } if (led[bank * 2]){ // first LED digitalWrite(commonPin[0], HIGH); // turn common on delayMicroseconds(persistDelay); // leave led lit digitalWrite(commonPin[0], LOW); // turn common off } if (led[bank * 2 + 1]){ // repeat for second LED digitalWrite(commonPin[1], HIGH); delayMicroseconds(persistDelay); digitalWrite(commonPin[1], LOW); } } } void readCdS() { for(int pin = 0; pin < 2; pin++) { // set common pins low pinMode(commonPin[pin], OUTPUT); digitalWrite(commonPin[pin], LOW); } for (int bank = 4; bank < 8; bank++) { for(int pin = 0; pin < 3; pin++) { // parse out select pin bits int signal = (bank >> pin) & 1; // shift & bitwise compare digitalWrite(selPin[pin], signal); } pinMode(commonPin[0], INPUT); digitalWrite(commonPin[0], HIGH); // turn pull-up on CdSVal[(bank - 4) * 2] = analogRead(readPin[0]); pinMode(commonPin[0], OUTPUT); digitalWrite(commonPin[0], LOW); // turn pull-up off pinMode(commonPin[1], INPUT); digitalWrite(commonPin[1], HIGH); // turn pull-up on CdSVal[(bank - 4) * 2 + 1] = analogRead(readPin[1]); pinMode(commonPin[1], OUTPUT); digitalWrite(commonPin[1], LOW); // turn pull-up off } }