• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Koci laserowy dzwonek do drzwi
#1
Robię alarm laserowy dla kotów - gdy ten sterczy pod drzwiami to włącza się dzwonek Smile
Układa składa się z Arduino, lasera diodowego 5mW, fotorezystora, diody i buzzera:

znalazłem taki program:

int sensorPin=A0;
int sensorValue=0; 
int piezoPin=9;

void setup()

pinMode(sensorPin,INPUT); 
pinMode(7,OUTPUT); 
pinMode(6,OUTPUT); 
pinMode(piezoPin,OUTPUT); 
digitalWrite(7,HIGH); 
digitalWrite(6,LOW); 
}


void loop()

sensorValue=analogRead(sensorPin); 
if(sensorValue<=1000) 
{
digitalWrite(piezoPin,HIGH); 
{tone(9,3047,400); noTone(8); } 
digitalWrite(7,HIGH);
 } 

else 
{
digitalWrite(piezoPin,LOW); digitalWrite(7,LOW);
 } 
sensorValue=1000; 
}

Jednak nie zawsze to działa jak należy, ponieważ kotek czasami na moment przetnie wiązkę i koniec - buzzer juz nie piszczy, a kot czeka. Chciałbym zeby buzzer piszczał póki nie wcisnę przycisku monostabilnego.
Starałem się to jakoś zmodfikować, ale program zacina się przy wartości odczytywanej przez fotorezystor = 600. 

Moja przeróbka na przycisk wyłączający buzzer i diode:


int sensorPin1=A0;

int reset=1;
int sensorValue1=0; 
int piezoPin=9;


void setup()

pinMode(sensorPin1,INPUT); 
pinMode(7,OUTPUT);  
pinMode(piezoPin,OUTPUT); 
pinMode(reset,INPUT);


digitalWrite(7,HIGH); 
}

void loop()
{
int ALARM;
int ALARMOFF;
int button=digitalRead(reset); 
sensorValue1=analogRead(sensorPin1);
Serial.println(analogRead(sensorPin1)) ;

if(button==HIGH) {Serial.print("przycisk**********"); }

if((sensorValue1<=600)) {
  digitalWrite(piezoPin,HIGH); 

    ALARM:
    tone(9,50,400); 
    noTone(8);
     
    digitalWrite(7,HIGH);
    if (button == LOW) { goto ALARM; }
    if (button == HIGH) { goto ALARMOFF; }
    } 
   ALARMOFF:
if ((sensorValue1>600)) {
  digitalWrite(piezoPin,LOW); 
  digitalWrite(7,LOW); } 
  
  sensorValue1=1000; 
}



Czy mógłby proszę ktoś mi pomóc z tym programem? Smile
 
Odpowiedź
#2
(04-01-2017, 20:38)tadziu_91 napisał(a): Robię alarm laserowy dla kotów - gdy ten sterczy pod drzwiami to włącza się dzwonek Smile
Układa składa się z Arduino, lasera diodowego 5mW, fotorezystora, diody i buzzera:

znalazłem taki program:

int sensorPin=A0;
int sensorValue=0; 
int piezoPin=9;

void setup()

pinMode(sensorPin,INPUT); 
pinMode(7,OUTPUT); 
pinMode(6,OUTPUT); 
pinMode(piezoPin,OUTPUT); 
digitalWrite(7,HIGH); 
digitalWrite(6,LOW); 
}


void loop()

sensorValue=analogRead(sensorPin); 
if(sensorValue<=1000) 
{
digitalWrite(piezoPin,HIGH); 
{tone(9,3047,400); noTone(8); } 
digitalWrite(7,HIGH);
 } 

else 
{
digitalWrite(piezoPin,LOW); digitalWrite(7,LOW);
 } 
sensorValue=1000; 
}

Jednak nie zawsze to działa jak należy, ponieważ kotek czasami na moment przetnie wiązkę i koniec - buzzer juz nie piszczy, a kot czeka. Chciałbym zeby buzzer piszczał póki nie wcisnę przycisku monostabilnego.
Starałem się to jakoś zmodfikować, ale program zacina się przy wartości odczytywanej przez fotorezystor = 600. 

Moja przeróbka na przycisk wyłączający buzzer i diode:


int sensorPin1=A0;

int reset=1;
int sensorValue1=0; 
int piezoPin=9;


void setup()

pinMode(sensorPin1,INPUT); 
pinMode(7,OUTPUT);  
pinMode(piezoPin,OUTPUT); 
pinMode(reset,INPUT);


digitalWrite(7,HIGH); 
}

void loop()
{
int ALARM;
int ALARMOFF;
int button=digitalRead(reset); 
sensorValue1=analogRead(sensorPin1);
Serial.println(analogRead(sensorPin1)) ;

if(button==HIGH) {Serial.print("przycisk**********"); }

if((sensorValue1<=600)) {
  digitalWrite(piezoPin,HIGH); 

    ALARM:
    tone(9,50,400); 
    noTone(8);
     
    digitalWrite(7,HIGH);
    if (button == LOW) { goto ALARM; }
    if (button == HIGH) { goto ALARMOFF; }
    } 
   ALARMOFF:
if ((sensorValue1>600)) {
  digitalWrite(piezoPin,LOW); 
  digitalWrite(7,LOW); } 
  
  sensorValue1=1000; 
}



Czy mógłby proszę ktoś mi pomóc z tym programem? Smile

Ok. Teraz z tym programem poniżej mam tak, że sygnał dzwiękowy (buzzer) dzwoni tylko w momencie przecięcia wiązki, natomiast sygnał świetlny (dioda) swieci się aż do wciśnięcia przycisku. problem leży w sformułowaniu w 21 linijce - "if(sensorValue<=600)"

int reset=1;
int sensorPin=A0;
int sensorValue=0; 
int piezoPin=9;

void setup()

  pinMode(sensorPin,INPUT); 
  pinMode(7,OUTPUT); 
  pinMode(6,OUTPUT); 
  pinMode(piezoPin,OUTPUT); 
  
  digitalWrite(7,LOW);  
}
  
void loop()

  sensorValue=analogRead(sensorPin); 
  int button=digitalRead(reset);
  
  if(sensorValue<=600) 
  {
    digitalWrite(7,HIGH);
    digitalWrite(piezoPin,HIGH); 
    {tone(9,500,400); delay(500); } 
    
   } 
   else if (button==HIGH)
   {
    digitalWrite(piezoPin,LOW); 
    digitalWrite(7,LOW);
    } 
}



Czy mógłby ktos z tym trzymaniem sygnału dzwiękowego pomóc? Smile Chciałbym aby buzzer działał po przecięciu wiązki aż do wciśnięcia przycisku.
 
Odpowiedź
#3
Witam,
To daj tone () do wnętrza pętli while z warunkiem dla stanu przycisku button.
Pozdrawiam.
 
Odpowiedź
#4
(04-01-2017, 21:41)Smaczek napisał(a): Witam,
To daj tone () do wnętrza pętli while z warunkiem dla stanu przycisku button.
Pozdrawiam.

Zrobiłem tak jak zaproponowałeś, potem kombinowałem strasznie i albo nie działało albo program się wykrzaczał przy wartości 600 (podgląd z portu szeregowego).
Ostatecznie zrobiłem tak jak poniżej no i program zacina się gdy fotorezystor (sensorValue) jest większy od 600 i spada. W momencie zacięcia się programu jest zawsze wartość na sensorValue=600.
Być może źle to robię, jeżeli mógłbym prosić jeszcze o jakąś podpowiedź.

reasumując: Program zawiesza się gdy wartość spada do 600 tylko gdy przycisk nie jest wciśnięty (HIGH). Gdy wartość spada przy wciśniętym przycisku program się nie zawiesza i wyświetla wartości w pełnym zakresie.

int reset=1;
int sensorPin=A0;
int sensorValue=0; 
int piezoPin=9;

void setup()

  pinMode(sensorPin,INPUT); 
  pinMode(7,OUTPUT); 
  pinMode(6,OUTPUT); 
  pinMode(piezoPin,OUTPUT); 
  
  digitalWrite(7,LOW);  
}
  
void loop()

  sensorValue=analogRead(sensorPin); 
  int button=digitalRead(reset);
  Serial.println(sensorValue);
  if (button==HIGH) { Serial.print("przycisk******");}
  
  if(sensorValue<=600) 
  {
    digitalWrite(7,HIGH);
    digitalWrite(piezoPin,HIGH);
    
    while(button==LOW){
    {tone(9,500,400); delay(500);}
    } 
    
   } 
   if (button==HIGH)
   {
    digitalWrite(piezoPin,LOW); 
    digitalWrite(7,LOW);
    } 
}
 
Odpowiedź
#5
Witam,
Musisz w warunku dla while odczytywać wartość na pinie reset- czyli digitalRead(reset), a nie sprawdzać wartość zmiennej button, gdyż ta jest przypisywana na początku pętli loop().
Pozdrawiam.
 
Odpowiedź
#6
(05-01-2017, 10:29)Smaczek napisał(a): Witam,
Musisz w warunku dla while odczytywać wartość na pinie reset- czyli digitalRead(reset), a nie sprawdzać wartość zmiennej button, gdyż ta jest przypisywana na początku pętli loop().
Pozdrawiam.

Wielkie dzięki za pomoc Smile wszystko działa jak należy Smile
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości