/* povezave: * 3V3 ena stran faderjev * GND druga stran faderjev * A0 midpoint faderjev * D0 I2C SCL * D1 I2C SDA * D2 PWM R 1 * D3 PWM G 1 * D4 PWM B 1 * D5 PWM R 2 * D6 PWM G 2 * D7 PWM B 2 * D8 PWM R 3 * RX PWM G 3 * TX PWM B 3 * * 16 bit GPIO expander je priključen na I2C -- vsi pini so output * * merjenje faderjev * prvih 9 bitov je priklopljenih na en konec faderjev. vsi so 0, razen enega -- tisti fader bomo izmerili. * * nastavljanje RGB led: * RGB LEDic je 9, vsaka za 1 fader. s PWM se kontrolira se po tri ledice hkrati, preostalih 6 je izklopljenih. eno izmed treh območij, ki jih kontroliramo, izberemo z nadaljnimi 3 biti. vsi, razen enega, ki je 0, so v danem trenutku 1 -- diode so common ground in njihov ground je priklopljen na bit, drain pa je priklopljen na enega izmed PWM pinov. tri ledice iz vsakega območja so priklopljene na isti bit z ground konektorjem in na 9 različnih pwm pinov na kontrolerju z drain pini. * vsak loop se najprej zamenjajo biti za grounde, nato pa se še pokliče tri analogWrite() za pwm pine za korespondenčne ledice. * * zaporedje dogodkov v loopu: * nekajkratno branje analogne vrednosti trenutnega faderja in povprečenje izmerjenega * nastavljenje I2C GPIO expander bitov za naslednji fader in naslednje območje ledic * nastavljanje RGB PWM pinov za novoizbrano območje ledic * če imajo faderji nove vrednosti od prejšnjega loopa, pošiljanje paketa po wifi * return from void loop in gremo na začetek * * za testirati: * pošiljanje wifi paketa samo po meritvi prvega faderja (še vedno samo ob spremembi) -- s tem ob spreminjanju več faderjev hkrati ne pošiljam paketa za vsak fader posebej, ampak raje izmerim vse in nato pošljem * ob vsaki spremembi I2C GPIO expanderja spremenim še en bit, ki je priklopljen na input pin kontrolerja. šele ko zaznam spremembo z interruptom, spremenim PWM vrednosti -- s tem zmanjšam čas med spremembo bitov in spremembo pwm vrednosti, da ne dobi območje barv naslednika, če sprememba bitov traja dolgo. težava je, da imam potem 5 območij, ker imam ob uporabi enega input pina premalo pwm pinov za kontroliranje 3 rgb ledic hkrati. * */ #include #include #include #define L(s) log(String(__func__) + "@" + __FILE__ + ":" + String(__LINE__) + " " + s) extern "C" { #include "user_interface.h" } void log (String t) { uint8_t h[] = { 0x08, 0x00, 0x00, 0x00, 'O', '@', '4', 'A', '.', 'S', 'I', ' ' }; uint8_t p[t.length()+sizeof h+1]; memcpy(p, p, sizeof h); strcpy((char *) p+12, t.c_str()); wifi_send_pkt_freedom(p, t.length()+sizeof h+1, 0); } void incoming (unsigned char * buf, short unsigned int type) { L("incoming: " + String(type)); } void setup () { pinMode(1, FUNCTION_3); // TX pin je GPIO pinMode(3, FUNCTION_3); // RX pin je GPIO Wire.begin(); Wire.setClock(400000L); WiFi.setOutputPower(20.5); wifi_set_opmode(STATION_MODE); wifi_station_disconnect(); wifi_promiscuous_enable(1); wifi_set_promiscuous_rx_cb(incoming); wifi_set_channel(13); L("nastavil"); } uint8_t packet[] = { 0x08, 0x00, 0x00, 0x00, 'K', '@', '4', 'A', '.', 'S', 'I', ' ', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint16_t adcval[9]; int curmeas = 0; bool upload = false; int rgbpins[][3] = {{D0, D3, D4}, {D5, D6, D7}, {D8, 1, 3}}; unsigned loopnr = 0; void loop () { int avg = 0; #define SAMPLEAVG 5 for (int i = 0; i < SAMPLEAVG; i++) avg += analogRead(A0); avg /= SAMPLEAVG; upload = true; if (upload) { upload = false; wifi_send_pkt_freedom(packet, sizeof packet, 0); } }