Datalog functie toevoegen aan Wattmeter

Betreft een Wattmeter (zie: Arduino wattmeter :: Elektronica Meettechniek
Ik heb deze gebouwd op prototype board en was al gelijk verbluft wat hij kan meten en hoe nauwkeurig die eigenlijk is.

Ik dacht; die wil ik ombouwen naar een stand alone versie datalogger. De wens is dat hij het voltage, de stroom en de tijd wegschrijft naar een SD kaart. Daar heb ik een SD module voor gekocht. Voor de uiteindelijke Wattmeter+ datalogger zal ik een Arduino Mega2560 gaan gebruiken omdat de Arduino Nano al nagenoeg door zijn geheugen was en #include <sd.h> al teveel voor hem werd.

Hieronder het "probleem"

Hier is de code:
https://www.uploadarchief.net/files/download/wattmeter%20v1.2.txt

Ik heb al aan de code een stukje sd kaart init toegevoegd en dat werkt.

Maar nu wil ik dus de waardes Volt, Ampere en Tijd wegschrijven naar de SD kaart (max value: 50V, 5A, 3 cijfers achter de komma, de 3 waardes mogen per regel als csv weggeschreven worden in een .txt). Het loggen / wegschrijven naar de sd kaart om de 15 seconden ofzo.

Dus ik dacht: "eerst maar even oefenen of ik een getal op de serial monitor kan krijgen. Helaas dus niet gelukt.

Dit zie ik staan in de code:

paramValues[0] = float(secMeanVolt) * Vscale / totAverage;  // calc. mean Voltage

paramValues[7] = float(secMeanCurr) * Cscale / totAverage;  // calc. mean Current

paramValues[21] = (float) round(timeCnt);                   // Time

Deze waardes wil ik dus om de 15 seconden weg laten schrijven.
Hoe krijg ik deze paramValue in de seriële monitor? Kan dit gewoon door een myFile.println("xxxxx"); commando?

2.jpg

Hoi michiel318, welkom.

Ik heb jouw code even in de IDE gekopieerd en bekeken.
Ik zie dan enorm veel variabelen die aangemaakt worden.
Zijn die echt allemaal nodig ?
Sommige daarvan zijn const in plaats van variabel, zijn er niet veel meer die een const kunnen worden ?
Een constante (const) is een vaste waarde waar je liever een omschrijving voor onthoudt.
Die gebruikt wel geheugen voor de compiler in de IDE, maar vrijwel niets voor je Arduino.
Er wordt in ieder geval geen x bytes werkgeheugen voor gereserveerd.
Het kan zomaar zijn dat als je meer consts aanmaakt, je dan alweer en hoop geheugen gaat winnen.

Gezien je vraag over het opzetten van een seriële verbinding, ben ik benieuwd hoever je bent met programmeer kennis (zie dat niet als kritiek).
In de code word van alles op een heel ondoorzichtige manier gedaan.
Het maakt op mij de indruk dat die code is geschreven door iemand die wil laten zien hoe ingewikkeld het is om een code te creëren, en hoe fantastisch die persoon (Freddy ?) daar dan wel in is.
Dat mag je wel als kritiek zien, want dat is het ook.
Maar ik heb het vermoeden dat je die code hebt geërfd van een ander project, en mijn kritiek is dan ook op de persoon gericht die dat heeft gemaakt.

Er is een functie die een korte delay() doet.
Die functie heet muDelay.
Mu of µ staat voor micro, en als je het over tijd hebt dan kom je dus uit op microseconden.
Die functie doet een aantal (9) malen helemaal niets (nop == No OPeration in machinetaal).
Waarom is dat nodig ?
Er is al een delayMicroseconds(), en die doet precies het zelfde; tijd verspillen.
Bovendien zie ik op veel plaatsen een soortgelijk stukkie assembler (machinetaal) code regels opduiken, die bedoeld zijn om tijd te verspillen (afgezien of dat noodzakelijk is of niet).

Dan heb je nog een berg port manipulaties, waar je voor de leesbaarheid veel beter gewoon de commando's die de IDE daarvoor biedt kunt gebruiken.

En er zit een zelfgebouwde functie in in plaats van een library, om de LCD te bedienen.
Maakt het er ook niet gemakkelijker op, al kan ik daarvan me eventueel nog wel voorstellen wat het voordeel ervan is.

Het staat een ieder vrij om dat soort dingen te doen, maar het word er dan niet bepaald gemakkelijker op om te lezen wat er allemaal gebeurt.
Das wel een beproefde manier om het lastiger te maken voor anderen om met jouw code aan de haal te gaan..

Laatste stukkie commentaar met een knipoog nog:
Als je hier komt vragen ben je van harte welkom.
En je word graag geholpen door de verschillende leden.
Maar vergeet dan niet het stukkie tekst uit je code even weg te halen dat vertelt hoe fantastisch Michiel dan wel is.
Want dat komt best wel lullig over..

Op je seriële monitor krijg je geen waardes door er een bestandsbewerking heen te sturen.
Maar een Serial.Println kan inderdaad wel.
In de balk hierboven kun je via Learning naar Reference gaan.
Daar kun je een hoop informatie terug vinden.
Veel succes, want ik denk dat je dat wel kunt gebruiken.

Goedenmorgen MAS3,

Ik ben niet Freddy :slight_smile:

Inderdaad het programma komt van de site Arduino wattmeter :: Elektronica Meettechniek
De taal die gebruikt wordt in de code vind ik erg assembler achtig. Ik ben heeel vroeger eens begonnen met asm te leren maar mee gestopt.....een te hoge taal voor mij :wink:

Je vraagt je af wat mijn programmeerkennis is: Ik kan arduino taal (c++) code lezen en leren begrijpen echter het zelf opbouwen lukt nog niet echt. Wel aan de hand van voorbeelden lukt me veel. Inderdaad een serial.print is geen probleem. Het is me wel gelukt om die 3 waardes naar de serial toe te zenden. Ik heb het verkeerd geschreven in mijn openingspost. Ik bedoelde eigenlijk dat het me nog niet is gelukt het naar de sd kaart te schrijven.

En idd dat stukje tekst in de code Michel is the best heb ik een beetje express gedaan om te kijken of de code wordt gelezen door de lezer. Als er een opmerking over komt weet ik dat hij hem gelezen heeft. Ik zal het inderdaad even weghalen, staat idd lullig heb je gelijk in.

Waar ik aan denk is dat het wegschrijven van de waardes naar de sd kaart te lang gaat duren. Het programma staat gewoon even stil. Het dubbel threaden van dit gaat me ver boven mn pet. Ik kan er nog aan denken om de waarde via serial te zenden naar een andere AVR die het dan wegschrijft naar de sd.

Als ik het quick and dirty wil doen kan ik met een if statement met de millis om de 15000 millis de waardes naar de sd sturen. Het programma en de lcd update staat dan wel even stil. Mooi is het niet.

Ik ben nu aan het leren over het opbouwen van een string.

Ik zal idd ook even kijken of ik niet wat meer constanten erin kan krijgen dan variabelen.

Voor nu weet ik even geen vraag maar misschien zijn er wel al tips om het programma niet te traag te krijgen als ik de waardes naar een sd wil sturen. het openen van een .txt , wegschrijven en sluiten van het bestand kost aardig wat tijd.

Assembler is geen hoge taal, maar een heel lage taal.
De taal wordt hoger naarmate ie uit meer leesbare code bestaat.
Maar dat maakt verder niet zoveel uit.

Om vertraging te voorkomen, moet je de vertragingen er uit halen.

Vertaal het woord vertraging eens naar het Engels, en lees mijn handtekening (dat wat er onder elk van mijn posts gezet word) ook eens.

Leg uit de uitkomst daarvan voor nu maar eens de prioriteit.

Als jij denkt dat dat wegschrijven te lang duurt, dan moet je dat dus gaan controleren.
Want dat is iets dat je gewoon kunt timen.
Schrijf daarvoor een stukje code dat alleen dat naar de kaart schrijven doet, en kijk hoe lang dat duurt.

Als je wel van een beetje paradox houd, dan schrijf je een programmaatje dat voor langere tijd naar de SD kaart wegschrijft hoe lang het wegschrijven naar de kaart duurt.
Die langere tijd is dan om te kijken of de uitkomt verandert als het bestand groeit.

Daar sla je een heel nest vliegen mee, en je leert als een tierelier, op een leuke manier, en doet daarbij precies wat je nodig hebt.
Zal wel ff doorpakken zijn, maar ja..

Probeer ook niet in 1 keer het hierboven voorgestelde programmaatje te bakken.
Zie je opdracht / probleem (die je jezelf stelt) als een verzameling van veel meer kleinere problemen.
Doe dat net zo vaak tot je dusdanig kleine problemen overhoudt, dat je zo de oplossing al ziet.
Los elk klein probleem op, en je hebt al bijna de code klaar.

Die 3 gegevens naar een sd kaart schrijven is hooguit 10ms dus daar kan het niet aan liggen.....

Ik ben een tijd bezig nu met de wattmeter en probeer eerst het geheel werkend te krijgen op de MEGA2560. Hier gebeurt iets raars.

Ik schiet dezelfde code in de mega2560 en de lcd werkt niet meer. Hoogstwaarschijnlijk doordat de lcd niet goed geïnitialiseerd word omdat ik de lcd wel op dezelfde poorten aan de gang krijg met de liquidcrystal library (hello world test)

  • waarom werkt de code wel voor de nano en niet met de 2560?
  • En waarom kan het lcd wel geinitiliseerd worden met de library en niet met lcdinitiate()

Beste michel318 (niet mijn woorden).

Deze code handelt dus zelf de handling van de LCD af, en slaat een library over.
Zoals eerder al gezegd, vermoed ik dat dat met timing te maken heeft, maar ik zie er verder het voordeel niet van en vind het nogal eigenwijs.

Als jij wil weten waarom de library wel werkt, en eigenwijs niet, dan moet je dus de library en eigenwijs tegenover elkaar houden en gaan uitzoeken wat de verschillen zijn.
En een 2560 is iets heel anders dan een 328 op een nano.
Dus als je dan met een eigenwijs programma moeilijk gaat zitten doen met direct port handling, dan is het niet zo vreemd dat je in de problemen komt.
Moet je eerst gaan uitzoeken in hoeverre ports B en D met de verschillende chips en de verschillende boards overeen komen.
Dat probleem heb je niet als je de Arduino pin nummers gebruikt, en tegen de IDE vertelt welk board je gebruikt.

Dus stapels datasheets downloaden en een week of 2 studeren.
Of de onzin uit je code slopen en gewoon de voorhanden gereedschappen (lees libraries) gebruiken.
Als je dat goed doet, word je code ineens veel breder bruikbaar dan nu, want de IDE neemt dan de aanpassingen voor het betreffende board voor haar/zijn rekening, mits goed ingesteld.

Beste Michiel, ik heb zonnepanelen en daarvan wilde ik de productie loggen. Hiervoor heb ik een digitale kWh meter aangeschaft die pulsjes afgeeft per 0,5 wattuur. Die pulsjes laat ik door een Uno tellen en via een SD shield met real time clock om de zoveel tijd wegschrijven naar een SD kaartje. Op een LCD display die ik aan de Uno heb gehangen laat ik elke tien pulsjes het vermogen in Watt van de afgelopen periode weergeven

De beschrijving en een link naar de sketch staan op:

kijk maar of je er iets mee kan doen !

Hoi photoncatcher.

Die code ziet er netjes uit, en zonder gedoe met port manipulation.
Jouw code heeft in ieder geval geen problemen met timing, onder andere omdat je maar 1 keer per 2 minuten naar de kaart gaat schrijven als ik het goed zie.
Jouw code zal ook niet afhankelijk zijn van welk board er gebruikt word, want er is gebruik gemaakt van standaard oplossingen.
Het is een veel betere start dan wat we eerder in deze thread zagen.
Maar ik heb geen idee of de te meten grootheden die de OP wil hebben, afhankelijk zijn van een heel exacte timing (maar waar in dat geval vast ook wel een oplossing voor te vinden is).
Dank je wel voor je bijdrage, hoewel ik niet de OP ben steek ik er ook weer wat van op.