summaryrefslogtreecommitdiffstats
path: root/prog/upravljalnik/naprava/src/main.cpp
blob: 46a393bbe6333be9ea8b1ce9860ef95a1787e231 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* 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);
	}
}