/* 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 <Arduino.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#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);
}
}