Pagina's

zondag 24 mei 2020

SD

20-5-2021

Ik ben weer eens in de SD gedoken, want die lag werkeloos aan de kant. Zelfs de preciese reden daarvan weet ik niet meer.

Ik ben bezig verschillende logboeken te maken, zodat ik kan zien wat ik ook al weer heb gedaan, en waarom.
Voor de SD betekent dat, dat ik nu precies weet hoe ik data moet verwerken. Als simpel voorbeeld: als ik het getal 1034 heb, wil ik niet dat dit 4 geheugenplaatsen inneemt, terwijl het ook met 2 kan. Het getal 34567 nog steeds 2 geheugenplaatsen, tegen 5 in normale opslag.
Maar dat vereist een gedegen protocol, en dat is gelukt. 

Het deel waarmee ik data wil verzamelen om uiteindelijk in excel te plaatsen, heb ik helemaal opnieuw aangepakt. De reden hiervan is, dat ik weet dat ik hoe langer hoe meer ervaring opdoe over het programmeren opzich. Ik pak dingen sreeds slimmer en gestructureerder aan, met alle voordelen van dien.
Oude programma's bezie ik nu als wat geklungel. Daar zit ik overigens niet mee hoor, dat is gewoon zo. En nog steeds leer ik veel bij.

Met een paar simpele handelingen op de bediening in de werkkamer, kan ik allerlei zaken aansturen aan de SD. Bijvoorbeeld ook een overzicht geven van alle bestanden op de SD. Er staan vaak indrukwekkende getallen achter, dat de bestandsgrootte weergeeft. Maar hoeveel is dat nou in totaal? Loop ik op een gegeven moment niet vast op het totale geheugen van de SD-kaart?
Die vraag heb ik nu kunnen beantwoorden door het totaal verbruikte geheugen weer te geven onderaan het overzicht. Maar dan liep ik gelijk tegen een ander probleem: ik heb geen direkte mogelijkheid om zo'n grote getallen weer te geven, laat staan mee op te tellen.
Ik heb een SD-kaart van 16GB.
Het grootste getal dat ik in de arduino kan weergeven met 100% preciesie is ruim 4 miljart. Voor grotere getallen ben ik die preciesie kwijt; het getal 1 of 2, of zelfs nog groter, kan hij niet meer optellen.


Dus heb ik een andere methode ontwikkeld.
Voor elk cijfer van het getal, gebruik ik 1 geheugenplaats, 1 byte.
Voor het getal 16GB heb ik dus 11 bytes nodig.
Ik gebruik 2 van die reeksen, 1 "resultaat" en 1 "opteller". Het resultaat hoef ik verder niks aan te doen, dat blijft zo. De opteller moet ik eerst bewerken: van een normaal getal moet ik elk cijfer appart in de byte plaatsen. 
Vervolgens tel ik de twee reeksen bij elkaar op, zoals je dat zou doen op papier. Gewoon per cijfer bij elkaar optellen. Hierbij moet ik er voor zorgen dat de cijfers niet groter worden dan 9, want elk cijfer kent het getal 0 tot 9. (terwijl elke byte tot 255 kan komen). Het optellen is dus optellen per byte, en eventueel 1 onthouden, en bij de volgende bij op te tellen, echt, zoals je op papier zou doen.

Elke keer als ik een bestand lees, of eigenlijk weergeef, kan ik de grootte van dat bestand bepalen. Die druk ik af, vanwege het overzicht. Tevens plaats ik dat getal in de opteller, en tel ik dat op bij het resultaat. Op het einde van het overzicht toon ik het totaal, het resltaat, inclusief de voorloopnullen. Die voorloopnullen zijn niet gebruikelijk, maar hier heb ik die mogelijkheid wel. En dan zie ik in een oogopslag, hoeveel ik nog afzit van het totaal van 16GB.
Bovendien kan ik punten plaatsen bij de duizendtallen enz. En dat kan normaal niet. Dan heb je gewoon een reeks cijfers achter elkaar, en zie maar waar de makkelijke punten staan.
Bovendien 2, (ha), kan ik dit systeem onbeperkt uitbreiden voor de hoeveelheid cijfens dat ik nodig heb.

23-1-2021

Het blijkt dat bepaalde handelingen op de SD zeer tijdrovend zijn. Met name een backup maken van de data op een gegeven moment kan wel een kwartier in beslag nemen.
Hier ben ik erg van geschrokken. Want al die tijd neemt de SD nauwelijks nieuwe data op. Ik schrijf expres nauwelijks, omdat de eerste 64 bytes wel worden gebufferd. Maar dat is zeker niet genoeg.

Waar ik mee ben begonnen is, een netwerkbuffer te maken met een apparte arduino, een voorportaal zeg maar voor de SD.
De SD zelf neemt dus geen data meer aan van het netwerk. Dat doet de netwerkbuffer nu dus. Die buffer is in eerste instantie 1000 bytes groot, en dat is aanzienlijk meer dan de 64 bytes van de processor zelf.
De netwerkbuffer geeft zijn data pas door, als de SD het weer aankan. En dat is een kwestie van seintjes naar elkaar geven en daarop reageren.

Overigens heb ik het backuppen van data eruit gehaald, omdat ik regelmatig de data op de computer zet. Waarom dat backups maken op de SD?

29-10-2020

Het is al weer even geleden, maar toch weer wat aan de SSD gedaan.

Na wat resultaten van het weerhuisje opgeslagen te hebben, heb ik de SSD afgekoppeld. Ik was toch niet echt tevreden hoe ik de data op zou slaan.

Nu, in afwachting van de resultaten van de regenmeter, ben ik weer in de SSD gedoken.
En wat blijkt, ik kan de data met een vijfde van de ruimte opslaan, en dat is wat ik wilde. Het is alleen even het uitvoeren.

Verder kan ik straks de data van de regenmeter en de barometer opslaan.

Verder denk ik na over her aansturen van de SSD vanuir de bediening. Menugestuurd wil ik alle data die op de schijf staat, tevoorschijn toveren voor verwerking. Want dát is natuurlijk waar het allemaal om draait: opslaan, registratie, en analiseren van de data.

23-6-2020.
Nu heb ik toch niet de oude print kunnen gebruiken.

Een nieuwe print betekent ook een nieuwe opzet. Het is een heel compact station geworden. 7x7cm, zonder stekers. Het werkt als het ware als een harde schijf, maar dan solid-state, een SSD als het ware.
Ook de voeding is aangepast. Voor het eerst gebruik ik geen lineaire voeding, maar een schakelende. Het grote voordeel hiervan is, dat deze veel efficienter met de energie omgaan. Een lineaire voeding vernietigt (= omzetten in warmte) het teveel aan spanning, terwijl een schakelende elke keer kleine beetjes spanning aanvoerd wat nodig is om de boel draaiende te houden. zoiets als "je krijgt wat je nodig hebt, en niet meer". Alleen doet hij dat ongeveer 1 miljoen keer per seconde. (heb ik zélf geteld)

De tweede stap was, om deze SSD te kunnen beheersen. Dat gaat hoe langer hoe beter.
De nieuwe processor gaf nog wat problemen, maar dat lijk ik nu onder de knie te krijgen.

Volgende stap is om de meetwaarden van het weerhuisje op te slaan.
_____________________________________________
16-6-2020.
Gewoon maar weer eens op internet gekeken. Er zijn een aantal ontwikkelborden, die zeer aantrekkelijk zijn. Alleen is de prijs niet echt aantrekkelijk. €200 tot € 400 is niks.

Nu kwam ik ook op een website terecht, waar de arduino nano 3.3 werd beschreven. Ja, die had ik al eens eerder gezien, maar vanwege die 3.3 ben ik er niet verder ingedoken.
Maar wat blijkt? De eigenschappen dat deze 3.3 hebben (ja, meerdere types), zijn voor mij zeer aantrekkelijk. Met name het hoeveelheid geheugen. En dan praat je over 30 keer het programmageheugen, en 128 keer het variabelengeheugen. JA, daar kan ik wat mee.

En die 3.3 dan?
Op het moment ben ik daar ook niet meer bang voor. Ik heb het al eerder aan de hand gehad met de barometer. Het heeft me, door het experimenteren, wel een barometer (van een paar euro) gekost, maar nu beheers ik die techniek.

Want wat is 3.3 eigenlijk.
Heel simpel. Alle arduino-kaarten werken standaard op 5Volt, zowel voeding als logica. Alleen de 3.3 werken op 3,3Volt. En dát moet je goed begrijpen.
Nu zijn er in de handel heel simpele oplossingen hiervoor, alleen moet je dat wel weten.
Gelukkig wordt je veelvuldig gewaarschuwd voor dit verschijnsel, en zelfs oplossingen aangedragen, dus is het niet moeilijk meer. Want als je het begrijpt, dan kan je zelf oplossingen bedenken.
En die oplossing is een converter, omzetter, die 5Volt in 3,3Volt omzet, en andersom. Dus als je die tussen al je datalijnen zet, en de juiste voeding geeft, is het opgelost.

Praktisch gezien kan ik het printplaatje gebruiken van de eerste opzet van de SD. Het enige is, dat de converter erbijgezet moet worden en die ruimte heb ik op de printplaat.
Bovendien is dit printplaatje 1 op 1 oversteekbaar met de gewone nano, buiten de converter om dan. Dus de bedrading moet ik aanpassen.
______________________________________________
10-6-2020.
Ik ben al weer een poos bezig om iets zinnigs op de SD te zetten. Een beetje mee spelen is wel leerzaam hoor, maar je wilt er op een gegeven moment ook wel iets leuks mee doen.

Ik wilde de resultaten van het zonne-oog laten opslaan. Dus die twee dingen met elkaar laten praten. Beide stations hebben een flinke update gehad.

De processor van de SD kreeg het best wel voor de kiezen.
En wat blijkt weer: mogelijk geheugenproblemen. (alweer??)
En ik ben pas bij het begin!
Ik ben bang, als ik een mega2560 gebruik, dat het niet genoeg is. En iets anders héb je gewoon niet, of je moet naar de pi gaan, maar dat is geel arduino. En de pi is erg duur, maar dan héb je ook wat. Het is eigenlijk een kompleet moederbord op miniformaat.

En wat nu???????
_____________________________________________
6-6-2020.
Afgelopen dagen ben ik intensief met de SD bezig geweest.
Het verwerken van data is nog niet zó eenvoudig.

Ik heb besloten om elke dag, per sensor, een nieuw bestand aan te maken. Dit, omdat elke sensor zijn eigen interval-tijd kan hebben, waardoor ze dan veschillende grootte hebben, waardoor ze niet synchroon in de tijd zijn.
Bovendien wil ik de bestanden nog enigszind hanteerbaar maken.

Hierdoor is het logisch dat de bestanden een datumfactor moeten meekrijgen. Dit los ik op door mappen aan te maken met als naam de datum van vandaag. Het formaat van de mapnaam wordt dan jj-mm-dd.

Elk databestand heeft zijn eigen naam. bijv. S01TEMP1. S van sensor, 01 is volgnummer en de rest een verkorte naam van de sensor. Altijd 8 tekens lang.

Om niet te hoeven rekenen (kan trouwens niet in arduino) heb ik een datum-bestand aangemaakt. Daar staan 3 datums in: van vandaag, van gisteren en van eergisteren.
Elke dag om 00:00 uur wordt dit bestand opnieuw geschreven (overschrijven lukt niet). En dan natuurlijk weer met 3 datums. Van de afgevallen datum worden de backup-bestanden gewist. van de datum van gisteren worden backup-bestanden gemaakt.
Bovendien wil ik elke uur de backup bijwerken.
Backup-bestanden gebruik ik om bij eventuele calamiteiten terug te kunnen grijpen naar deze bestanden. Zo heb ik altijd van 2 dagen van alle data een backup.

Ook elke dag om 00:00 uur wordt er een map aangemaakt met de dag van vandaag. Daaronder komen alle nieuwe databestanden te staan. De naam van die bestanden haal ik uit het index-bestand.

Het index-bestand bestaat dus uit de naam van het databestand. 
Als 2e item de volledige naam van de sensor. maximaal 30 tekens.
Als derde item de intervaltijd van opslag naar SD. Het formaat hiervan is 000500. Dit is elke 5 minuten.

Ik denk nu dat ik het redelijk op de rit heb om dit allemaal automatisch te laten plaatsvinden. Er zullen heus nog wel wat onregelmatigheden voordoen, maar daarvoor hebben ze het woord testen of debuggen uitgevonden.
______________________________________________
31-5-2020.
Inmiddels heb ik een protocol geschreven voor de seriele overdracht en opslag op SD.
Ik ga toch met integers werken.
Het grote voordeel is dat ik alle data op dezelfde wijze kan hanteren.
Bovendien kan ik met negatieve getallen werken.
En dat allemaal zonder een stopbit te genereren.
De enigste "beperking" is dat ik getallen tussen -8191 en 8191 kan verwerken.
__________________________________________
28-5-2020
Het is me echt meegevallen om met de SD te werken.

Wel heb ik verschillende manieren van opslag uitgeprobeerd. En dan kijken welke manier voor mijn doel werken.
En ook hier heb ik gekozen voor opslag van waarden kleiner dan 128. Want de data komt rechtstreeks van de seriele overdracht van de betreffende stations, en daar hanteer ik deze regel. Dit heeft te maken met het creeeren van een stopbit in de data; hiermee wordt het laatste stukje data aangegeven in de dataoverdracht.

Als ik dit zo opschrijf, bedenk ik me dat ik in plaats van bytes ook integers kan gebruiken als dataopslag. Alleen heb ik dan 2 bytes nodig per waarneming. Dit zou me best kunnen helpen om data makkelijker te versturen, in alle datastromen die er in het gehele project zijn.
En nu kan ik nog met enig fatsoen ingrijpen in het proces, straks als ik veel meer on-line heb staan, zal dat veel ingewikkelder worden.

BYTE vs INTEGER.
Alle informatie dat de processoren versturen, is 8 bits. (hee, dat klinkt bekend. Zo kennen we ook 16 bits en 32 bits in de computerwereld) Ik moet dus met 8 bits werken.
Een BIT is het kleinste stukje geheugen in een processor (of computer). Een BIT kan 2 standen aannemen, aan of uit, een 1 of een 0. meer niet!
Een 8 bits blokje noemen ze een BYTE. Hierin zijn 256 mogelijkheden, als je alle mogelijkheden bekijkt. 0 tot 255. Na 255 wordt het vanzelf weer 0, de zogenaamde overflow. Meestal is dit voldoende.

intermezzo:
In de overgang van het millennium zaten we hierdoor dik in de problemen met alle computers. Weet je dat nog? de zogenaamde millennium-bug was een fijt.
Wat was er aan de hand?
Vroeger was geheugen een heel kostbaar product. Er werd meer met kilobytes gewerkt, nu zijn dat megabytes, en zelfs gigabytes, en terrabytes zijn er ook al volop.
Doordat er vroeger weinig geheugen voorhanden was, werden in data de notatie van de datum slechts 2 cijfers gebruikt. En als men ergens een datum moest noteren, werd daar het getal 19 voor gezet, en had je 1953 (bijvoorbeeld).
Nou, en dat dus na 31 dec 1999 heel lastig, want je zou dan, met de eerder genoemde overflow, weer teruggaan naar 1900 in plaats van 2000. Ed nou net dát was het probleen, want alle systemen die met de datum rekenen, slaan op tilt.
De hele millennium-operatie was dus alleen het verwerken van de datum-notatie in een 4-cijferige opslag in plaats van 2-cijferig.

In mijn project gebeurt iets soortgelijks. Ik moet heel erg oppassen dat ik geen getallen gebruik groter dan 127. Want hierdoor krijg ik ongemerkt een stopbit in de datastroom, en worden verdere data vermeden. Hierdoor zijn de datastromen niet volledig, en bij een volgende datastroom wordt de data verkeerd geintrepeteerd. Dit, omdat de rest van de vorige stroom data als nieuwe data wordt gezien.
Ook de beperking van het grootste getal is lastig. Een barometerstand van 1014 mBar moet op een andere manier toegepast worden. Maar hier had ik gekozen voor de datum-constrctie zoals vroeger op de computers werd gedaan Ik trek 950 af van het getal, dus sla ik 0 tot 127 op, wat overeenkomt met 950 tot 1077. En mij enige notatie op scherm bijvoorbeeld, tel ik er gewoon weer 950 bij op.
Zoiets dergelijks moest ik gebruiken bij de buitentemperatuur.
Omdat bytes geen nagatieve getallen kan herbergen, moet ik de constructie bedenken plus en min 60 (bijvoorbeeld) Ik kan dan temperaturen van -60 tot +67 graden verwerken. Maar ook híer zou ik dus een aparte constructie moeten maken.

Een INTEGER daarentegen heeft 16 bits. En daarmee kan ik het getal van iets meer dan 64000 creeeren. Nou hier kan ik wat mee.
Want, nu hóef ik nergens meer met allerlei constructies te werken. Nu kan ik alle beschikbare data één op één overzetten, zonder rekening te houden met enige vorm van omzetten. Bovendien heb ik de mogelijkheid om negatieve getallen te gebruiken, dat een voordeel is van integers.


______________________________________________________
24-5-2020
Gisteren ben ik bezig geweest met de studie over het verwerken van data op een SD kaartje.

Printje is geschikt voor een micro SD van maximaal 32GB. Nou, die gaat er dus ook in, want ik wil met één kaartje volstaan, voor altijd.

De studie behelst hoe ik moet handelen om data weg te schrijven en hoe ik deze data weer kan uitlezen voor later gebruik.
Zo denk ik bijvoorbeeld om de data te gebruiken om rechtstreeks in te lezen in excel. Maar dát is nu nog een stap te ver hoor, laat ik eerst maar eens kijken en oefenen hoe het opstaan en weergeven van data werkt.

Wat wil ik opslaan:

  • natuurlijk de temperatuur buiten.
  • vochtigheid buiten.
  • luchtdruk buiten.
  • regenmeter (ook buiten).
  • windrichting.
  • windsnelheid, gemiddeld en piek.
  • aantal uren zon.
  •  
  • verder denk ik de vochtigheid binnen.
  • temperatuur binnen.
  •  
Kortom, hoofdzakelijk alle elementen van het weer.

De SD bewerkingen vormen een eigen station met processor. Deze krijgt de data toegezonden van alle andere stations.

De SD wordt aangestuurd vanuit een bibliotheekbestand. Hierbij zijn uitgebreide voorbeeldprogramma's voorhanden.
Wel mis ik nog enkele bewerkingen, die niet genoemd zijn in de bibliotheek-overzicht, de SD library. En hierbij is internet wederom een uniek medium om ook deze dingen uit te zoeken.

Dit printplaatje wordt aangestuurd via het SPI protocol. Dit is nieuw voor me, ja, ik kende het wel, maar heb er nog nooit mee gewerkt.

Geen opmerkingen:

Een reactie posten