• 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
Szopka bożonarodzeniowa :)
#1
Witam.
Poniższy projekt ma za zadanie sterowaniem odtwarzaczem dźwięku, przekaźnikiem włączającym oświetlenie oraz trzema serwomechanizmami. Całość to szopka bożonarodzeniowa do kościoła w mojej parafii (nie śmiejcie się, wiem że to dziwna pora na robienie szopki ale robię ją w wolnym czasie a tego wolnego czasu mam niewiele i mam nadzieję że do grudnia zdążę).
Krótki opis wejść i wyjść.
Wejście jest tylko jedno  - A1
Wyjście dla odtwarzacza dźwięku - D2
Wyjście dla przekaźnika oświetlenia – D3
Wyjście dla serwomechanizmu 1 – D4
Wyjście dla serwomechanizmu 2 – D5
Wyjście dla serwomechanizmu 3 – D6
 
Prośba.
W tej chwili program działa tak, że zmiana na wejściu A1 powoduje kolejno
1. podanie stanu wysokiego na D2 na określony czas i przejście w stan niski
2. podanie stanu wysokiego na D3
3. sterowanie kolejno serwomechanizmami 1, 2 i 3 według określonych parametrów.
4. podanie stanu niskiego na D3
 
Chciałbym żeby niezależnie od tego czy program się już w całości wykonał czy nie, punk 1 (czyli podanie stanu wysokiego na odtwarzacz dźwięku i jego wyłączenie) wykonywał się zawsze gdy na A1 nastąpi zmiana.
Czyli zawsze po tym jak w podłączonej do A1 bramce fotooptycznej pojawi się przeszkoda zostanie podany stan wysoki dla odtwarzacza dźwięku niezależnie czy program jest w wykonywania zadań z punktu 2, 3, 4.

Bardzo byłbym wdzięczny za pomoc gdyż syn który pisał mi ten kod mówi że nie ma możliwości żeby tak to działało.

Oto mój kod:
Kod:
const int czasbogzaplac=8000;

#include <Servo.h>

Servo myservo,myservo2,myservo3;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int poz = 0;
int koniec=0;
bool kalibracja=1;
void setup() {
 myservo.attach(4); // servomotor 1
 myservo2.attach(6); // servomotor 2
  myservo3.attach(5); // servomotor 3
  pinMode(3,OUTPUT);  // światło
  pinMode(2,OUTPUT);  // odtwarzacz dźwięku
}
void loop() {
 if(kalibracja)
 {
   myservo.write(2);
    myservo2.write(85);
    myservo3.write(60);
    delay(3000);
    kalibracja=0;
 }
 if(analogRead(1)>100)// bramka fotooptyczna
 {
   digitalWrite(2,HIGH);
   delay(czasbogzaplac);
   digitalWrite(2,LOW);
   digitalWrite(3,HIGH);
 for(int i=2;i<=80;i++)
 {
   myservo.write(i);
   delay(20);
 }
 delay(1000);
 myservo2.write(85);
 for(int i=85;i>=40;i--)
 {
   myservo2.write(i);
   delay(25);
 }
 delay(1000);
 for(int j=0;j<4;j++)
 {
     myservo3.write(60);
     for(int i=60;i<=70;i++)
 {
   myservo3.write(i);
   delay(40);
 }for(int i=70;i>50;i--)
 {
   myservo3.write(i);
   delay(40);
 }
 for(int i=50;i<=60;i++)
 {
   myservo3.write(i);
   delay(40);
 }
 myservo3.write(60);
 }
 delay(1000);
 for(int i=40;i<=85;i++)
 {
   myservo2.write(i);
   delay(25);
 }
 delay(1000);
 for(int i=80;i>2;i--)
 {
   myservo.write(i);
   delay(20);
 }
 myservo.write(2);
 digitalWrite(3,LOW);
 koniec++;
 }
 }
 
Odpowiedź
#2
(07-05-2018, 14:59)wieslaw3 napisał(a): Bardzo byłbym wdzięczny za pomoc gdyż syn który pisał mi ten kod mówi że nie ma możliwości żeby tak to działało.
Jest możliwość, trzeba wywalić delay użyć millis().
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości