Repository navigation
Shranjevanje v EEPROM
nihce edited this page May 28, 2018
·
3 revisions
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.
#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() {
}EEPROM pomnilnik robota se ob izklopu napajanja ne izbriše.