Pages: [1]   Go Down
Author Topic: in eeprom speichern und auslesen funtzt nicht  (Read 510 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hallo

mit arduino steuer ich eine led und einen motor. wie lange die led und der motor an sind, steuer ich mit processing. später soll es über bluetooth vom einem android gesteuert werden.
dabei speicher ich die übermittelten daten im eeprom, so dass das arduino einerseits autonom läuft, aber andererseits kann ich die led und den motor steuern.

aber leider leuchtet die led dauernd. laut script sollte es 10 sekunden sein.

processing script
Code:
// import the processing serial library
import processing.serial.*;
// and declare an object for our serial port
Serial port;
 
void setup() {
  // Get the name of the first serial port
  // where we assume the Arduino is connected
  String portName = Serial.list()[0];
  // initialize our serial object with this port
  // and the baud rate of 9600
  port = new Serial(this, "COM5", 9600);
}
 
void draw() {
  // Szenedauer, wie lange soll die Kamera Fotos machen.
  int szh = 00;
  int szm = 30;
  int szs = 00;
 
  // Belichtung, wie lange soll die Belichtungsdauer sein
  int bzm = 00;
  int bzs = 10;
 
  // Interval, wie lange dauert es zwischen zwei Fotos.
  int izm = 00;
  int izs = 10; 
 
  // load up all the values into a byte array
  // then send the full byte array out over serial
  // NOTE: This only works for values from 0-255 
  byte out[] = new byte[7];
  out[0] = byte(szh);
  out[1] = byte(szm);
  out[2] = byte(szs);
  out[3] = byte(bzm);
  out[4] = byte(bzs);
  out[5] = byte(izm);
  out[6] = byte(izm);
  port.write(out);
}

arduino script
Code:

int Motor = 8;
int ledPin = 10;
const int buttonPin = 2;
int buttonState = 0;
int Motorlaufzeit = 2500; // Zeit hängt davon ab, wie lange die gesamte Fotosession sein soll. Der Wert muss per Smartphone definiert werden
int Leerlauf = 5000; // Pause zwischen den Fotos sollte immer 5 Sekunden betragen
int Pause = Leerlauf - Motorlaufzeit;
int stop = 0;
int Belichtungszeit = 5000; // Belichtunsgzeit der Kamera. Der Wert muss per Smartphone definiert werden.

void setup() {
  pinMode(Motor, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}
 
void loop()
{
  buttonState = digitalRead(buttonPin);
  if (stop == 0 and buttonState == HIGH) {
    digitalWrite(Motor, HIGH);
    delay(Motorlaufzeit); //Zeit während der Motor läuft
    digitalWrite(Motor, LOW);
    delay(250);  // Pause zwischen Motorbetrieb und Fotoauslösung, damit die Kamera nicht wackelt.
    digitalWrite(ledPin, HIGH);
    delay(100); // Impuls an den Fernauslöser wird gegeben. Vielleicht muss die Zeit noch kürzer sein.
    digitalWrite(ledPin, LOW);
    delay(Belichtungszeit);
    delay(Pause);
 
  }
   else {
    digitalWrite(ledPin, LOW);
    digitalWrite(Motor, LOW);
    digitalWrite(buttonState, LOW);
    stop = 1;
  }
}
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20196
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich nehme mal an daß beim Einschalten des Arduinos der Taster nicht gedrückt ist.

Hast Du das Led zwischen Ausgang und +5V geschaltet?

Beim ersten Duchlauf des Arduino Sketches ist  "if (stop == 0 and buttonState == HIGH) {" unwahr da der taster nicht gedrückt ist und somit wird
"digitalWrite(ledPin, LOW);
 digitalWrite(Motor, LOW);
 digitalWrite(buttonState, LOW);
 stop = 1;"
gesetzt und das wars. Die "if (stop == 0 and buttonState == HIGH) {"  bleibt für immer unwahr.

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hallo

ich habe den code mit dem button raus.
ohne eeprom funktioniert es, aber mit nicht mehr.

processing
Code:
// import the processing serial library
import processing.serial.*;
// and declare an object for our serial port
Serial port;
 
void setup() {
  // Get the name of the first serial port
  // where we assume the Arduino is connected
  String portName = Serial.list()[0];
  // initialize our serial object with this port
  // and the baud rate of 9600
  port = new Serial(this, "COM5", 9600);
}
 
void draw() {
  // Szenedauer, wie lange soll die Kamera Fotos machen.
  int szh = 1;
  int szm = 10;
  int szs = 00;
 
  // Belichtung, wie lange soll die Belichtungsdauer sein
  int bzm = 1;
  int bzs = 10;
 
  // Interval, wie lange dauert es zwischen zwei Fotos.
  int izm = 00;
  int izs = 5; 
 
  // load up all the values into a byte array
  // then send the full byte array out over serial
  // NOTE: This only works for values from 0-255 
  byte out[] = new byte[7];
  out[0] = byte(szh);
  out[1] = byte(szm);
  out[2] = byte(szs);
  out[3] = byte(bzm);
  out[4] = byte(bzs);
  out[5] = byte(izm);
  out[6] = byte(izm);
  port.write(out);
}

arduino code
Code:
#include <EEPROM.h>
int currentValue = 0;
int values[] = {0,0,0,0,0,0,0};
int szh;
int szm;
int szs;
int bzm;
int bzs;
int izm;
int izs;
long szene;
long belichtung;
long interval;
int ledPin = 13;
int Motor = 8;
void setup()  {
  Serial.begin(9600);
}
 
 
void loop() {   
  if(Serial.available()){
    int incomingValue = Serial.read();
   
    values[currentValue] = incomingValue;
 
    currentValue++;
    if(currentValue > 6){
      currentValue = 0;
    }
    EEPROM.write(0,values[0]);
    EEPROM.write(1,values[1]);
    EEPROM.write(2,values[2]);
    EEPROM.write(3,values[3]);
    EEPROM.write(4,values[4]);
    EEPROM.write(5,values[5]);
    EEPROM.write(6,values[6]);
   }
  // alle gespeicherten daten werden geladen
  szh = EEPROM.read(0);
  szm = EEPROM.read(1);
  szs = EEPROM.read(2);
  bzm = EEPROM.read(3);
  bzs = EEPROM.read(4);
  izm = EEPROM.read(5);
  izs = EEPROM.read(6);
 
      // szenedauer werden in sekunden umgerechnet
  // wird später noch in der berechnung berücksichtigt
  szene = (szh * 3600000) + (szm * 60000) + (szs * 1000);
 
  // belichtungszeit wird in sekunden umgerechnet
  belichtung = (bzm * 60000) + (bzs * 1000);
 
  //interval wird in sekunden umgerechnet
  interval = (izm * 60000) + (izs * 1000);
 
 
    digitalWrite(ledPin, HIGH);
    delay(5000); //muss auf 10 sesenkt werden
    digitalWrite(ledPin, LOW);
    delay(belichtung);
    digitalWrite(Motor, HIGH);
    delay(100); //muss noch dynamisch werden, kommt drauf an, wie schnell sich der slider bewegt.
    digitalWrite(ledPin, LOW);
    delay(interval);


}
« Last Edit: July 08, 2013, 03:34:23 pm by handyaner » Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 15
Posts: 1066
I am 1 of 10 who understands binary
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dein EEPROM kann nur einzelne Bytes(0-255) speichern/auslesen. Dann sind die Daten nicht Korekkt
Du hast aber ein Int Array(values) das du speichern willst, also musst du aus deinem int ein high/low-byte machen und die dann einzeln Speichern also zwei Bytes für ein Int.   
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mh gibt es keine einfachere variante, die variablen zu "speichern"?
es muss nicht eeprom sein.
die variablen müssen auch nicht bei einer stromunterbrechung weiterhin verfügbar sein.
Logged

Offline Offline
Faraday Member
**
Karma: 79
Posts: 2733
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wieso hast du dann überhaupt mit dem EEPROM angefangen? Das braucht man nur um die Daten permanent zu haben oder wenn sie sie groß sind dass sie nicht ins RAM passen.

Für eine handvoll Integer reicht auch das RAM. Einfach global deklarieren und dann kannst du sie in allen Methoden verwenden.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

also mit einer globalen variable funktioniert es. dabei war folgendes tutorial hilfreich
https://gist.github.com/94327/2f51486f19d5eeb96dfc701c7f46821cdeac4e22

Code:
int currentValue = 0;
int values[] = {0,0,0,0,0,0,0};
int szh;
int szm;
int szs;
int bzm;
int bzs;
int izm;
int izs;
long szene;
long belichtung;
long interval;
int ledPin = 13;
int Motor = 8;

void readSerialString () {
    if(Serial.available()){
    int incomingValue = Serial.read();
   
    values[currentValue] = incomingValue;
 
    currentValue++;
    if(currentValue > 6){
      currentValue = 0;
    }
    szh = values[0];
    szm = values[1];
    szs = values[2];
    bzm = values[3];
    bzs = values[4];
    izm = values[5];
    izs = values[6];
   } 
}

void setup()  {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(Motor, OUTPUT);
}
 
 
void loop() {
readSerialString(); 
     // szenedauer werden in sekunden umgerechnet
  // wird später noch in der berechnung berücksichtigt
  szene = (szh * 3600000) + (szm * 60000) + (szs * 1000);
 
  // belichtungszeit wird in sekunden umgerechnet
  belichtung = (bzm * 60000) + (bzs * 1000);
 
  //interval wird in sekunden umgerechnet
  interval = (izm * 60000) + (izs * 1000);
 
 
    digitalWrite(ledPin, HIGH);
    delay(5000); //muss auf 10 sesenkt werden
    digitalWrite(ledPin, LOW);
    delay(belichtung);
    digitalWrite(Motor, HIGH);
    delay(100); //muss noch dynamisch werden, kommt drauf an, wie schnell sich der slider bewegt.
    digitalWrite(ledPin, LOW);
    delay(interval);


}
Logged

Pages: [1]   Go Up
Jump to: