summaryrefslogtreecommitdiffstats
path: root/prog/upravljalnik/naprava
diff options
context:
space:
mode:
Diffstat (limited to 'prog/upravljalnik/naprava')
-rw-r--r--prog/upravljalnik/naprava/platformio.ini2
-rw-r--r--prog/upravljalnik/naprava/src/main.cpp103
2 files changed, 61 insertions, 44 deletions
diff --git a/prog/upravljalnik/naprava/platformio.ini b/prog/upravljalnik/naprava/platformio.ini
index 878054d..c7973fc 100644
--- a/prog/upravljalnik/naprava/platformio.ini
+++ b/prog/upravljalnik/naprava/platformio.ini
@@ -19,4 +19,4 @@ board_build.filesystem = littlefs
board_build.ldscript = eagle.flash.4m2m.ld
src_filter = -<*> +<main.cpp>
lib_deps =
- /root/projects/ADS1115_WE
+; /root/projects/ADS1115_WE
diff --git a/prog/upravljalnik/naprava/src/main.cpp b/prog/upravljalnik/naprava/src/main.cpp
index 78dd46a..46a393b 100644
--- a/prog/upravljalnik/naprava/src/main.cpp
+++ b/prog/upravljalnik/naprava/src/main.cpp
@@ -1,66 +1,83 @@
+/* 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 <ADS1115_WE.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
+#define L(s) log(String(__func__) + "@" + __FILE__ + ":" + String(__LINE__) + " " + s)
extern "C" {
#include "user_interface.h"
}
-void incoming (unsigned char * buf, short unsigned int type) {
- Serial.println(type);
+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);
}
-uint8_t curchan[] = { 0 }; // we have sizeof curchan modules connected (at most four)
-bool ready[sizeof curchan] = { false };
-IRAM_ATTR void rdy0 () {
- ready[0] = true;
+void incoming (unsigned char * buf, short unsigned int type) {
+ L("incoming: " + String(type));
}
-ADS1115_WE adc[] = { ADS1115_WE(0x49) }; // VDD
-void (*rdyfuncs[])() = { rdy0 };
-int rdypins[] = { D7 };
-uint16_t adcval[sizeof curchan][4];
-bool upload = false;
void setup () {
+ pinMode(1, FUNCTION_3); // TX pin je GPIO
+ pinMode(3, FUNCTION_3); // RX pin je GPIO
Wire.begin();
Wire.setClock(400000L);
- Serial.begin(MONITOR_SPEED);
- Serial.println("setupstart");
- for (unsigned i = 0; i < sizeof curchan; i++) {
- Serial.println("nastavljam ADC " + String(i));
- if (!adc[i].init())
- Serial.println("ADS1115 " + String(i) + " not connected!");
- pinMode(rdypins[i], INPUT_PULLUP);
- attachInterrupt(digitalPinToInterrupt(rdypins[i]), rdyfuncs[i], RISING);
- adc[i].setVoltageRange_mV(ADS1115_RANGE_4096);
- adc[i].setSingleChannel(curchan[i]);
- adc[i].setConvRate(ADS1115_32_SPS);
- adc[i].setMeasureMode(ADS1115_CONTINOUS);
- adc[i].setAlertPinMode(ADS1115_ASSERT_AFTER_1);
- adc[i].setAlertPinToConversionReady();
- adc[i].skip_delays = true;
- }
- Serial.println("nastavljam wifi");
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);
- Serial.println("nastavil");
+ 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 () {
- for (unsigned i = 0; i < sizeof curchan; i++) {
- if (!ready[i])
- continue;
- uint16_t val = adc[i].getRawResult();
- if (val != adcval[i][curchan[i]]) {
- adcval[i][curchan[i]] = val;
- packet[12+i*8+curchan[i]*2] = val >> 8;
- packet[12+i*8+curchan[i]*2+1] = val & 0xff;
- upload = true;
- }
- adc[i].setSingleChannel((curchan[i] = (curchan[i]+1) % 4)); // XXX kaj če dobim ready signal še preden naprava dejansko zamenja naslov? za vsak slučaj ready=false nastavim tukaj spodaj, ampak vseeno zna biti kaj težav, še posebej glede na to, da izvorna knjižnica za ads1115 za chansel da nekaj delaya
- ready[i] = false;
- }
+ 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);