diff options
author | Anton Luka Šijanec <anton@sijanec.eu> | 2023-05-01 22:31:48 +0200 |
---|---|---|
committer | Anton Luka Šijanec <anton@sijanec.eu> | 2023-05-01 22:31:48 +0200 |
commit | be631f8ceb5df7eba4beced60818360f04a80ca2 (patch) | |
tree | 143ede87e790dc8801562cc7e1e86571efadaabd /prog/upravljalnik | |
parent | inventar + upravljalnik (diff) | |
download | r-be631f8ceb5df7eba4beced60818360f04a80ca2.tar r-be631f8ceb5df7eba4beced60818360f04a80ca2.tar.gz r-be631f8ceb5df7eba4beced60818360f04a80ca2.tar.bz2 r-be631f8ceb5df7eba4beced60818360f04a80ca2.tar.lz r-be631f8ceb5df7eba4beced60818360f04a80ca2.tar.xz r-be631f8ceb5df7eba4beced60818360f04a80ca2.tar.zst r-be631f8ceb5df7eba4beced60818360f04a80ca2.zip |
Diffstat (limited to 'prog/upravljalnik')
-rw-r--r-- | prog/upravljalnik/naprava/platformio.ini | 2 | ||||
-rw-r--r-- | prog/upravljalnik/naprava/src/main.cpp | 103 |
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); |