Buggfix Plus
Aktuellt datum och tid: 07.47 2019-11-12

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 57 inlägg ]  Gå till sida Föregående  1, 2, 3, 4  Nästa
Författare Meddelande
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 11.20 2019-08-11 
Användarvisningsbild

Blev medlem: 20.30 2010-10-06
Inlägg: 183
Ort: Finland
Idag regnar och blåser det här ute i havsbandet, så jag kan inte fortsätta måla verandan. Varför skall väderleksprognosen stämma just idag?! :?

Får väl då i stället ta itu med PROGRAMMET, en ÖVERSIKT.

Till att börja med får jag ursäkta för att programmet (som jag bifogar ett senare inlägg) med förklaringar är skrivet på svengelska.
Jag gjorde mina första program för en god bit över 40 år sedan, och då var det bara engelska som gällde. Som värst skrev vi programmen direkt i maskinkod (!), men oftast på något mellannivå-språk (Assembler, PL/I, PL/M, eller dylikt) på en Teletype-terminal som stansade en hålremsa, vilken sedan lästes in i minidatorn. Då var det 7-bitar ASCII som gällde, och programmen förstod inte Å, Ä och Ö, så de kunde inte användas.
I en terminal eller på en skrivare kunde man substituera tecknen [, \ och ] med skandinaviska tecken, men i programmen hade de en fördefinierad betydelse, så därför kunde de inte användas där.

Dessutom hade datorerna inte så mycket minne heller - vår "största" dator hade 20 kbyte (!!!) centralminne, så man skulle inte uppta det med onödiga förklaringar eller dylikt.
Trots det lyckades vi faktiskt klämma in avancerade FEM-analyser i den maskinen. Programmet upptog hela programminnet så när som på en byte. Det var bara en kille vars initialer kunde skrivas som en HEX-kod, men det gick inte vi andra med på, så den sista byten förblev oanvänd :D

Jämfört med det är ju en Arduino med 32 kbyte programminne rena lyxen!

Nåja, nu var det ju inte meningen att förfalla i sentimentala memoarer, men det är nu en bortförklaring till språket (det går inte att lära en [så här] gammal hund nya tricks!), samt att beskrivningarna i programmet säkert är bristfälliga och ibland t.o.m. kan vara svårförståeliga.
Vidare är det skäl att nämna, att jag definitivt inte är programmerare. Det var aldrig min inriktning heller - det kom liksom på sidan om. Jag har nog programmerat en hel del sedan dess, men bara för husbehov.
Flere saker kunde säkert göras bättre. Strukturer och flöden och namnen på rutiner och variabler kan synas konstiga och inkonsekventa - och det är de säkert också. Det är saker som det inte finns förklaringar på.
Jag har sett många eleganta programlösningar här på forumet, så jag vet att det finns skickliga programmerare här. Jag tar gärna emot både råd och förslag, det är både lärorikt och uppfriskande att se på något problem på ett nytt sätt. Därför: "Keep them coming!".

Så tillbaka till huvudspåret.

Först en kort redogörelse hur de olika minnena används:

Det finns endast en Joystick med vilken man konfigurerar systemet. Det betyder förstås menyer, menyer betyder mycket text, mycket text tar upp minne, och - tvärt emot min jämförelse med 70-talet - det har inte AVR328:n heller för mycket av.
Menytexterna skall vara enkla att komma åt så därför har jag placerat dom i Arduinons interna EEPROM där de upptar 512 byte (av 1024).

Lösningen möjliggör upp till 64 textsträngar med en sammanlagd längd av 382 byte, inklusive terminator (0x00) efter varje text. 128 byte upptas av vektorerna (till texterna) och två byte är reserverade för systemets pin-kod:
0x000 - 0x07F : Vektorer (64x word)
0x080 - 0x1FD : Textsträngar
0x1FE - 0x1FF : Pin-kod

Fotnot: Det finns en rutin som skriver ut "texsträng nr n" på displayen. "n" syftar till vektorn och vektorn pekar på början av den textsträng som skall skrivas ut. Varje text slutar med en s.k. null-terminator (0x00).

En liten nackdel är förstås, att det interna EEPROMet måste programmeras först m.h.a. ett skilt program, före man laddar ner själva bevattningssystemprogrammet. Bevattningsprogrammet alternerar inte på något sätt textsträngarna.
Att göra upp textsträngarna kan också vara omständigt. Därför har jag gjort upp ett Excel/LibreCalc-"program" där man bara matar in de textsträngar man vill ha, och det allokerar både vektor och minne och genererar färdig kod för EEPROM-laddningsprogrammet. Det är bara att föra över med Copy-Paste.
I det tabellprogrammet sätter man också pin-koden intialt, men den kan man sedan ändra på i programmet. Det finns ingen "factory default" för pin-koden. Ifall man kompilerat programmet för att använda pin-kod och man glömt koden, finns det en speciell input man skall ställa för att göra "pin code override".

En central målsättning var, att systemet skall klara en omstart (reset) utan att tappa tråden. Det betyder, att konfiguration och status måste sparas i icke-flyktigt minne och att programmet efter en reset först läser in dessa värden och på basen av det "hittar tillbaka" till den punkten där avbrottet kom.
Detta med att hitta tillbaka måste förstås på rätt sätt. Ifall systemet falerade onsdag morgon och startar upp igen först på lördag eftermiddag (ex. strömavbrott), så är det inte meningen, att alla bevattningar och statusrapporter mellan onsdag och lördag skall köras i en rad för att komma ifatt.
"Hitta tillbaka" betyder alltså, att:
- Konfigurationerna för zoner och lucka skall finnas kvar
- Ifall systemet var mitt i en bevattningsfas skall den slutföras
- Antalet omstarter loggas, men ifall bevattningar uteblivit under avbrottet, ett meddelande därom skicks till servern

Då jag samtidigt ville, att om Arduinon t.ex. pajade och jag ersatte den med en annan, skulle också den hitta rätt, utan att jag behövde mata in alla parametrar på nytt.
Därmed var det klart, att eftersom RTC-modulen också har ett EEPROM på sig, är det det som skall användas för:
- Inställningar och parametrar (zoner, växthus, system)
- Diverse statusinformation, flaggor, etc.
- Logg
mm.

Fotnot 2: I själva verket brukar jag uppdatera programmet så, att jag laddar ner den nya versionen på en annan Arduino Nano och sedan går jag ut i växthuset och swappar (utan att ens koppla ifrån strömmen, fast det rekommenderar jag ju inte åt andra... :cool: )
Igår tappade jag den ena Arduinon i vattentunnan :oops: men jag plockade upp den, blåste bort överloppsvattnet och värmde över en gasollåga tills fingrarna inte höll, och så var den ok igen.
...det där med tunnan inomhus...

Det externa EEPROMet är 4 kbyte (32 kbit) och där finns det gott om ledigt utrymme ännu. För närvarande använder systemet i princip endast 0x0000 till 0x01FF men inte ens då är alla platser allokerade. Vi får återkomma till allokeringen senare.

En annan utmaning var, att programmet skall sköta många uppgifter parallellt - bevattning, rapportering, självövervakning, interaktion med en eventuell användare, mm. För att klara detta elegant hade det behövts ett realtids-operativsystem, då hade man kunnat köra dom som separate processer och datautbyte mellan dom.
Men det har nu Arduinon inte och det skulle knappast rymmas i det minnet heller. Så det gäller att få ihop det på annat sätt.
Det syns i hur uppgifterna och rutinerna är uppdelade.
För närvarande upptar programmet 78% av minnet och då är långt ifrån allt implementerat ännu. Den andra kritiska faktorn, nämligen SRAM-minnets användning, är, att 33% upptas av globala variabler. Många av dessa kommer från biblioteksrutiner vilka jag inte velat tumma på, eftersom man då får göra det varje gång biblioteket updateras också.
Jag har inte ens försökt förstå var den kritiska gränsen går, d.v.s. hur mycket som vid något tillfälle maximalt upptas av dynamiska variabler och subrutin-call, men jag vill nog inte höja på det där värdet
Är det nån som har en uppfattning om hur man kan försöka ta reda på den saken? [utan en riktigt bra simulator]

Till slut en översikt över "loopen":
Bilaga:
Program_oversikt.png

Programmet loopar alltså igenom:
run30()
En rutin, som kontinuerligt pollar klockan och miljöparametrar för att visa på displayen.
Ifall klockan är en jämn halvtimme kallar den på andra rutiner för loggning, starta bevattning, mm.

tempShow()
Uppdaterar displayen med de värden run30() pollat.

Test: Joystick klickad?
Det betyder användarinteraktion och då öppnas huvudmenyn med rutinen Menu10().

Test: phase > 0
Denna flagga sätts tidigare i loopen antingen i run30() (programmerad bevattning, [1..3]) eller av användaren (manuell bevattning [4])
och då startas själva bevattningen i rutinen watering(). Flaggan nollas efter utförd bevattning.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 11.42 2019-08-11 
Användarvisningsbild

Blev medlem: 09.51 2010-11-06
Inlägg: 290
Ort: Ljungsbro
Hej. Odlar själv ganska mycket i växthuset vi har. Hur gör du med tillsatser av gödning? Vi vattnar nästan varje gång med gödselvatten.


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 12.36 2019-08-11 
Användarvisningsbild

Blev medlem: 20.30 2010-10-06
Inlägg: 183
Ort: Finland
Nu med chilli blir det där ju litet speciellt.
Buskarna växer sig stora, största f.n. över 140 cm och jag måste slänga dom varje höst, för jag kan inte ha dom och övervintra här ute och inte heller kan jag ta in dom till stan.
De har då under säsongen utvecklat ett ganska omfattande rotsystem, så minst 1/3 av jorden följer obönhörligen med fast jag skakar dom hur mycket som helst.
Här ute finns det inte mylla att ta ifrån, det här är gammal havsbotten, så det kommer bara sten och sand emot om man sätter i spaden.
Det betyder, att jag varje vår får sätta till minst 1/3 prima, färdigt gödslad trädgårdsmylla hämtad i säckar från fastlandet.
Utöver det har jag brukat gödsla i bevattningsvattnet (i sprutkanna) ungefär en gång i månaden och det verkar ha räckt alldeles bra.

Senaste vår bytte jag all mylla, så i år har jag ännu inte satt till något. Måste tänka på det där också till nästa säsong.
Det skall väl gå bra då också att sätta i vattnet ungefär samma mängd som jag gjort tidigare en gång i månaden. :humm:

Det finns gott om gropar och svackor på gårdsplanen som behöver utfyllnad, så den gamla jorden kommer nog väl till användning.

Tidigare, när jag hade örter och grönsaker var det annat. Då blev myllan kvar och då gödslade jag mera regelbundet.

Jag har en bekant som är trädgårdsmästare, så jag brukar fråga henne om råd. Jag kan inte påstå, att jag skulle ha någon grön tumme...
Det som jag gärna vill lära mig, men inte ännu vågat pröva på är hur chillibuskarna skall beskäras så att de producerar mera utan att växa sig för stora.


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 21.27 2019-08-11 

Blev medlem: 16.55 2017-05-17
Inlägg: 126
Ort: Oslo, Norge
Vedlig bra og detaljert beskrivelse - et fantastisk prosjekt!
Som nevnet tidligere i tråden (ds77, vojnik) så bør kapasitiv fuktighetsmåling skje med bytte av polaritet på spenningen mellom hver måling. Og det er sikkert bra om spenningen er avskrudd når det ikke måles.
Vet ikke om det er mulig å få til med de sensorene du bruker.


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 09.07 2019-08-12 
Användarvisningsbild

Blev medlem: 20.30 2010-10-06
Inlägg: 183
Ort: Finland
PROGRAMMET DEL 2

Nu vore det kanske riktigt att inte börja med menyerna, utan i stället beskriva hur bevattningen styrs och först sedan hur man styr det via menyerna.
Systemet idag är trots allt ett resultat av många utmaningar, många lösningar, många nya problem och många kompromisser. Därför tycker jag man inte slaviskt behöver följa praxis ”först problemen och utmaningarna, sedan lösningen”, utan kan ta genvägen och beskriva systemet som det är och försöka beskriva de mest avgörande stötestenarna på vägen.

Därför börjar jag alltså med

MENYSYSTEMET

Menysystemet är uppbyggt enligt följande:

Bilaga:
Menyer.jpg


Varje meny hanteras av sin rutin, namngivet MenuXX() där första siffran ’X’x anger nivån och den andra siffran är ett löpande nummer från 0 uppåt. Rutinerna heter alltså typ Menu10(), Menu42(), o.s.v.

I programmet är några olika rutiner centrala för menyhanteringen:
(vissa av dessa vill ha parametrar, kolla i programlistningen för detaljer)

MenuXX() - Skapar själva menyn och tolkar och hanterar användarinteraktionen.
printEstr() - Skriver ut menytexterna på displayen
RollMenu() - "Rullar” igenom menyn så som användaren kommenderar med Joysticken.
ReadJoystick() - Hanterar Joystickens rörelser upp, ner, vänster el. höger, (i programmet benämns dessa North, South, West och East) samt klickningar.

Fotnot: Alla MenuXX()-rutiner använder inte RollMenu(), ty ibland har det krävts en litet avvikande hantering med parametervärdena. Helheten är alltså litet blandad. Ingenting är perfekt.

Jag har försökt förklara det mest centrala i varje rutin i programlistningen, så jag upprepar inte det här. Ifall något är oklart, eller ifall du vill ifrågasätta något, så är det välkommet med frågor och kommentarer!

Då jag skrev dessa rutiner var min avsikt att, om möjligt, göra dom generella och modifierbara för användning i andra program. Det är fritt fram att låna och kopiera, men ifall det på vilket vis eller i vilken form som helst går vidare till någon eller någonstans, så bör du i programlistningen skriftligen hänvisa till mig och till EF!!!

Fotnot: Joysticken är analog, så man kan använda den till mycket noggrannare saker än dom fyra huvudriktningarna. I det här programmet används den dock som en ”digital” joystick och man kan ställa gränsvärdet för när avvikelsen från centrerläget skall räknas som ett väderstreck.
Rutinen returnerar endast ett värde, vilket motsvarar ett av joystickens nio lägen, med eller utan klickning. Totalt alltså 18 olika värden. Titta i programlistningen för detaljer.
Rutinen kan kallas i två olika moder: En absolut mod, d.v.s. då väntar man bestämt på användarinteraktion och en som bara avläser Joysticken ”som den är just nu” utan att vänta på någon explicit interaktion.
Båda moderna behövs i det här programmet.

Normalt då programmet rullar, visar displayen datum, tid, temperatur, lufttryck, luftfuktighet och ljus.
Bilaga:
Display.jpg


Med ett tryck på Joysticken öppnas Meny 10 där användaren sedan går vidare genom att navigera med Joysticken och välja. Avslutningsvis väljer man ”Avsluta” och återgår då till datum/tidsdisplayen.

Medan användaren navigerar och konfigurerar snurrar bevattningsövervakningen i bakgrunden. Ifall det då blir tid för att vattna och/eller sända loggdata hanteras det med prioritet, medan användarinteraktionen pausar, för att sedan återtas då bevattningen är gjord.

Alla menyer återgår till den kallande menyn, utom Menu21() där man skall ge pinkod för att kunna ändra inställningar. Ifall pinkoden är fel avslutas menyn och programmet återgår till datum/tidsdisplayen. På pin kiv!

Menyerna där man ändrar på några parametrar skall man först ”Spara” och efter det skall man explicit välja ”Tillbaka”. Detta för att ex. menyn där man sätter data för olika zoner görs en zon i taget och då vill man inte börja om hela vägen från början för nästa zon.

Övriga förklaringar till menyschemat:
Ord inom klamrar, ex. [Logg] betyder, att då visas loggen, men det finns inget man ändrar på.
Ord inom parentes ”(Tillbaka)” avser, att det finns inget särskilt val ”Tillbaka”, utan det motsvaras av ett klick på Joysticken.
Undantaget är pinkoden i Meny 21. Där matar man pinkoden genom att navigera till och rulla siffrorna, och kvitterar med ett klick. Sedan blev det då rätt eller fel, och då går man antingen vidare, eller så åker man tillbaka till början.

Kort om DISPLAYEN
Displayen är en pytteliten grafisk LCD, 128x64 pixel. Den har ingen inbyggd font så den måste hanteras i programmet.
Sådana fonter tar upp mycket minne. Därför har jag begränsat fonten till en med endast versaler, gemener är knappt läsbara på den lilla displayen.
För displayen har jag använt en biblioteksrutin som heter ” U8X8_SSD1306_128X64_NONAME_HW_I2C”.
Den innehåller massor av alternativ, både för displayer och fonter, men jag valde fonten ” u8x8_font_saikyosansbold8_u”, för läsbarhetens skull.

Nu är det förstås tyvärr så, att en sådan font inte innehåller de skandinaviska tecknen ÅÄÖ! Här är jag alltså tillbaka på 70-talet som jag beskrev tidigare. :doh:
Jag har därför editerat fonten så, att tecknen [\] visas som ÄÖÅ.
Dessvärre är fontdatat i det biblioteket definierat helt vansinnigt. Pixlarna i fonten skrivs ömsom som oktalkoder, ömsom som ASCII-tecken. Dessutom är det besvärligt att hitta rätt pixelkoder och rätt ställe där de skall läggas in, för att åstadkomma de nya tecken man vill.

Det andra problemet är, att varje gång biblioteket uppdateras (du vet, i Arduino utvecklingsmiljön kommer texten ungefär ”Updates to some of your libraries are available”) så skriver uppdatering över de eventuella ändringar du gjort. Det är ett ständigt strul!

Jag gjorde därför ett hjälpprogram med Excel/LibreCalc som visar varje tecken och där jag sedan kan ändra pixelkoderna (oktal eller ASCII) och se verkan. Dessutom ger den ut det slutliga datat som man sedan överför till bibliotekets font fil med Copy-Paste! :vissla:
Bilaga:
Font_converter.jpg

Sedan lönar det sig förstås att spara den filen separat så, att när det kommer uppdateringar, skriver man bara över just den fontfilen.

Fortsätter med mera menyer i nästa inlägg.


...men förstås! Kanske tid att ladda upp programmet nu?
Bilaga:
VH_4v1.txt


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 21.26 2019-08-12 

Blev medlem: 14.33 2011-09-25
Inlägg: 258
Ort: Göteborg
Än en gång, många tummar upp för ditt projekt :tumupp: :)


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 21.40 2019-08-12 
Användarvisningsbild

Blev medlem: 18.09 2011-07-01
Inlägg: 9306
Ort: Helsingborg
Det där är riktigt bra. Både som projekt men kanske mest för idéer och flödet kring detta.
Som jag har sagt, det gläder mig att se andra jobba hårt för en bra lösning! Bevattning eller Bro. Bra gjort!


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 16.41 2019-08-13 
Användarvisningsbild

Blev medlem: 20.30 2010-10-06
Inlägg: 183
Ort: Finland
Tack för uppmuntringarna!
Jag är uppriktigt förvånad över intresset för saken, överträffar stort vad jag hade väntat mig.

PROGRAMMET, DEL 3

Före vi går till Inställningarna, kort om övriga menyer:

Meny 20 – Logg
”Logg” är nog en mindre överdrift. I själva verket är det som en HEX-dump av det externa EEPROM-minnet. Displayen visar ex.
0000 xx xx xx xx
0004 xx xx xx xx
0008 xx xx xx xx
... osv. sammanlagt 8 rader per skärm.
Inte särskilt klarspråkigt! Det gäller alltså att veta vad varje minnescell har för funktion.

Med Joysticken rullar man uppåt eller neråt en skärm i taget.

Orsaken till detta fusk var, att det blev för omständigt och minneskrävande att klämma in någon form av beskrivande eller förklarande text, plus att det tog mycket längre tid att rulla fram till det man sökte, eftersom det kunde ligga många steg framåt.

En klickning bär tillbaka till föregående meny.

Meny 23 – Status
Anger status på Luckan och vattennivån i reservoaren och i bevattningstanken.
Retur med ett klick.

Meny 22 – Växla nu
Är till för att manuellt beordra bevattning av en, flera eller alla zoner, eller för att manuellt ställa luckan.
Bevattningen startar efter att man valt Avsluta i meny 10.

Så kommer vi då till INSTÄLLNINGAR

Inställningarna är delade i Klocka, Växthus och Zoninställningar. Klockinställningen behöver knappast presenteras närmare.
Växthusinställningarna är vidare delade i Lucka, System och Pinkod.

Meny 52 – Pinkod
Sätter ny pinkod (4 siffror) vilken sparas i det interna EEPROMminnet på minnesplats 0x01FE och 0x01FF i formatet 0x12 resp. 0x34 för pinkod ”1234”.

Meny 50 – Lucka
Luckans styrning är de facto inte implementerad ännu, för jag blir tvungen att tänka om. :humm:
Luckan skall drivas med en motor med utväxling (12VDC, 200 rpm) och halvvägs planerat hade jag tänkt mig en gängstång som skjuter en [lång] mutter fram och tillbaka, och från den medelst en hävarm skulle öppna och stänga luckan.
Konstruktiionen verkade då bli rätt skrymmande och skulle ha kommit i huvudhöjd och därför bara vara i vägen. Utan att ens planera färdigt beslöt jag fundera på någon annan lösning och TAR GÄRNA EMOT UPPSLAG!!

En tanke är ett ”pneumatiskt” system, d.v.s. motorn skulle skjuta en kolv i ett rör, varifrån man drog en slang till en annan kolv under luckan. I alla fall skulle motordelen då kunna placeras mera på sidan om. Har dock inte funderat längre än det på hur det skulle se ut.

Luckan öppnar sig som ett gångjärn uppåt, yttersta kanten rör sig ca. 40 cm. Angreppspunkten behöver knappast vara så långt ut, för luckan är inte tung.
Feedbacken från luckan var tänkt att utgöras av en glidpotentiometer som med en stång fästes vid linjkärrörelsen. Avläsning via en analog ingång.

Hur som helst, parametrarna i menyn är tänkta som följande:

Mode – [0 | 1 | 2]
Fotnot: Ovanstående betyder att parametern kan ges värdena 0, 1 eller 2. Av utrymmesskäl (på displayen) är jag tvungen att använda kodning i stället för klartext. Med bara 16 tecken per rad blir det trångt!

0 – Luckan deaktiverad
1 – Luckan följer temperaturgränserna (Luckan skall vara stängd vid Min och helt öppen vid Max)
2 – Luckan följer tidsinställningarna

Jag har haft i baktanke även ett fjärde alternativ, nämligen en kombination av (1) och (2) så, att luckan följer temperaturen, men endast inom det valda tidsområdet. Utanför det skulle luckan alltid vara stängd. Tänkte ändå att det kan vara onödigt finlir så här i början och vill först hämta erfarenheter med bara de ovannämnda alternativen.

I och med det föregående förklarar sig de andra inställningarna i denna meny sig själva.

Så gör vi ett hopp till
Meny 42 – Zon (n)
I denna meny ställer man parametrarna skilt för varje zon (n):

Aktiv [0 | 1] Ingen bevattning ifall deaktiverad [0].

Digi/Ana [1 | 2] Väljer ifall fuktövervakningen skall följa sensorns digitala eller analoga signal.
Den analoga följer ”globala” inställningar på tröskelvärdena när det är för torrt och när det är för vått och den tröskeln gäller då för alla zoner [som följer analog sensorering] (se Meny 52).
Tröskeln för den digitala signalen kan ställas med en trimmer på sensorn och då kan man ha stora variationer från en zon till en annan.
Den här grejen kommer jag troligen att ta bort och bara kolla den analoga signalen. Med erfarenheterna hittills verkar de vettigare.
Kommer inte ihåg vad jag tänkte tidigare, varför den digitala ens skulle behövas. Kanske var det att man skulle kunna odla kaktus i en zon och ris i en annan (?) :wacko: Tror att de kanske har aningen olika fuktbehov...

Bas ggr [1 | 2 | 3] Här väljer man basbevattningen, d.v.s. hur många gånger om dagen zonen får vatten (1, 2 eller 3 ggr).
Tiden för bevattningen kan inte ställas individuellt, utan den sker vid tre förutbestämda klockslag enligt följande:
1 gång => kl 14
2 ggr => kl 08 och 20
3 ggr => kl 08, 14 och 20
Jag kom nämligen fram till, att, speciellt som systemet skall kunna klara av en Reset utan att tappa tråden och att man därför behöver ett antal signalflaggor vad som är på gång, blir det programmässigt mycket enklare att hantera fasta klockslag.
Återkommer till detta när jag beskriver bevattningsprocessen.

Bas antal [1 | 2] Man kan alltså välja att ge en eller två doser per bevattningsgång. Den totala dagsmängden per zon kan därmed vara 1, 2, 3,4 eller 6 doser.
Hittills har det inte behövts mer än en dos per zon per dygn (ca. 1.2 ltr/dos).

Extra % [10% - 100%] - Tröskeln för tilläggsbevattning, d.v.s. under vilken zonen får extra vetten (anges i 10%). Jag kommer troligtvis att ta bort denna konfiguration också. Den har mer eller mindre ersatts med inställningarna i meny 52.

Extra antal [1 | 2] Antal doser för tilläggsbevattningen.

Den sista menyn att beskriva är:

Meny 52 – System
Den här menyn är den senaste jag lagt till, och det var för jag märkte att det fanns ett behov. Denna meny är ännu på "experimental" -stadiet.

Fukt max [x10] [5..25] – ställer övre tröskelvärdet för jordfuktigheten ovanom vilket bevattning inte sker. Den analoga signalen från fuktsensorerna läses med en 8-bits A/D-konverter, så parametervärdet x10 motsvarar uppmätta värden direkt.

Fukt min [x10] [1..25] – ställer det nedre tröskelvärdet under vilket zonen får en extra dos vatten.

F.n. var det tänkt att fuktighetsövervakningen skulle ske kl 11:00 och kl 17:00, men är i programlistningen i föregående inlägg deaktiverad, för att jag blev förargad över att sensorpiggarna oxiderar så att mätningarna inte ens hålle rstreck :evil:

Tid (timeout) [1..25] – den tid x10 sekunder under vilken en pump är förväntad att ha pumpat färdigt. Om denna tid löper ut stängs pumpen av och ett fel loggas.


Eftersom det nu blev bara torr text utan bilder, lägger jag till en bild som visar på en annan fördel med "ett eget privat växthus".


Jag gjorde en flyttbar bänk och benstöd, att ställa på kanten av odlingsbänkarna.
Där kan jag sitta och läsa en bok och lyssna på hur chillina växer eller hur regnet skvalar - i allsköns ro.
Stolen fick av barnbarnens föräldrar genast namnet "Undanflykten". :lol:
Bilaga:
Undanflykten.jpg


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 17.01 2019-08-13 
Användarvisningsbild

Blev medlem: 18.09 2011-07-01
Inlägg: 9306
Ort: Helsingborg
Jag läser just nu en bok
"Han tog ett par höga kliv över ogräsbeståndet och satte sig på huk intill något som mer liknade rader och där plantorna var lägre. Bladen såg smala och stilettliknande ut."
Så vissa odlingar kan vara av mer styrt intresse.
Men helt klart , som sagt, en läsvärd tråd.


Upp
 Profil  
 
InläggPostat: 08.27 2019-08-15 

Blev medlem: 09.19 2019-07-25
Inlägg: 5
Ort: Partille
Trevligt projekt med många fina tips till alla och fanstastiskt fin dokumentation.
Men jag tror att du skall direkt byta ut alla slangar till ogenomskinliga.
Erfarenheten visar att det blir bakterie- och algtillväxt i alla vattenledningar och solljus gynnar.
Rätt som det är släpper det iväg och fastnar i en ventil, pump eller munstycke.
Det finns exempelvis svart pneumatikledning hos Festo eller SMC.

Tips från en med mångårig växthuserfarenhet.


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 11.21 2019-08-15 
Användarvisningsbild

Blev medlem: 20.30 2010-10-06
Inlägg: 183
Ort: Finland
Citera:
...det blir bakterie- och algtillväxt i alla vattenledningar och solljus gynnar.


Tack för det tipset!
Slangarna är förstås genomskinliga, för att man skulle se att och när vattnet strömmar.
En annan orsak varför dom blev valda är, att de är mjuka och böjliga. Pneumatikslangar har jag inte kollat, men skall göra det nu.
Än så länge har jag inte sett någon algtillväxt i dom, men däremot ganska rikligt av det i "saftkannan".
Jag måste säkert försöka "mörklägga" (skugga) den då på något sätt.

Sedan ett tack till alla kommentarer om dokumentationen! Tyvärr ser det nog bättre ut än det är.
Visst finna alla bilder, ritningar, schemor, excel-tabeller mm. sedan länge, men sammanställningen och brödtexten uppstår nog först on-the-fly
när jag skriver inläggen.

Därför kommer det också i delar. För att följande del inte existerar ännu... :eh:


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 15.45 2019-08-15 
Co Admin
Användarvisningsbild

Blev medlem: 12.32 2003-09-06
Inlägg: 21766
Ort: MadLand (Enköping)
Det näst bästa är gröna slangar om du absolut vill se vattnet. Brukar finnas att köpa där de säljer akvariegrejer.
Gröna växter reflekterar ju grönt ljus för att de inte använder det. Släpper man då bara in grönt ljus så växer det rätt dåligt. :)


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 10.42 2019-08-18 
Användarvisningsbild

Blev medlem: 20.30 2010-10-06
Inlägg: 183
Ort: Finland
MadModder: WoW! Det var intressant! Det där visste jag inte.
Då i början var det förstås viktigare med de genomskinliga slangarna. Då när man inte ännu visste om systemet ens skulle fungera! :wink:
Tänker nog byta ut dom till andra nu. Måste kolla vad man kan få tag på.


Sol igår och verandan målad! :tumupp: Då kan vi gå till:

PROGRAMMET, DEL 4

Allokeringen i parameterminnet – det externa EEPROMet – framgår ur kommentarerna till respektive rad i #define-delen i programlistningen.

En sammanfattning:
0x0000 – 0x007F: Zonparametrar, 8 bytes per zon. Studera rutinen för Meny 42 för mera exakta uppgifter.
0x0080 – 0x008F: Generella och växthusparametrar.
0x0090 – 0x009F: Signal- och statusflaggor.
0x00A0 – 0x00AF: Den senaste jordfuktmätningen (det analoga värdet, 8 bitars A/D).
0x00B0 – 0x00BF: TBD
0x00C0 – 0x00FF: Bevattningskön. (!)
0x0100 – 0x03FF: ”Under utveckling”, d.v.s. används för logg, meddelanden, felmeddelanden, mm. men den exakta allokeringen och betydelsen kommer med största sannolikhet att ändras.

Logiken i bevattningen ligger i bevattningskön. Den blev och heta ”kö” eftersom jag i början hade tänkt mig en FIFO-buffer där en rutin skuffar på nya uppgifter i bakändan, och en annan rutin betar av dem i framändan. Detta hängde ihop med att jag tänkte göra hela programmet interrupt-drivet.

Det hade säkert varit möjligt att få ett sådant upplägg att fungera, men, av orsaker jag nämnt även förut, d.v.s. att programmet mera skulle fungera som en s.k. ”state machine” och bl.a. närhelst skulle tåla t.o.m. en Reset, så fick jag aldrig någon rätsida på det.
Därför fick jag tänka om.
Det finns dessutom en annan hake! Det är långsamt att skriva till ett EEPROM. Efter varje skrivkommando måste man för säkerhets skull lägga in en ”delay” för att försäkra sig om att minnet hänger med.
Jag märkte detta då programmet gjorde alla möjliga konstiga saker i de mest enkla operationerna. Efter att jag lagt in ett ”delay(10)” efter varje skrivoperation blev det fason.

Enligt vad jag erfar jobbar Interrupt och delay mycket dåligt ihop...

Nu är då bevattningskön i stället en "dagorder" som utgörs av 4 bytes per zon, där de tre första anger bevattning vid de fasta bevattningstiderna (0800, 1400, 2000) och den fjärde är för manuellt beordrad bevattning.
Vid midnatt skrivs följande dags bevattningsschema in i kön (från zon-parametrarna). Noll för ingen bevattning ifrågavarande tidpunkt, etta för en gång och tvåa för två gånger. (Se rutinen presetwatering() i programmet).

Bevattningsprogrammet vet då vid respektive tidpunkt vilka zoner som skall vattnas och hur många doser. När en zon är färdigt vattnad ställs denna byte till noll. Därmed ”vet” bevattningsprogrammet efter en eventuell Reset precis hur långt det kommit i bevattningen.

Dessutom kunde jag konstatera två fördelar som ”bonus”:
- Ifall bevattningen avstannat p.g.a. att vattnet tagit slut, kan man också manuellt (Meny 20, Logg) enkelt se vilka zoner ännu inte blivit vattnade.
- Eftersom displayen rymmer fyra bytes per rad kommer bevattningskön (i Logg-displayen Meny 20) att synas som en prydlig tabell med respektive klockslag i egna kolumner. Med en enda blick ser man hela dygnets [kvarstående] bevattningsschema!

Enbart bevattningskön räcker dock inte till som signalering i fall av en Reset. Det behövs också en signalflagga (EEphasePtr) som berättar att en bevattning har påbörjats men inte slutförts. Det är med hjälp av den som programmet vet ifall det blivit avbrutet mitt i en bevattningsfas.
Signalflaggan antar värdet 1,2 eller 3, för respektive bevattningstillfälle (el. fas), eller 0 då ingen bevattning är på gång.

Ifall man beordrar manuell bevattning (i Meny 22, Växla nu) så sätts det en etta i kolumn 4 i bevattningskön för den valda zonen, och bevattningsfasen sätts till 4.

Det där låter kanske litet krystat, så det är bäst att titta på programflödet. Jag hänvisar först till ett tidigare inlägg där jag beskrev loop()-rutinen.
Den kallar på rutinen run30().
Bilaga:
run30_flow.jpg


Run30() pollar kontinuerligt tid, datum, temperatur, lufttryck, luftfuktighet, ljus och IR-ljus och sparar datat i en global matris hline[16].
Ifall tiden inte är en ”hel halvtimme” återgår kontrollen till loop():en och displayen uppdateras från matrisen hline[].
Run30() är designad att vara möjligast kort så, att sekunderna på displayen skall gå jämnt. Detta är inte ett utfall av fåfänga, utan då sekunderna uppdateras jämnt är det det bästa sättet att med en kort blick på displayen konstatera, att systemet beter sig som det bör.

Ifall tiden å andra sidan är en jämn hel- eller halvtimme, kallar run30() på en annan rutin, int30(), som pollar övriga sensorer och kallar på rutinen som sänder loggdatat över radion till servern. En flagga "Tflag" sätts också, för att förhindra att int30() kallas flera gånger under samma minut som tiden visar "en jämn halvtimme".
Ifall klockan är midnatt kallar den på rutinen som gör upp följande dags schema, och ifall det är tid för en bevattningsfas, sätter den bevattningsflaggan till respektive värde.

Kolla programlistningen för rutinen int30(). Man kan mycket enkelt lägga till en ”krok” även för nya uppgifter som skall hanteras vid speciella klockslag. Ex. kl 17 var satt en koll av jordfuktigheten, vilken eventuellt startat en extra bevattning, men den är f.n. inaktiverad p.g.a. korrosion.

Slutligen återgår då kontrollen till loop():en. Först där kontrolleras ifall en bevattningsfas är annonserad, och då startas den i rutinen watering().

För att en eventuell användarintervention inte skall orsaka försummelse av ett loggnings- eller bevattningstillfälle kallas run30() med jämna mellanrum även i ReadJoystick -rutinen. Tid, temperatur, mm. uppdateras förstås inte då på displayen, men ifall det blir tid för bevattning, får användaren vänta ett slag.

Det finns flera andra rutiner och hjälprutiner i programmet, men jag tror inte alla behöver beskrivas så här i detalj. Kolla listningen.

En sista kommentar om programmet: Allt emellanåt försöker programmet hålla vakthunden i styr.

Vakthunden utgörs av en timer (555) som f.n. tajmar ut efter ca. 80 sekunder ifall den inte matas och klappas. Jag satte tiden ”tillräckligt” lång så att den inte i misstag skall avbryta en pumpning, vilken kan ta en stund.
Sedermera har det ju visat sig, att en pumpning tar max ca 20 sek, så jag kommer nog att förkorta vakthundens tålamod också.


Nästa blir sedan att titta på vad som ännu skall göras. Återkommer.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 22.09 2019-08-19 

Blev medlem: 20.26 2003-06-21
Inlägg: 7440
Ort: Väster om Lund (0,67 mSv)
Hesabon skrev:
Citera:
...det blir bakterie- och algtillväxt i alla vattenledningar och solljus gynnar.


Tack för det tipset!
Slangarna är förstås genomskinliga, för att man skulle se att och när vattnet strömmar.
En annan orsak varför dom blev valda är, att de är mjuka och böjliga. Pneumatikslangar har jag inte kollat, men skall göra det nu.
Än så länge har jag inte sett någon algtillväxt i dom, men däremot ganska rikligt av det i "saftkannan".
Jag måste säkert försöka "mörklägga" (skugga) den då på något sätt.


Därför kommer det också i delar. För att följande del inte existerar ännu... :eh:


Verkligen fint bygge och väl dokumenterat.

Utöver algtillväxten- PVC slang åldras och styvnar med tiden. UV ljus skadar även slangen om den inte är skyddad mot detta.


Upp
 Profil  
 
 Inläggsrubrik: Re: Växthusautomation
InläggPostat: 22.21 2019-08-19 
Användarvisningsbild

Blev medlem: 18.09 2011-07-01
Inlägg: 9306
Ort: Helsingborg
Jag har sagt det tidigare, kan upprepa mig! Djävligt roligt att följa. En tråd som skulle kunna bli del av en bok!
Så jag skäller, i takt med watchdoggen. Viktiga hundar är bäst!


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 57 inlägg ]  Gå till sida Föregående  1, 2, 3, 4  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 8 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010