Sari la conținut
ELFORUM - Forumul electronistilor

Senzor de parcare cu ESP8266 si JSN-SR304T


Postări Recomandate

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!

WhatsApp Image 2024-04-23 at 10.42.08_bbb8b47d.jpg

// 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
  • Răspunsuri 25
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

#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

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
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 de cloudy
Link spre comentariu

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
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

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 de Untold
Link spre comentariu

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 de cloudy
Link spre comentariu
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

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 de Bandi Szasz
Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări