Datum en tijd in SD als de sensor wordt geactiveerd.

Hallo,

Ik ben aan een project met de arduino aan het werken (een schoolproject: Hoewel ik nooit een microcontroller heb leren programmeren.). Ik heb de arduino nog maar een week dus ik ben nog vrij nieuw.

Het doel is om telkens in een file op de SD kaart de datum en tijd te noteren wanneer de pomp word aangestuurd door een sensor.

Ik heb een filmpje op YouTube gevonden dat me erg heeft geholpen: ( Arduino Tutorial Lesson 5.1 - SD Card Write - YouTube ) en ik heb zijn programma overgenomen als basis om verder te bouwen. (natuurlijk heb ik zijn naam vermeld)


Wat er moet gebeuren: Het programma kijkt eerst of er een SD kaart is ingeplugged, als dit niet zo is zal deze een error geven en de return functie uitvoeren. (Zal de return functie mijn Arduino resetten of in stand-by zetten tot hij manueel gereset wordt?) daarna wacht hij tot de sensor een signaal geeft (gesimuleerd door een knopje) aan de pomp. Als er een signaal is zal de display weergeven dat de pomp is aangestuurd en een SD file ondertussen openen.

Is er een signaal EN is er geen error door het openen van de file, dan zal deze de datum en tijd in het SD kaartje schrijven en een mededeling laten verschijnen dat er iets geschreven is op de SD kaart. Daarna sluit deze de file.

Als er een signaal is maar ook een error dan zal deze voor 5000ms de error laten zien en daarna een return functie uitvoeren.
Als er geen signaal is dan zal er op de display 'geen signaal' te lezen zijn en wachten tot een signaal (Daarom heb ik het in void loop gestoken zodat deze continu naar een ingang blijft zoeken.)

De Serial printlines zullen vervangen worden door commandos voor het LCD display (16x2)


Dit is de code:

/*
SD write by Aaron Lee
This sketch writes text data to an SD card

Simulatie van sensor - Pin 2
Master out slave in - Pin 11
Master in slave out - pin 12
Clock - pin 13
Chip select - pin 10
*/


#include <SD.h> //Bibliotheek voor de SD commands

const int buttonPin = 2; // Simuleren van een sensor dmv drukknop
int buttonState = 0 // variable van deze knop

File myFile; // Make een data file

void setup() 
{ 
Serial.begin(9600); // start communication at 9600baud

pinMode(buttonPin, INPUT); // Pin als input aanduiden
Serial.println("SD wordt geladen.."); // een mededeling dat alles goed gaat

if (!SD.begin(10)) // if command om te zien of er errors zijn, 10 is chipselect pin
{
Serial.println("SD card error") // Error als de SD niet geladen kan worden
return; //Stopt programma na deze error
}
Serial.println("SD geladen") // Zegt dat de SD succesvol geladen is
}

void loop()
{
  buttonState = digitalRead(buttonPin)
  if (buttonState == LOW) // Als de sensor geactiveerd is (Sensor is normaal gesloten)
{
Serial.println("Pomp staat aan") //Zegt wanneer de pomp geactiveerd is 
  myFile = SD.open("werkuren.txt", FILE_WRITE); // Opent en schrijft in het file
if (myFile) // If de sensor is geactiveerd AND if de file geopend kan worden
// Kben niet zo zeker van 2 IF functies in elkaar, maar er bestaat geen 'IF .. AND..' functie in arduino
{
  myFile.println("Date and time"); // Schrijft de datum en tijd in de SD kaart (dit ben ik nog aan
  //het onderzoeken hoe ik dit ga doen, tijd van een clock shield? Maar waarvan de datum dan?)
  Serial.println("Opgeslagen op SD") // Zegt dat er iets geschreven is in het SD kaartje
  myFile.close() // Sluit de file tot de volgende keer de sensor actief is (Daarom void loop)
}
else
{
  Serial.println("Error met bestand") // Error als het bestand niet kan geopend worden
delay(5000)
return; // na 5seconden returned het programma
}
}
else
{
 delay(1000); 
 Serial.println("Pomp staat uit") // Als er geen signaal is laten zien dat de pomp niet werkt
}
}

Alle hulp is welkom!

Ik heb hele stuk nu 2x gelezen..... maar wat is je vraag?

nicoverduin:
Ik heb hele stuk nu 2x gelezen..... maar wat is je vraag?

Ja, inderdaad dat is de vraag. :wink:
Jantje

Haha oeps!

Ik had het eerst in het Engelse forum geprobeerd en daarna vertaald naar het Nederlands maar het laatste stukje is er een beetje afgevallen..

Mijn vraag was: Of ik een reset kan gebruiken IPV die return? Want die zou mijn arduino op 'stand-by' zetten en laten wachten op een manuele reset?

Ook:
Eventuele controle van het programma op beginnersfouten?

Ik zou graag wat feedback krijgen of ik wel goed bezig ben.. Als beginner probeer je je weg te vinden maar het kan zijn dat ik de Arduino iets teveel met een PLC vergelijk en dingen in deze code schrijf waarvan jullie je haren uit je hoofd zouden trekken.. :smiley:

EDIT: ik heb het even laten verifieren door arduino maar ik krijg de error:
"'else' without a previous 'if'"

dit is het stukje code waar ik de error krijg:

 {
  buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH); // If the sensor is activated
 {
   Serial.println("Pump is activated"); //Give a notification that the sensor triggered the pump  
  myFile = SD.open("werkuren.txt", FILE_WRITE); // opens and write to the file
}  
else
{
 delay(1000);
 Serial.println("No signal"); // If there is no signal, display it on the screen.
}
  
if (myFile) // If sensor is activated and if myFile opens
{
  myFile.println("Date and time"); // Writes date and time on the SD card (I'm still figuring this out
  //I have no idea of how I can get the date but the time I can get from a clock shield?)
  Serial.println("Written to SD"); // gives a notification that there has been written on the SD
  myFile.close(); // Closes file untill next time the sensor is active?
}
else

Bij de eerste 'else'...

Dat foutje van de if zit in de ";" aan het einde van het statement

 if (buttonState == HIGH); // If the sensor is activated

Door die punt-comma heb je het statement al afgesloten.

reset
Je kan altijd de arduino softwarematig resetten. ff googelen op software reset arduino. Vind je zo.

Hoewel de veel ontwikkelaars tegenwoordig eerst gaan "tikken" en pas daarna "nadenken" :grin: zou ik je adviseren om eerst een structuur te maken wat je wilt. Hierbij kun je gebruik maken van bijvoorbeeld "flowcharting". Het valt mij op dat dit kennelijk niet zoveel meer wordt onderwezen in het onderwijs omdat alles "gisteren" klaar moet zijn en we maar "on the fly" bedenken wat er moet gebeuren. Maar soms is het toch wat handiger om eerst na te denken en dan pas te doen.

Voor wat betreft de "file handling" zou ik de file openen in de setup() en telkenmale als je geschreven hebt, even de flush() functie uitvoeren. Zodoende wordt de laatste data ook naar de SD kaart geschreven. Een file elke keer openen en sluiten is een "dure" (ihkv resource gebruik) oplossing.

Bedankt voor de reactie!
Ik zal je advies ook in het achterhoofd houden en uitproberen!

Defink:
Bedankt voor de reactie!
Ik zal je advies ook in het achterhoofd houden en uitproberen!

Volgens mij kun je het be

Defink:
Bedankt voor de reactie!
Ik zal je advies ook in het achterhoofd houden en uitproberen!

En vooral niet een of ander tooltje zoeken ervoor. Voor 3 euro heb je 500vel (met dank aan de tip van Paul Deelen) A4 papier. Hoef je alleen een potlood en gummetje te hebben.... Waarom?.... omdat je dan bezig bent met het uitzoeken van het probleem gebied en niet met het uitzoeken van het tooltje. Voor je het weet is het een doel op zich geworden.... Dus gewoon papier gebruiken..... nog steeds meest effectief :slight_smile: