Untold Postat Aprilie 23, 2024 Partajează Postat Aprilie 23, 2024 Va salut cu respect. Am un amic nevazator caruia vreau sa-i fac un soi de senzor de parcare. Ii trebuie sa ii indice obstacolele din fata lui si sa sune exact ca un senzor de parcare, cand se apropie la 2 metri de obstacol (asta e valoarea data de el). Eu am gasit un cod de "water level metter', l-am scris in esp8266 si functioneaza. Insa cand se atinge acea distanta care poate fi ajustata dupa necesitati, din cod, senzorul activ piuie, insa sunetul este incontinuu, gpio-ul pt buzzer are high sau low. Eu as vrea sa fie cam asa: la 2 metri- un bip la 0.5 secunde, la 1 metru- 1 bip la 0.2 secunde, iar la 40-50 cm- un bip la 0.1 secunde si sub aceasta distanta, sunet continuu. Senzorul ultrasonic JSN-SR04T din fabrica este facut ca sa "vada" de la 25 cm in sus, sub 25 cm este orb. In serial monitor imi citeste distanta, afiseaza corect, vreau doar sa piuie ca un senzor de parcare, cum v-am descris. Senzorul il voi monta intr-o cutiuta cat de mica posibil, va avea baterii si il va purta cu el, agatat undeva in zona pieptului. Atasez mai jos codul. Ma poate ajuta cineva cu o sugestie? O sa postez aici atat filmulet cu functionarea cat si poze. Multumesc frumos! // Pin definitions const int trigPin = D1; const int echoPin = D2; const int buzzerPin = D3; // Threshold level for water const float waterThreshold = 200.0; // Adjust this value based on your setup void setup() { Serial.begin(115200); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(buzzerPin, OUTPUT); } void loop() { // Measure distance with ultrasonic sensor digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); float duration = pulseIn(echoPin, HIGH); float distance = (duration / 2) * 0.0343; // Print water level to serial monitor Serial.print("Water level: "); Serial.print(distance); Serial.println(" cm"); // Check if water level is below threshold if (distance < waterThreshold) { // Activate buzzer alarm digitalWrite(buzzerPin, HIGH); } else { // Deactivate buzzer alarm digitalWrite(buzzerPin, LOW); } // Adjust delay based on your application needs delay(1000); } // Pin definitions const int trigPin = D1; const int echoPin = D2; const int buzzerPin = D3; // Threshold level for water const float waterThreshold = 200.0; // Adjust this value based on your setup void setup() { Serial.begin(115200); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(buzzerPin, OUTPUT); } void loop() { // Measure distance with ultrasonic sensor digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); float duration = pulseIn(echoPin, HIGH); float distance = (duration / 2) * 0.0343; // Print water level to serial monitor Serial.print("Water level: "); Serial.print(distance); Serial.println(" cm"); // Check if water level is below threshold if (distance < waterThreshold) { // Activate buzzer alarm digitalWrite(buzzerPin, HIGH); } else { // Deactivate buzzer alarm digitalWrite(buzzerPin, LOW); } // Adjust delay based on your application needs delay(1000); } Senzor_Distanta_Alex_TG_NT.ino Link spre comentariu
Bandi Szasz Postat Aprilie 23, 2024 Partajează Postat Aprilie 23, 2024 #define LOOP_UPDATE 500 #define BUZZER_BEEP 150 // Pin definitions const int trigPin = D1; const int echoPin = D2; const int buzzerPin = D3; uint32_t lastLoopMillis = 0; // Buzzer params uint32_t buzzerLastMillis = 0; bool buzzerActive = false; int32_t buzzerInterval = -1; void setup() { Serial.begin(115200); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(buzzerPin, OUTPUT); } void buzzer(int32_t interval) { if (interval < 0 || (buzzerActive && millis() - buzzerLastMillis > BUZZER_BEEP)) { buzzerActive = false; digitalWrite(buzzerPin, LOW); return; } if (millis() - buzzerLastMillis > interval) { digitalWrite(buzzerPin, HIGH); buzzerActive = true; buzzerLastMillis = millis(); } } void loop() { if (millis() - lastLoopMillis > LOOP_UPDATE) { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); float duration = pulseIn(echoPin, HIGH); float distance = (duration / 2) * 0.0343; // Print water level to serial monitor Serial.print("Water level: "); Serial.print(distance); Serial.println(" cm"); if (distance < 200) { buzzerInterval = 500; // Buzzer beep 0.5s } else if (distance < 400) { buzzerInterval = 1000; // Buzzer beep 1s } else { buzzerInterval = -1; // Buzzer OFF } lastLoopMillis = millis(); } buzzer(buzzerInterval); } Mai adaugi cate distante vrei cu cate un "else if" si intervalul aferent de beep. Daca "beep" ul in sine intre doua beep-uri ti se pare prea scurt modifici in linia nr. 2 "BUZZER_BEEP" la o valoare mai mare, momentan sunetul de "beep" tine 150ms. Link spre comentariu
Untold Postat Aprilie 23, 2024 Autor Partajează Postat Aprilie 23, 2024 Multumesc frumos, o sa incerc si revin cu rezultatul. Mi-a facut si Gepeto un cod, dar ledul palpaie regulat, (am pus led in loc de buzer ca nu am deocamdata) indiferent de distanta la care e senzorul fata de obstacol. Link spre comentariu
Untold Postat Aprilie 23, 2024 Autor Partajează Postat Aprilie 23, 2024 Am mai modificat eu putin dupa cum ai spus, dar imi da o eroare la compilare: Link spre comentariu
Bandi Szasz Postat Aprilie 23, 2024 Partajează Postat Aprilie 23, 2024 Acum 11 minute, Untold a spus: Am mai modificat eu putin dupa cum ai spus, dar imi da o eroare la compilare: " } else {" de la linia 56 e in plus. Sterge linia 56 si o sa mearga Link spre comentariu
cloudy Postat Aprilie 23, 2024 Partajează Postat Aprilie 23, 2024 (editat) @Untold Comparațiile trebuie să le faci incepand cu distanta cea mai mica, asa cum a fost postat exemplul mai sus. Tu ai inceput cu "if distanta < 200" si urmeaza apoi if <100 .. <50 care nu se vor mai executa. Editat Aprilie 23, 2024 de cloudy Link spre comentariu
Untold Postat Aprilie 23, 2024 Autor Partajează Postat Aprilie 23, 2024 Am pus, merge acum, doar ca ledul palpaie o data la 0.5 secunde, indiferent de distanta < de 2 metri pana la obstacol. Peste 2 metri, ledul sta stins, asta e ok. Insa daca palpaie/suna cu aceeasi frecventa indiferent de distanta, omul nu mai stie daca e la 2 m sau la 30 cm fata de obstacol. Link spre comentariu
cloudy Postat Aprilie 23, 2024 Partajează Postat Aprilie 23, 2024 Poti incerca asa: if(distance<200) buzzerInterval=distance*2.5; else buzzerInterval=-1; Link spre comentariu
Bandi Szasz Postat Aprilie 23, 2024 Partajează Postat Aprilie 23, 2024 Acum 25 minute, Untold a spus: Am pus, merge acum, doar ca ledul palpaie o data la 0.5 secunde, indiferent de distanta < de 2 metri pana la obstacol. Peste 2 metri, ledul sta stins, asta e ok. Insa daca palpaie/suna cu aceeasi frecventa indiferent de distanta, omul nu mai stie daca e la 2 m sau la 30 cm fata de obstacol. Ai pus distantele crescator cum a zis si cloudy ? Link spre comentariu
Untold Postat Aprilie 23, 2024 Autor Partajează Postat Aprilie 23, 2024 Nu inca, acum le pun. Sunt la munca si...stiti cum e... Multumesc, revin cu rezultat. Link spre comentariu
Bandi Szasz Postat Aprilie 23, 2024 Partajează Postat Aprilie 23, 2024 (editat) Odata ce le pui trebuie sa mearga, l-am testat aici: https://wokwi.com/projects/395954644466357249 Editat Aprilie 23, 2024 de Bandi Szasz Link spre comentariu
Untold Postat Aprilie 23, 2024 Autor Partajează Postat Aprilie 23, 2024 (editat) Da, am pus si functioneaza cum ar trebui. O sa-l testez si in aer liber, ca-n birou sunt multe reflexii. Oricum, pana testez cu buzzer si afara, eu va multumesc frumos amandurora si revin cu rezultatul testului afara, ca afara va fi folosit, in casa cunoaste zona. Editat Aprilie 23, 2024 de Untold Link spre comentariu
cloudy Postat Aprilie 23, 2024 Partajează Postat Aprilie 23, 2024 (editat) Poate încerci și varianta cu modificare continuă a frecvenței buzerului in funcție de distanță. Cred că ar fi util pentru amicul tău să deducă ,atunci cănd și el și obiectul (persoana) din fata lui sunt in miscare, dacă obiectul din fată lui vine spre el sau se depărtează, fără să aștepte depășirea de anumite praguri de distanță. Editat Aprilie 23, 2024 de cloudy Link spre comentariu
Untold Postat Aprilie 24, 2024 Autor Partajează Postat Aprilie 24, 2024 Acum 12 ore, cloudy a spus: Poate încerci și varianta cu modificare continuă a frecvenței buzerului in funcție de distanță. Cred că ar fi util pentru amicul tău să deducă ,atunci cănd și el și obiectul (persoana) din fata lui sunt in miscare, dacă obiectul din fată lui vine spre el sau se depărtează, fără să aștepte depășirea de anumite praguri de distanță. Ar fi interesant, dar cum fac asta? Link spre comentariu
Bandi Szasz Postat Aprilie 24, 2024 Partajează Postat Aprilie 24, 2024 (editat) A pus cloudy cateve mesaje mai sus bucatica de cod. In principiu te folosesti de distanta pentru a calcula prin inmultire sau impartire a acestuia pentru a obtine intervalul de beep. Trebuie sa incerci diferite formule pana obtii un rezultat acceptabil pentru intervalul de distanta dorit Uite aici propunerea lui cloudy if(distance<200) buzzerInterval=distance*2.5; else buzzerInterval=-1; Editat Aprilie 24, 2024 de Bandi Szasz Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum