Structuur van arduino programma

Arduino specifieke Software
Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: Structuur van arduino programma

Berichtdoor René » 06 Mrt 2013, 18:58

Van astrofrostbyte kreeg ik onderstaand stuk code om een potmeter af te handelen.
Ik loop tegen problemen aan om de potmeter vervolgens in de void loop() te gebruiken.
Mjn schakeling is in orde en werkt als ik bijvoorbeeld het volgende probeer

Code: Alles selecteren
int potPin = A0;    // select the input pin for the potentiometer
int ledPin = 13;   // select the pin for the LED
int val = 0;       // variable to store the value coming from the sensor

void setup() {
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT
}

void loop() {
  val = analogRead(potPin);    // read the value from the sensor
  digitalWrite(ledPin, HIGH);  // turn the ledPin on
  delay(val);                  // stop the program for some time
  digitalWrite(ledPin, LOW);   // turn the ledPin off
  delay(val);                  // stop the program for some time
}


Maar met de onderstaande opzet lukt het mij niet.


Code: Alles selecteren
 struct Sensor_type {
 unsigned int Position;
 unsigned int RawValue;
 unsigned int OldValue;
 boolean      changed;
 boolean      valid;
};
Sensor_type Potmeter;

//-----------------------------------------------------------------
int Process_Potmeter() {
    Potmeter.RawValue = analogRead(A0); // read analog channel potmeter
    if( Potmeter.RawValue > 500)  // limit signal
       Potmeter.RawValue=500;     
    // Scale signal, store result in global Variable
    Potmeter.Position = 2 * Potmeter.RawValue + 20 ;
    if (Potmeter.OldValue != Potmeter.RawValue)
       Potmeter.changed = false;
    Potmeter.valid = true;        // set flag signal is valid and updated
}//Process_Potmeter 


Mijn vraag is dus hoe ik in de loop de potmeter kan lezen?
Groet
René

Advertisement

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

Re: Structuur van arduino programma

Berichtdoor astrofrostbyte » 06 Mrt 2013, 19:13

Ik denk dat je op zoek bent naar de functies in de standaard arduino EEPROM library http://arduino.cc/en/Reference/EEPROM

Hiermee kan je supersimpel bytes wegschrijven en teruglezen uit nonvolotile EEprom geheugen.

Na een tijdje zal je meer willen dan een paar bytes, en dan kan het handig zijn om al de gegevens die bewaard moeten worden in een 'structure' op te nemen, een structure heeft het voordeel dat je verschillende datatypes(int,string,float,...) lekker kan samenvoegen onder één referentie(pointer).
Dan is het makkelijker om een functie te hebben die een blok data wegschrijft en een blok data kan lezen uit EEprom.
Dat geeft je ook de mogenlijkheid om een extra CRC/Parity met dat blok data weg te schrijven om zeker te zijn dat de data niet 'Corrupted' is.

Meestal is het geval dat je bij het opstarten van het systeem aka in setup() dat blok leest.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: Structuur van arduino programma

Berichtdoor Karel » 06 Mrt 2013, 20:13

Er staat simpel hoe data te lezen en te schrijven. Maaarrr, het ene PROM is het andere niet. Is die EEPROM aan 'slijtage' onderhevig? Of kan je daar onbeperkt gebruik van maken? Bijvoorbeeld: bij mijn nog steeds in concept in mijn hoofd bestaande brandstofmeter, kan ik iedere 10 seconden de verbruikswaarden wegschrijven om een stroomstoring te overleven, of kan ik dan meter een SD-card gebruiken.

Groet, Kare

Edit: excuus, te snel gereageerd. Ik had de functiebeschrijvingen nog niet goed gelezen. Bij de write staat een Note:

An EEPROM write takes 3.3 ms to complete. The EEPROM memory has a specified life of 100,000 write/erase cycles, so you may need to be careful about how often you write to it.
If you think education is expensive, try ignorance! (Derek Bok)

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

Re: Structuur van arduino programma

Berichtdoor astrofrostbyte » 06 Mrt 2013, 21:06

Ja die slijtage valt wel mee gelukkig tegenwoordig, als je het narekend hoef je je er bijna geen zorgen meer om maken, zie vaak ook al 1M cycles in sommige EEproms.
Die opmerking om een CRC bij je blok mee te programeren is wel een oude truuk ter controle van 'versleten' bitjes.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: Structuur van arduino programma

Berichtdoor René » 06 Mrt 2013, 21:46

Bedankt voor de reacties.
Ik ga het uitzoeken/doen. Wil een van jullie ook nog eens naar mijn vraag over potmeter lezen kijken( en op reageren:)
Groet
René

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: Structuur van arduino programma

Berichtdoor Karel » 06 Mrt 2013, 22:07

Process_Potmeter is een functie van het type int.
Als je die functie wil gebruiken om de waarde terug te geven moet je in de functie een return gebruiken.

Code: Alles selecteren
//-----------------------------------------------------------------
int Process_Potmeter() {
    Potmeter.RawValue = analogRead(A0); // read analog channel potmeter
    if( Potmeter.RawValue > 500)  // limit signal
       Potmeter.RawValue=500;     
    // Scale signal, store result in global Variable
    Potmeter.Position = 2 * Potmeter.RawValue + 20 ;
    if (Potmeter.OldValue != Potmeter.RawValue)
       Potmeter.changed = false;
    Potmeter.valid = true;        // set flag signal is valid and updated

   // geef de gelezen waarde terug
   return(Potmeter.RawValue);

}//Process_Potmeter 


Verder is dit statement volgens mij tegengesteld aan wat je bedoelt:

Code: Alles selecteren
    if (Potmeter.OldValue != Potmeter.RawValue)
       Potmeter.changed = false;


Als de oude waarde ongelijk is aan de nieuwe waarde zou ik verwachten dat Potmeter.changed true wordt. Je zal dan bovendien de huidige waarde als nieuwe 'oude' waarde willen vastleggen. Dat wordt dan:

Code: Alles selecteren
   if (Potmeter.OldValue != Potmeter.RawValue)
   {
      Potmeter.changed = true;
      Potmeter.OldValue = Potmeter.RawValue;
   }
   else
   {
      Potmeter.changed = false;
   }
If you think education is expensive, try ignorance! (Derek Bok)

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: Structuur van arduino programma

Berichtdoor René » 07 Mrt 2013, 00:02

Karel bedankt maar.... het werkt nog steeds niet.

Ik heb dit:

Code: Alles selecteren
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 10, 4, 5, 6, 7);

struct Sensor_type {
  unsigned int Position;
  unsigned int RawValue;
  unsigned int OldValue;
  boolean      changed;
  boolean      valid;
};
Sensor_type Potmeter;

int val = 0;
// int potPin = A0; // dit werkt indien aktief

void setup() {


  // setting voor LCD scherm
  lcd.begin(16,2);              // columns, rows.  use 16,2 for a 16x2 LCD, etc.
  lcd.clear();                  // start with a blank screen
  lcd.setCursor(3,0);           // set cursor to column 0, row 0 (the first row)
  lcd.print("r1             ");    // change this text to whatever you like. keep it clean.
  lcd.setCursor(0,1);           // set cursor to column 0, row 1
  lcd.print("r2             ");

} // setup


int Process_Potmeter() {
  Potmeter.RawValue = analogRead(A0); // read analog channel potmeter
  if( Potmeter.RawValue > 500)  // limit signal
    Potmeter.RawValue=500;     
  // Scale signal, store result in global Variable
  Potmeter.Position = 2 * Potmeter.RawValue + 20 ;
 
  if (Potmeter.OldValue != Potmeter.RawValue)
   {
      Potmeter.changed = true;
      Potmeter.OldValue = Potmeter.RawValue;
   }
   else
   {
      Potmeter.changed = false;
   }

//  Potmeter.valid = true;        // set flag signal is valid and updated
  return(Potmeter.RawValue);
}//Process_Potmeter


void loop()  {
lcd.clear();
    val = (Potmeter.RawValue);       //Dit werkt niet
//    val = analogRead(potPin);      //Dit werkt indien aktief
    lcd.setCursor(0,0);
    lcd.print(val);
    lcd.setCursor(5,0);
    lcd.print(Potmeter.RawValue);  //Dit werkt niet
   
if (Potmeter.changed) {            //Dit werkt niet
    lcd.setCursor(0,1);
    lcd.print("changed");}         // Dit verschijnt nooit wat ik ook met de potmeter doe
else {
    lcd.setCursor(0,1);
    lcd.print("zelfde");           // Dit staat er altijd
}
     delay(600);
}//loop



Het werkt alleen met :
val = analogRead(potPin);

Ik gebruik het hele potmeter proces dan niet en definieer alleen "int potPin = A0;"

Ik ben (weer) even helemaal los grrr Leuk zo'n Arduino maar je moet wel geduld hebben

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: Structuur van arduino programma

Berichtdoor Karel » 07 Mrt 2013, 00:12

Je roept de hele functie Process_Potmeter niet aan. Probeer ipv

Code: Alles selecteren
   val = (Potmeter.RawValue);


dit eens:

Code: Alles selecteren
   val = Process_Potmeter();
If you think education is expensive, try ignorance! (Derek Bok)

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: Structuur van arduino programma

Berichtdoor Karel » 07 Mrt 2013, 00:17

Je kan het ook zo doen:

Code: Alles selecteren
void loop()  {
   lcd.clear();
   Process_Potmeter();
   val = Potmeter.RawValue;
etc.

If you think education is expensive, try ignorance! (Derek Bok)

Berichten: 132
Geregistreerd: 21 Feb 2013, 16:04

Re: Structuur van arduino programma

Berichtdoor René » 07 Mrt 2013, 10:24

Zo weer wat geleerd. Werkt prima zo. Bedankt. Wat mij wel verbaasd is het volgende:

Ik zeg " return(Potmeter.RawValue);"
en kan vervolgens ook de andere waarden uitlezen zoals Potmeter.changed en bijvoorbeeld Potmeter.Position
Ik verwachtte dat alleen Potmeter.Rawvalue dan beschikbaar kwam.
Op naar de volgende uitdaging: EEPROM lezen en schrijven binnen void loop()

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: DanielGix en 15 gasten