Skip to content

Shranjevanje v EEPROM

nihce edited this page May 28, 2018 · 3 revisions

Opis

Spodaj napisana koda je namenjena shranjevanju kalibracijskih vrednosti senzorjev za razdaljo. Na prvih 6 naslovov (naslov 0 do 5) v pomnilniku se shranijo najmanjše prebrane vrednosti na posameznem senzorju. Na naslednjih 6 mest (6 do 11) pa se shranijo največje prebrane vrednosti senzorjev.

Koda

#include <EEPROM.h> //pomembno je, da vključimo knjižnico za manipulacijo pomnilnika EEPROM
#include <Robot.h>

void setup() {
  while (!Serial); //nič se ne zgodi, dokler serijski monitor ni odprt

  int addr = 0; //začetni naslov
  int low[6], high[6]; //inicializacija seznama min in max vrednosti
  int error = 0; //za preverjanje delovanja senzorjev razdalje
  delay(1000);
  Serial.println("Odstrani vse ovire pred senzorji!");
  delay(1000);
  //prve prebrane vrednosti zapišeš v low in high
  robot.distance.readRaw(); //naredi meritev
  for (int i = 0; i < 6; i++){
    low[i] = (int)round(robot.distance.sensorsRaw[i]); //shrani meritev
    high[i] = low[i]; //ker je to prva prebrana vrednost je hkrati min in max
    error = error + low[i]; //meritve se seštevajo
  }
  if (error == 0){ //če je vsota vseh meritev enaka 0.0 opozori uporabnika in konča test
    Serial.println("Napaka! Meritve vseh senzorjev so enake 0.0");
    return; //konča program
  }
  delay(5);
  Serial.println("Ko so ovire odstranjene, pritisni funkcijski gumb na robotu za nadaljevanje.");
  Serial.println();
  delay(500);
  //sedaj preverja če so se vrednosti spremenile in jih prepiše če zadostijo pogoju
  //to dela dokler uporabnik ne pritisne gumba na robotu
  while (!robot.buttonPressed()){
    robot.distance.readRaw();
    for (int i = 0; i < 6; i++){
      int sensorReading = (int)round(robot.distance.sensorsRaw[i]);
      if (sensorReading < low[i]){ //preveri ali je nova vrednost manjša od do sedaj najmanjše
        low[i] = sensorReading; //zamenja staro vrednost z novo
      }
      else if (sensorReading > high[i]){ //preveri ali je nova vrednost večja od do sedaj največje
        high[i] = sensorReading; //zamenja staro vrednost z novo
      }
    }
  }
  delay(500);

  //sedaj iščemo še največje vrednosti (ko so senzorji prekriti dobimo večje vrednosti)
  Serial.println("Kalibracija traja 10s. Začne in konča se s piskom.");
  Serial.println("Vsakemu senzorju moraš približati steno labirinta kolikor je mogoče!");
  delay(3000);
  Serial.println();
  Serial.println("START kalibracije");
  robot.beep(200,500); //pisk za začetek kalibracije
  uint32_t tStart = millis(); //časovnik
  do{
    robot.distance.readRaw();
    for (int i = 0; i < 6; i++){
      int sensorReading = (int)round(robot.distance.sensorsRaw[i]);
      if (sensorReading < low[i]){
        low[i] = sensorReading;
      }
      else if (sensorReading > high[i]){
        high[i] = sensorReading;
      }
    }
  } while (millis() < tStart + duration1000ms * 10); //10 s traja kalibracija
  robot.beep(200,500); //pisk za konec kalibracije
  Serial.println("KONEC kalibracije");
  Serial.println();
  delay(1000);

  //izpis rezultatov na serijski monitor
  Serial.println("REZULTATI");
  //izpis minimalnih prebranih vrednosti = low[i]
  Serial.println("MIN: ");
  for (int i = 0; i < 6; i++){
    Serial.print("senzor ");
    Serial.print(i);
    Serial.print(": ");
    Serial.println(low[i]);
    EEPROM.put(addr, low[i]); //na mesto addr zapiše trenutno vrednost
    addr += sizeof(int); //kazalec za mesto shranjevanja premaknemo naprej za velikost podatka
    delay(5);
  }
  Serial.println();
  delay(5);
  //izpis maksimalnih prebranih vrednosti = high[i]
  Serial.println("MAX: ");
  for (int i = 0; i < 6; i++){
    Serial.print("senzor ");
    Serial.print(i);
    Serial.print(": ");
    Serial.println(high[i]);
    EEPROM.put(addr, high[i]); //na mesto addr zapise trenutno vrednost
    addr += sizeof(int); //kazalec za mesto shranjevanja premaknemo naprej za velikost podatka
    delay(5);
  }
  Serial.println();
  delay(5);
}

void loop() {

}

Glej tudi

EEPROMput

Opombe

EEPROM pomnilnik robota se ob izklopu napajanja ne izbriše.

Clone this wiki locally