Arduino seriql reset

Erraynn

Üye
Katılım
5 Şub 2021
Mesajlar
19
Puanları
1
Yaş
34
Mrb arkadaşlar sistemim üç adet arduino nanodan oluşuyor. Bir Arduino master diğer iki Arduino da slave. Slave Arduino dan sıcaklık verilerini alıp displayde gösteriyorum buraya kadar sıkıntım yok. Ancak ne zamanki slave arduinonun enerjisini kesip tekrar verirsem master Arduino kitleniyor 4-5 dk sonra kendine geliyor ancak seri porttaki verileri alamıyorum. Birde master arduinonun rx pinine bağlı kabloyu söküp tekrar bağlıyorum bu şekilde de bazen (10-15 denemede ) yine aynı şekilde master reset atıyor ve rx pinindeki veriyi alamiyor. Kart üzerindeki reset tuşuna basınca düzeliyor. Programları ISP ile yüklüyorum yani botloeder kullanmıyorum. Sorunu nasıl çözebilirim yardımınıza ihtiyacım var
 
Bunu sebebi UART data transferinin veri alırken 0 ve boştayken 1 olması. Sen slave olanı kapattığında master arduino hattan veri okumaya çalışıyor ve okuyamadığı için belirli bi timeout komutu işlemediğin için timeout süresi dolunca başa dönüyor. Loop döngüsünün içine Serial.read() komutu çalıştırıyorsan sürekli veri okumaya çalışcaktır. Bunu çözmenin en iyi yolu timeout kullanmaktır. Bu sayede birkaç kez denedikten sonra tekrar denemeyecektir. Aşağıdaki örnek kod bunu nasıl yapacağın hakkında bi bilgi verir. Eğer cevap alamazsa 5 kere deneyip duracaktır ve bir dakika sonra tekrar deneyecektir.

Yine de kilitleniyorsa master arduinonun Rx piniyle Vcc pini arasına 10K bir direnç bağla.

Kod:
bool slaveAktif = true;
bool oku(int *);
int sure = 0;

void setup(){
  Serial.begin(115200);
}

void loop(){
  if(slaveAktif || sure%60 == 0){
    int sicaklik = 0;
    Serial.println("Sıcaklık okunuyor");
    slaveAktif = oku(&sicaklik);
    Serial.print("Okunan sıcaklık: ");
    Serial.println(sicaklik);
  }
  else{
    Serial.println("Slave bağlı değil");
    sure++;
  }
  delay(1000);
}

bool oku(int *data){
  Serial.setTimeout(1000);
  int read_attempts = 4;
  String temp="";
  while(read_attempts>0){
    read_attempts--;
    temp = Serial.readStringUntil('\n'); //Satır olarak okur 
    if(temp == ""){
      Serial.print("Tekrar deneniyor....(");
      Serial.print(read_attempts);
      Serial.println(")");
    }
  }
  if(temp != ""){
    *data = temp.toInt();
    sure = 0;
    return true;
  }
  else{
    return false;
  }
  
}
 
Son düzenleme:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…