Arduino Polska Forum

Pełna wersja: Programator eeprom i2c
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam. Posiadam program do Arduino Uno, który służy do zapisywania zawartości 4 eepromów i2c o adresach 80, 81, 82, 83. Przed zapisem muszę sprawdzić innym programem do skanowania adresów i2c jaki adres ma dany eeprom i zmodyfikować program wpisując odczytany adres w skanerze w pozycję: #define EEPROM_I2C_ADDRESS 83, gdzie 83 to np. adres jednego z chipów. Proszę o podpowiedź, w jaki sposób zmodyfikować program, aby na początku odczytał adres, wybrał odpowiedni wsad dla danego adresu i zapisał w eepromie. Załączam kod programu do zapisu:
Kod:
#define EEPROM_I2C_ADDRESS 83
#include <Wire.h>

// blank data for K, C, M & Y chip. 128 array of data.
byte KChipData[]={168,0,1,3,18,1,1,255,100,0,52,48,55,53,52,51,20,9,65,66,22,0,22,38,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte CChipData[]={168,0,1,3,14,2,1,255,100,0,49,49,49,53,52,54,20,2,65,66,23,0,7,1,255,255,255,255,255,255,255,255,88,48,56,54,80,52,48,49,50,48,56,0,68,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,1,85,0,18,0,40,0,5,184,230,50,0,128,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte MChipData[]={168,0,1,3,14,3,1,255,100,0,49,49,49,53,52,54,20,2,65,66,24,0,7,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte YChipData[]={168,0,1,3,14,4,1,255,100,0,49,49,49,53,52,55,20,2,65,66,25,0,3,7,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};


void setup() {
//   Select correct data for chip then copy to WriteData array

  byte WriteData[128];
  switch (EEPROM_I2C_ADDRESS){
    case 83:
      memcpy(WriteData,KChipData,128*sizeof(byte));
      break;
    case 82:
      memcpy(WriteData,CChipData,128*sizeof(byte));
      break;
    case 81:
      memcpy(WriteData,MChipData,128*sizeof(byte));
      break;
    case 80:
      memcpy(WriteData,YChipData,128*sizeof(byte));
      break;
    default: //default K chip data, no reason.
      memcpy(WriteData,KChipData,128*sizeof(byte));
      break;
  }
 
  // Start Wire and Serial bus
  Wire.begin();
  Serial.begin(9600);
  delay(100);

  Serial.println("Start");
  Serial.println(" ");
 

  // Start Write Chip with blank data
  Serial.println("Write 128 bytes:");
  byte wordaddress;

  for(byte i=0;i<128;i++){
        wordaddress = i;
        i2cwrite((byte)wordaddress,(byte)WriteData[i]);
        Serial.println(i);
      
       // Serial.print(":");
        //Serial.print(WriteData[i]);
       // Serial.print(" ");
  }

//  Start Read chip
  Serial.println(" ");
  Serial.println("Read 128 bytes:");
  for(byte i=0;i<128;i++){
      byte readVale = i2cread(i);
      Serial.print(i);
      Serial.print(":");
      Serial.print(readVale);
      Serial.print(" ");
   Serial.print(" - ");
 
   if (readVale != WriteData[i]) {Serial.println("NOK"); while(1);}
   else if (readVale == WriteData[i]) {Serial.println("OK");}
  }
  Serial.println(" "); 
  Serial.println("End");

}

void loop() {

}

void i2cwrite(byte address, byte data) {
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
  Wire.write((byte)data);
  Wire.endTransmission();
  delay(20);
}

byte i2cread(byte address) {
  byte rData = 0;
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
Wire.endTransmission();

  Wire.requestFrom(EEPROM_I2C_ADDRESS,1);
  while (Wire.available()){
    rData = Wire.read();
    return rData;
  }
}
void WhatI2CAddress() {
    for(int i=0;i<128;i++){
      Wire.requestFrom(i,1);  //request first data byte
      Serial.print(i);
      Serial.print(":");
      while(Wire.available()){
        byte c = Wire.read();
        Serial.print(c);      //if data exist, print it out. That way you can identify which address.
      }
      Serial.println(" ");
      delay(5);
  }
}
I kod skanera:
Kod:
#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Skaner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Skanuję...");

  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C urządzenie znaleziono pod adresem ");
      if (address<16)
        Serial.print("0");
      Serial.print(address,DEC);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Błąd odczytu adresu I2C ");
      if (address<16)
        Serial.print("0");
      Serial.println(address,DEC);
    }   
  }
  if (nDevices == 0)
    Serial.println("I2C brak urządzenia\n");
  else
    Serial.println("gotowe\n");

  delay(5000);           // wait 5 seconds for next scan
}
Pozdrawiam.
To będzie mało uniwersalne, bo niektóre eepromy czy pamięci FRAM mają wiele adresów, np. cała jest podzielona na 4 części i zapisując okolice środka pisze się na adres drugi i trzeci, a koniec na czwarty.
Zamień define na zmienną, np. int.
int EEPROM_I2C_ADDRESS=83 i teraz możesz go zmieniać w trakcie działania programu. 
Adres będzie wielkości bajt, więc może być i byte czy uint8_t.
Całe skanowanie wrzuć w setup i tam gdzie program komunikuje znalezienie pamięci wydrukiem na serial wystarczy dodać EEPROM_I2C_ADDRESS=adress. Jeśli ma być tylko pierwszy znaleziony to można dodać if, że jeśli adres do tej pory był równy 0 to przypisz mu aktualny znaleziony.
Loop pozostanie z grubsza bez zmian.
Polecam kurs Arduino, problem raczej jest prosty, więc zaraz zrodzi kolejne proste pytania.
Zmodyfikowałem program. Teraz skanuje i odczytuje adres eeproma przed zapisem, ale wartość zmiennej address nie jest przypisywana do zmiennej EEPROM_I2C_ADDRESS. Ta ma cały czas wartość jaką wpisałem definiując zmienną. Przejrzałem dostępne kursy, ale traktują zmienne bardzo ogólnikowo nie wywnioskowałem niczego co mógłbym odnieść do tego przypadku. Jeśli nie nadwyrężam uprzejmości to prosiłbym o podpowiedź co zrobiłem nie tak. Z góry dziękuję.
Kod:
int EEPROM_I2C_ADDRESS=83;
byte error, address;
int nDevices;
#include <Wire.h>

// blank data for K, C, M & Y chip. 128 array of data.
byte KChipData[]={168,0,1,3,18,1,1,255,100,0,52,48,55,53,52,51,20,9,65,66,22,0,22,38,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte CChipData[]={168,0,1,3,14,2,1,255,100,0,49,49,49,53,52,54,20,2,65,66,23,0,7,1,255,255,255,255,255,255,255,255,88,48,56,54,80,52,48,49,50,48,56,0,68,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,1,85,0,18,0,40,0,5,184,230,50,0,128,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte MChipData[]={168,0,1,3,14,3,1,255,100,0,49,49,49,53,52,54,20,2,65,66,24,0,7,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte YChipData[]={168,0,1,3,14,4,1,255,100,0,49,49,49,53,52,55,20,2,65,66,25,0,3,7,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};


void setup() {
//   Select correct data for chip then copy to WriteData array

  byte WriteData[128];
  switch (EEPROM_I2C_ADDRESS){
    case 83:
      memcpy(WriteData,KChipData,128*sizeof(byte));
      break;
    case 82:
      memcpy(WriteData,CChipData,128*sizeof(byte));
      break;
    case 81:
      memcpy(WriteData,MChipData,128*sizeof(byte));
      break;
    case 80:
      memcpy(WriteData,YChipData,128*sizeof(byte));
      break;
    default: //default K chip data, no reason.
      memcpy(WriteData,KChipData,128*sizeof(byte));
      break;
  }
 
  // Start Wire and Serial bus
  Wire.begin();
  Serial.begin(9600);
  delay(100);

  Serial.println("Start");
  Serial.println(" ");
  //skaner
 

  Serial.println("Skanuję...");


  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C urządzenie znaleziono pod adresem ");
      if (address<16)
       
      // if (address=0)
     
       // Serial.print("0");
      EEPROM_I2C_ADDRESS = address,DEC;
      Serial.print(address,DEC);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Błąd odczytu adresu I2C ");
      if (address<16)
        Serial.print("0");
      Serial.println(address,DEC);
    }   
  }
  if (nDevices == 0)
    Serial.println("I2C brak urządzenia\n");
  else
    Serial.println("gotowe\n");

  delay(5000);           // wait 5 seconds for next scan

  // Start Write Chip with blank data
  Serial.println("Write 128 bytes:");
  byte wordaddress;

  for(byte i=0;i<128;i++){
        wordaddress = i;
        i2cwrite((byte)wordaddress,(byte)WriteData[i]);
        Serial.print(wordaddress);
        Serial.print(":");
        Serial.print(WriteData[i]);
        Serial.print(" ");
  }

//  Start Read chip
  Serial.println(" ");
  Serial.println("Read 128 bytes:");
  for(byte i=0;i<128;i++){
      byte readVale = i2cread(i);
      Serial.print(i);
      Serial.print(":");
      Serial.print(readVale);
      Serial.print(" ");
   Serial.print(" - ");
   Serial.print(" ");
 
   if (readVale != WriteData[i]) {Serial.println("NOK"); while(1);}
   else if (readVale == WriteData[i]) {Serial.println("OK");}
  }
  Serial.println(" "); 
  Serial.println("End");

}

void loop() {

}

void i2cwrite(byte address, byte data) {
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
  Wire.write((byte)data);
  Wire.endTransmission();
  delay(20);
}

byte i2cread(byte address) {
  byte rData = 0;
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
Wire.endTransmission();

  Wire.requestFrom(EEPROM_I2C_ADDRESS,1);
  while (Wire.available()){
    rData = Wire.read();
    return rData;
  }
}
void WhatI2CAddress() {
    for(int i=0;i<128;i++){
      Wire.requestFrom(i,1);  //request first data byte
      Serial.print(i);
      Serial.print(":");
      while(Wire.available()){
        byte c = Wire.read();
        Serial.print(c);      //if data exist, print it out. That way you can identify which address.
      }
      Serial.println(" ");
      delay(5);
  }
}
Jak faktycznie chcesz skorzystać z wyniku wyszukiwania to najpierw wyszukaj, a potem z tego korzystaj. No i usuń przypisanie adresu 83, wstaw tam 0 lub tylko int EEPROM_I2C_ADDRESS; (nie przypisanie wartości w zmiennej globalnej i tak wstawi tam 0). Wtedy będziesz mógł skorzystać z if adres 0. W funkcji switch też możesz zareagować jak nic nie znajdzie na magistrali, czyli tu też możesz dodać przypadek 0 lub zmodyfikować ten default:, po co masz przypadek, że jeśli jest jakikolwiek inny adres niż wymienione to i tak kopiujesz jakieś dane.
Niestety piszę porady niewłaściwie, z punktu widzenia osoby, która przeczytała parę książek i zrobiła te kursy, dla mnie literówka lub niedopowiedzenie oznacza zupełnie niewłaściwe działanie dla Ciebie. Zrób kurs na Forbot, bo inaczej to będzie takie tureckie kazanie.
Dzięki, już polubiłem twoje podpowiedzi. Fajne jest to że nie podajesz rozwiązań na tacy tylko zmuszasz do myślenia. Odezwę się jak będę mądrzejszy. Pozdrawiam.
No niestety w programie widać, że poruszasz się po omacku, najpierw korzystasz z adresu, a dopiero potem go szukasz. Setup działa tylko raz realizując wypisane linijki jedna po drugiej, dopier w loop zaczyna je powtarzać realizując je bez końca od klamerki do klamerki. Co do zasady, bo oczywiście w setup można wstawić nieskończoną pętlę tak samo jak i loop tym samym sposobem zatrzymać czy nawet przerwać innym.
Witam ponownie. Dzięki Twoim podpowiedziom i rewelacyjnemu kursowi arduino z forbota zatrybiłem w końcu i udało mi się zmodyfikować kod. Działa rewelacyjnie. Rozpoznaje adresy i wybiera odpowiednie wsady, jeśli nie znajdzie adresu to stoi i nie ładuje bezsensownie zawartości. Zatrzymanie ładowania przypadkowej zawartości zrealizowałem wpisując warunek:
Kod:
if (EEPROM_I2C_ADDRESS == 0)
      while(1);
Wyczytałem że nieskończona pętla while(1) służy do zatrzymania programu w przypadku awarii. Przykładowo jeśli korzystamy z jakiegoś czujnika. zauważyłem że podobnie działa jeśli wpiszę return. Czy ten sposób jest poprawny i czy ewentualnie jest jakaś inna metoda na zatrzymanie wykonywania programu w przypadku spełnienia warunku.
Kod:
int EEPROM_I2C_ADDRESS = 0;
#include <Wire.h>

// blank data for K, C, M & Y chip. 128 array of data.
byte KChipData[]={168,0,1,3,18,1,1,255,100,0,52,48,55,53,52,51,20,9,65,66,22,0,22,38,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte CChipData[]={168,0,1,3,14,2,1,255,100,0,49,49,49,53,52,54,20,2,65,66,23,0,7,1,255,255,255,255,255,255,255,255,88,48,56,54,80,52,48,49,50,48,56,0,68,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,1,85,0,18,0,40,0,5,184,230,50,0,128,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte MChipData[]={168,0,1,3,14,3,1,255,100,0,49,49,49,53,52,54,20,2,65,66,24,0,7,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte YChipData[]={168,0,1,3,14,4,1,255,100,0,49,49,49,53,52,55,20,2,65,66,25,0,3,7,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};

void setup() {
  // Start Wire and Serial bus
byte error, address;
  int nDevices;
  byte WriteData[128];
  Wire.begin();
  Serial.begin(9600);
  delay(100);
 
  Serial.println("Start");
  Serial.println(" ");
  //skaner
  Serial.println("Skanuję...");
 

  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
   
    if (error == 0)
    {
     
      Serial.print("I2C urządzenie znaleziono pod adresem ");
      EEPROM_I2C_ADDRESS = address,DEC;
      if (address<16)
      Serial.print("0");
      Serial.print(address,DEC);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Błąd odczytu adresu I2C ");
      if (address<16)
       // Serial.print("0");
      Serial.println(address,DEC);
    }   
  }
  if (nDevices == 0)
    Serial.println("I2C brak urządzenia\n");
  else
    Serial.println("gotowe\n");

  delay(5000);           // wait 5 seconds for next scan
//   Select correct data for chip then copy to WriteData array

 
  switch (EEPROM_I2C_ADDRESS){
    case 83:
      memcpy(WriteData,KChipData,128*sizeof(byte));
      break;
    case 82:
      memcpy(WriteData,CChipData,128*sizeof(byte));
      break;
    case 81:
      memcpy(WriteData,MChipData,128*sizeof(byte));
      break;
    case 80:
      memcpy(WriteData,YChipData,128*sizeof(byte));
      break;
    default: //default K chip data, no reason.
     // memcpy(WriteData,KChipData,128*sizeof(byte));
    if (EEPROM_I2C_ADDRESS == 0)
      while(1);
      //return;
      //break;
  }
 
  // Start Write Chip with blank data
  Serial.println("Write 128 bytes:");
  byte wordaddress;

  for(byte i=0;i<128;i++){
        wordaddress = i;
        i2cwrite((byte)wordaddress,(byte)WriteData[i]);
        //Serial.println(i);
       Serial.print(wordaddress);
        Serial.print(":");
        Serial.print(WriteData[i]);
        Serial.print(" ");
  }

//  Start Read chip
  Serial.println(" ");
  Serial.println("Read 128 bytes:");
  for(byte i=0;i<128;i++){
      byte readVale = i2cread(i);
      Serial.print(i);
      Serial.print(":");
      Serial.print(readVale);
      Serial.print(" ");
   Serial.print(" - ");
 
   if (readVale != WriteData[i]) {Serial.println("NOK"); while(1);}
   else if (readVale == WriteData[i]) {Serial.println("OK");}
  }
  Serial.println(" "); 
  Serial.println("End");

}

void loop() {

}

void i2cwrite(byte address, byte data) {
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
  Wire.write((byte)data);
  Wire.endTransmission();
  delay(20);
}

byte i2cread(byte address) {
  byte rData = 0;
  Wire.beginTransmission(EEPROM_I2C_ADDRESS);
  Wire.write((byte)address);
Wire.endTransmission();

  Wire.requestFrom(EEPROM_I2C_ADDRESS,1);
  while (Wire.available()){
    rData = Wire.read();
    return rData;
  }
}
void WhatI2CAddress() {
    for(int i=0;i<128;i++){
      Wire.requestFrom(i,1);  //request first data byte
      Serial.print(i);
      Serial.print(":");
      while(Wire.available()){
        byte c = Wire.read();
        Serial.print(c);      //if data exist, print it out. That way you can identify which address.
      }
      Serial.println(" ");
      delay(5);
  }
}

Dzięki i pozdrawiam.
(14-07-2019, 23:14)lejk napisał(a): [ -> ]Wyczytałem że nieskończona pętla while(1) służy do zatrzymania programu w przypadku awarii. Przykładowo jeśli korzystamy z jakiegoś czujnika. zauważyłem że podobnie działa jeśli wpiszę return. Czy ten sposób jest poprawny i czy ewentualnie jest jakaś inna metoda na zatrzymanie wykonywania programu w przypadku spełnienia warunku.
while(true)  - 1 jest zapisem niepoprawnym - zawiesza Ci aplikację.
Stosuj break do zamknięcia pętli albo return do zakończenia metody.
Jeśli zamierzonym działaniem jest pozostać w tej pętli nic nie robiąc dalej to nic nie zawiesza. Szczególnym przypadkiem jest jednak ESP8266, który tak to potraktuje, bo automatycznie ma włączonego WDT i tu trzeba zapisać co najmniej:
while(1) delay(0);. W ESP8266 WDT jest resetowany na końcu loop i wewnątrz funkcji delay.