Det var länge sedan jag uppdaterade här på forumet, men arbetet har nog hela tiden gått framåt.
Det som orsakat en hel del extra arbete är strippandet av drivrutinerna för de olika I2C-anslutna funktionerna. Standardbiblioteken vill ofatst vara universella och innehåller därför en massa #defines och #ifdefines. Sådana är omöjliga att dokumentera förståeligt, därför har jag rensat och förenklat dem och dessutom strävat till att homogenisera interfacet till de olika rutinerna.
Nu har det gjort och alla I2C-enheter fungerar.
Styrprocessen
Styrprocessens uppgift är att samla in olika mätvärden, föra statistik och göra olika beräkningar samt förse Användarprocessen med styrdata för rening och tappning. Den är uppbyggd kring en mycket kort loop som bara bevakar två olika händelser: knapptryck (som aktiveras av en användare) och en flagga, vilken aktiveras av en interruptrutin. Knapptryckningen skickas vidare till något jag kallar en navigeringsrutin (sköter menyer och allt som man kan göra i menyerna), interruptflaggan kallar på en rutin som läser in mätdata från alla sensorer som inte kan läsas direkt på någon av CPU:ns I/O-pinnar.
Interrupten triggas en gång i sekunden mha en 1Hz-signal från klock-kretsen. Jag hade först tänkt att inläsningen av sensordata skulle ske i interruptrutinen, men det gick inte, ESP32:an råkade i panik och bootade. I [den del av] manualen [som jag inte läst tillräckligt noga på] står det, att Interrupt-funktionens egen övervaknings-”vakthund” inte tillåter så tidsödande operationer som t.ex att läsa I2C-bussen.
Jag fick alltså ändra det så, att interruptrutinen bara sätter en flagga, och i huvudloopen , ifall flaggan är satt, får datainsamlingsrutinen ta över.
Alla rutiner är skrivna så, att programmet ingenstans blir och vänta på någon händelse, aktion, eller vad som helst som s.a.s får programmet att ens ett kort ögonblick stanna upp. Detta är förstås inte riktigt 100% sant, eftersom t.ex I2C-läsningen innebär att man väntar på svaret [minst ACK-signalen] från motparten. Det är oifrånkomligt och därför s.a.s den mints möjliga tidsenheten.
Men i övrigt är alla rutiner skrivna så, att programmet bara går runt och kollar, och går genast vidare. Du kan t.ex inte haka upp programmet genom att hålla en knapp intryckt. Knapptryckningen registreras nog genast, men orsakar reaktion först när tangenten släpps.
Detta innebär för det första ett antal flaggor vilka anger vad som är på gång, ex. vilken meny som ”just nu” är aktiv och har kontrollen, men det förutsätter också en hel del globala variabler för att värdena skall bibehållas. Detta i sin tur kräver både god disciplin och god dokumentation, så att man inte i misstag går och ändrar värden som andra rutiner behöver.
Nåjo, för att vara på säkra sidan sätter interruptrutinen inte en binär flagga, utan den lägger på ett till ”tick” på en räknare. Datainsamlingsloopen nollställer alltid denna räknare, men ifall huvudloopen av någon orsak blivit fördröjd och det hunnit ske flere interrupts sedan föregående datainsamling, så behöver datainsamlineg inte göra lika många insamlingar, utan i stället bara alltid multiplicera vissa mätningar med antalet ”ticks”, då blir statistiken rätt.
Det där kan förstås leda till mindre räknefel, men jag utgår från att det balanserar ut sig i längden och det här är inget kritiskt. Vi håller ju inte på och räknar fria neutroner i en kärnkraftskärna!
Här följer några bilder på hur kopplingarna ser ut just nu.
VRA_1.jpg
VRA_2.jpg
VRA_3.jpg
Alarmenhetens anslutningar är vanliga 3.5 mm pluggar.
VRA_4.jpg
VRA_5.jpg
Behändigare att serva då man kan vika ut modulerna, vilket inte heller stör funktionen.
VRA_6.jpg
På bottnet i lådan finns "strömskenor" i form av skruvterminaler. Alla fyra spänningar behövs.
VRA_7.jpg
Anslutningar till reläer, användarens tryckknappar utanför, mm. mm.
VRA_8.jpg
Jag har också fixat med sensorerna. Först en möjligast simpel 3D-printad box för fuktsensorerna, vilka skall ge alarm ifall av vattenläckage. Själva vattenavkänningen tänkte jag göra med två pinnar från en pinribba. Löder fast en tvåpolig kabel till två pinnar, tätar lödningen med smältlim och utanpå en bit krympslang. Jag har dock inte skaffat kabeln ännu, därför inga bilder…
Sensorerna ansluts till alarmenheten (3.5 mm plugg) som är kopplad så, att om ingen sensor är ansluten är respektive LED släckt, annars grön om läget är OK och röd ifall sensorn ger alarm, och då lyser också den gemensamma Alarm-leden.
Jag har ett antal [Kina-] fuktsensorer vilka blev över från växthusprojektet. Kommer väl till pass här.
VRA_9.jpg
Läckageavkännare kommer iaf under vardera pumpen och under vattenreningsenheten. Man kunde förstås ha flera avkännare kopplade till samma sensor, emn jag ville ändå enklare se exakt varifrån alarmet kommer. Sammanlagt 3..4 fuktsensorer.
Dessutom kommer det en värmeavkänning på insugspumpen (iaf) - en värmesäkring som öppnar vid 70 grader ( den lägsta temperatur jag hittade).
Det kan behövas andra alarm senare också.
En av de viktigaste sensorerna är en ACS37800 (Allegro Microsystems) som mäter spänningen på och strömmen till/från batterierna. Den skall kopplas direkt på ena batteripolen och kommer därför en bit ifrån centralenheten. En medlem här på forumet tipsade mig om kretsen med vilken man kan förlänga I2C-bussen massor av metrar. Fungerar som tåget! Tack för ett gott tips!
Det här är den mest avancerade sensorn, men gav absolut minst utmaningar. Fungerade rakt av, utan några som helst strul. Eftersom detta är en i sig unik krets så har standard-drivrutinen inte heller några överflödiga #ifs-defs, så det krävdes bara kosmetiska ändringar.
Här några bilder utan och med 3D-printat hölje. ”Igelkotten” fanns i skrotlådan och härstammar från någon isärplockad grej. Den är i nog rätt så överdimensionerad, då bara ca 3W behöver kylas som max => vid ca 50 A(!!!) ström genom kretsen. (Specad till 90A).
Kretskortet har jag gjort i fräsen.
VRA_10.jpg
Kopplqas med "Remote"-I2C till centralenheten. Jag använder RJ45 och CAT6-kabel. Kontakterna är kopplade som för en PoE-anslutning.
VRA_11.jpg
Höljet är 3D-printat i PETG. Även LEDens "lins" är ditprintad, i klar PETG.
VRA_12.jpg
VRA_13.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.