Table of Contents

Ruleta digitala

Introducere

Ruleta digitala masoara distanta pana la un obiect folosind senzori ultrasonici si o afiseaza
pe un LCD. De multe ori am avut nevoie de o masuratoare a unui obiect si cred ca e o metoda
mai interesanta de a o face si mai precisa.

Descriere generala

Proiectul va folosi un Arduino UNO si am ales sa folosesc senzori ultrasonici un buton care sa
faca conversia din inch in centimetri. De asemenea, cu cat se apropie mai mult de
senzori aprind in functie de intervalul de distanta led-ul corespunzator,
iar daca se aprinde becul rosu, setat la distanta cea mai mica, buzzer-ul emite un sunet puternic.


Hardware Design

Componente:


Software Design

Codul proiectului

Codul proiectului

#include <LiquidCrystal_I2C.h>

#include <Wire.h> 

LiquidCrystal_I2C lcd(0x23, 16, 2);

int trigger=12;
int echo=11;
int timp;
int distanta;

int red=2;
int yellow=3;
int green=4;

int butonPin=6;
int butonNew=0;
int butonOld=0;
int state=0;
int valbuton;

int dist3=20;
int dist2=10;
int dist1=3;

int buzzer=8;
int buzzeralim=A0;
void setup() {
  pinMode(trigger,OUTPUT);
  pinMode(echo,INPUT);
  pinMode(red,OUTPUT);
  pinMode(yellow,OUTPUT);
  pinMode(green,OUTPUT);

  pinMode(butonPin,INPUT);
  pinMode(buzzer, OUTPUT);
  Serial.begin(9600);

  lcd.begin();

  lcd.backlight();
  lcd.print("Initializare");
}

void loop() {
  butonstate();
  Serial.println(distanta);
  leduri(distanta, dist3, dist2, dist1);
  afisare();
  
  
}

void afisare(){
  lcd.clear();
  lcd.print("Distanta:");
  lcd.setCursor(9,0);
  lcd.print(distanta);
  lcd.setCursor(13,0);
  if (state==0){
    lcd.print("cm");
  }
  else{
    lcd.print("in");
  }
  delay(300);
}

int senzor(){
  digitalWrite(trigger,LOW);
  delayMicroseconds(10);
  digitalWrite(trigger,HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger,LOW);
  timp=pulseIn(echo,HIGH);
  delay(25);
  if (state == 0) {
    return 0.0173*timp;
  } else {
    return 0.0173 * timp /2.54;
  }
}

void leduri(int distanta, int dist3, int dist2, int dist1){ 
  if(distanta>dist3){
     digitalWrite(green,HIGH);
     delay(300);
     digitalWrite(green,LOW);
     delay(300);
  }
  else if(distanta>dist2){
    //digitalWrite(buzzer,HIGH);
     digitalWrite(yellow,HIGH);
     delay(300);
     digitalWrite(yellow,LOW);
     delay(300);
  }
  else if(distanta>dist1){
     digitalWrite(red,HIGH);
     delay(300);
     digitalWrite(red,LOW);
     delay(300);
     analogWrite(buzzeralim,150);
     digitalWrite(buzzer, LOW);
     tone(buzzer, 450);
     delay(100);
     noTone(buzzer);
     digitalWrite(buzzer,HIGH);
  }
  else{
    digitalWrite(buzzer,HIGH);
    digitalWrite(green,LOW);
    digitalWrite(yellow,LOW);
    digitalWrite(red,LOW);
  }
}

void butonstate(){
  butonNew=digitalRead(butonPin);
  distanta = senzor();
    if (butonOld==0 && butonNew==1){
      if(state==0){
        state=1;
        dist3=20/ 2.54;
        dist2=10/ 2.54;
        dist1=3/ 2.54;
      }
      else{
        state=0;
        dist3=20;
        dist2=10;
        dist1=3;
      }
    }
    butonOld=butonNew;
    
}

Am realizat partea de coding in Arduino IDE. In functia senzor() calculez distanta de la senzor
la obiect, pe care o transform in functie de modul setat din buton in centimetri sau in inch.
Pentru a da o nota mai rezonabila buzzer-ului am folosit functia tone(), iar pentru a-l face sa
bipaie am folosit un delay mic si apoi functia notone().

Rezultate obtinute

https://www.youtube.com/watch?v=ywaQIWpIWfc

Concluzii

Am implementat ce mi-am propus si functioneaza totul cum am sperat. Sunt multumit si a fost
la fel de simplu pe cat ma asteptam.

Jurnal

Bibliografie/Resurse

https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
https://www.youtube.com/watch?v=tuRAvlVBEl0
https://www.youtube.com/watch?v=M-UKXCUI0rE

ruleta_digitala_5_.pdf