Arduino Polska Forum
Pętla w pętli EEPROM - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Pętla w pętli EEPROM (/watek-p%C4%99tla-w-p%C4%99tli-eeprom)

Strony: 1 2


RE: Pętla w pętli EEPROM - kaczakat - 18-03-2023

Pokaż kod programu, z którym pracujesz. Jest oczywiste, że to tak będzie działać, ale robisz jakiś błąd.
To co pokazałeś w poście #7 to jakieś bzdury i to nie ma prawa zadziałać, gdzie byś tego nie umieścił.
Przykładowy kod w symulatorze:
https://wokwi.com/projects/359485317908749313


RE: Pętla w pętli EEPROM - xaitras - 18-03-2023

Ok bo już tracę cierpliwość do eepromu  Huh

Bardzo doceniam to, że chcecie mi pomóc ale ja najwyraźniej dalej czegoś nie kapuję.

Tak zapisuję pierwszy kod:

Kod:
void save_rfid(){
  for (int i=0; i<8; i++){
    
     char r = StrUID.charAt(i);
     EEPROM.write (i, r);
  }
  EEPROM.commit();
  delay(500);
}

Rozumiem że drugi muszę zapisać na pozycji od 9 do 17 ?? 
StrUID to już przetworzony String.


Tak odczytuję eeprom:


Kod:
void read_rfid()
{

  for (int j=0;j<32;j++)
   {
     for (int i=0; i<8; i++)
     {
     odczyt[(j*8)+ i] = EEPROM.read((j*8)+ i);      
     }   
   }
}

A tutaj się to pojawia:


Kod:
if (header.indexOf("zmien_1") >= 0) {

client.println("<meta charset='utf-8'><div class='target'><form action=\"/get\"><input type='text' style='width: 100%; padding: 12px 20px; margin: 8px 0; display: inline-block; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box;' maxlength='4' name='save_pin_1' value='"+StrUID+"' autofocus />");
client.println("<input style='font-size:19px; width: 100%; height:50px; background-color: #4CAF50; color: white; padding: 14px 20px; margin: 8px 0; border: none; border-radius: 4px; cursor: pointer;' type='submit' value='Zapisz brelok / kartę'/></form>");

client.println("<form action=\"/get\"><input type='hidden' style='width: 100%; padding: 12px 20px; margin: 8px 0; display: inline-block; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box;' maxlength='4' name='usun_1' value='"+StrUID+"' />");
client.println("<input style='font-size:19px; width: 100%; height:50px; background-color: red; color: white; padding: 14px 20px; margin: 8px 0; border: none; border-radius: 4px; cursor: pointer;' type='submit' value='Usuń brelok / kartę'/></form></div>");

client.println("<div class='target'><p>Nr breloka / karty<br><b>");
read_rfid();
client.println(odczyt);
client.println();
client.println("</b></div>");
}

Problem przy odczycie jest taki, że przy wartości j<32 restartuje się esp. Jak zmienię na 1 odczytuje pierwszy rekord czyli od 0 do 8. Jak zmienię na j<2 to odczytuje krzaki i końcówkę kodu rfid. Powyżej tych wartości -> restart.
Ręce mi opadają. Czy ktoś może mi o wytłumaczyć co robię źle?

W emulatorze wygląda tak: https://wokwi.com/projects/359564767744621569


RE: Pętla w pętli EEPROM - kaczakat - 19-03-2023

Przede wszystkim nie rób testów na EEPROM w loop, ręka Ci się omsknie i procek do kosza. Wiem, że przesadzam, ale Eeprom można zapisywać ograniczoną ilość razy. Oczywiście symulatora to nie dotyczy.
Zapisujesz 8 bajtów, a odczytujesz 256, to bez sensu.
i oraz j były do tego by ustalić adres EEPROM od 0 do 255, gdy odczytujesz cały EEPROM, a ty sobie tak samo wstawiasz j do indexu swojego stringa, który ma wartość tylko od 0 do 8. Masz odczytać 8 bajtów, wstawić do 8 bajtów w swoim stringu, wydrukować, potem powtórzyć.
A ty jedziesz sobie po komórkach pamięci 248 bajtów za swoją tablicę, za każdym z 32 dwóch razy.
Mieszasz poza tym stringi i c stringi, przecież ten 12345678 też może być  c stringiem, czyli tablicą char.
Kod:
#include <EEPROM.h>
char StrUID[9]="12345678";
char odczyt[9]="";

void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
delay(100);
}

void loop() {
save_rfid();
read_rfid();
delay(10000);
}


void save_rfid(){
  for (int i=0; i<8; i++){
     
     //char r = StrUID.charAt(i);
     EEPROM.write (i, StrUID[i]);
  }
  //EEPROM.commit();
  delay(500);
}


void read_rfid()
{


  for (int j=0;j<32;j++)
   {
     for (int i=0; i<8; i++)
     {
     odczyt[i] = EEPROM.read((j*8)+ i);       
     }
     Serial.println(odczyt);   

   }
   Serial.println("koniec");   
}

Wynik:
Kod:
12345678
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿ
koniec



RE: Pętla w pętli EEPROM - xaitras - 20-03-2023

Dzięki wam wszystkim za pomoc. Trochę mi się rozjaśniło Smile Wychodzi na to, że to co dostaję w StrUID jest wszystkiemu winne. Muszę zmodyfikować program i będzie ok. Tylko czasu brak...