Wpis z mikrobloga

#elektronika #arduino #programowanie #esp32

Jak zrobić odczyt odległości co zadany czas i wysyłać go na Serial? 100 ms to zdecydowanie zbyt często.
Chciałbym co np. minutę.
Mam czujnik ultradźwiękowy A02YYUW
https://wiki.dfrobot.com/_A02YYUW_Waterproof_Ultrasonic_Sensor_SKU_SEN0311
Ktoś jest w stanie pomóc?

Kod:

_#include _

_SoftwareSerial mySerial(11,10); // RX, TX_
_unsigned char data[4]={};_
_float distance;_

_void setup()_
_{
Serial.begin(57600);
mySerial.begin(9600);
}_

_void loop()_
_{
do{
for(int i=0;i<4;i++)
{
data[i]=mySerial.read();
}
}while(mySerial.read()==0xff);

mySerial.flush();

if(data[0]==0xff)
{
int sum;
sum=(data[0]+data[1]+data[2])&0x00FF;
if(sum==data[3])
{
distance=(data[1]<<8)+data[2];
if(distance>30)
{
Serial.print("distance=");
Serial.print(distance/10);
Serial.println("cm");
}else
{
Serial.println("Below the lower limit");
}
}else Serial.println("ERROR");
}
delay(100);_
_}_
PieknyWojciech - #elektronika #arduino #programowanie #esp32 

Jak zrobić odczyt od...

źródło: comment_1635281977QdcYKWnZCqs3KdEbuAL4GX.jpg

Pobierz
  • 14
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Dioddy: czujnik z tego co rozumiem cyklicznie wysyła dane na Serial2 co 100 ms. Kod jest niemal 1:1 z tym co podałem wyżej - akurat używam ESP stąd nie ma tylko softwarowego Serial do odbierania danych.
Odbieram dane, przetwarzam je, wysyłam na Seria - całość co 100 ms. Chciałbym jakoś zmniejszyć tą częstotliwość.
  • Odpowiedz
@PieknyWojciech: Ogólnie użycie "delay()" jest niezalecane i dobrze by było przerobić to na millis(), ale to już troche trzeba będzie zmodyfikowac obecny kod dodając porówniania czasu i odpowiednie warunki kiedy ma wysłać dane na serial
.
  • Odpowiedz
@PieknyWojciech: zmiana wartości w delay powinna działać, możesz równiez sprobować wykonać te oczekiwanie w petli ileś razy co powinno zadzialac tak samo jak bezposrednia zmiana czasu. Przykładowa petla:
for (int i=0;i<600;i++)
{ delay(100);
}
  • Odpowiedz
@inspektor_gadzet: Ale to jest esp32 (wnioskuje po tagach), tam delay() jest zaimplementowany tak, że po prostu task w rtosie czeka, a nie cały program (scheduler cały czas coś robi), więc watchdog nie zresetuje programu
  • Odpowiedz