Eseguire un comando singolo in loop

Buongiorno
Premessa: sono completamente noob sul mondo di arduino dato che ho iniziato da pochi giorni :slight_smile:
Ho un problema (se così può definirsi ) sto costruendo un circuito molto semplice:
1 deviatore 2 led 1 servomotore
Quando arduino legge 1 al deviatore, accende luce verde e fa partire il servo con i comandi che gli ho dato
Quando arduino legge 0, accende luce rossa e ferma tutto nella posizione che ho stabilito
E fin qui tutto ok
Volevo aggiungere un piccolo buzzer che se arduino legge 1 emette "1bip" se legge 0 emette "2bip" ma SOLO UNA VOLTA esempio:
Legge 1, emette 1bip luce verde e il servo entra in funzione
Legge 0, emette 2bip luce rossa e il servo si ferma
.... mettendo il comando nel setup me lo fa all'inizio e basta (giustamente) mettendolo nel loop me lo fa di continuo anche mettendolo in "for" , come posso fare?

Spero di essermi spiegato bene
Grazie in anticipo

Usa una nuova variabile e un if con cui comandi il beeper.

grazie della risposta, ma non sono riuscito comunque, provo a postare il codice:

#include <Servo.h>
Servo myservo;
int ledv = 2; // led rosso collegato al pin 2
int ledr = 3; // led verde collegato al pin 3
int buz = 4; // buzzer collegato al pin 4
int dev = 5; // deviatore collegato al pin 5
int statodev; // stato del diviatore
int pos = 60; // posizione iniziale del servomotore del servomotore
int buzsound;

void setup() {
  myservo.attach  (10); //servomotore collegato al pin 10
  myservo.write (90); // servo parte a 90°
  pinMode(ledr, OUTPUT);
  pinMode(ledv, OUTPUT);
  pinMode (buz, OUTPUT);
  pinMode (dev, INPUT);
}

void start (){
  for (pos = 60; pos <= 120; pos += 1) { 
    // in steps of 1 degree
    myservo.write(pos);             
    delay(15);                      
  }
  for (pos = 120; pos >= 60; pos -= 1) { 
    myservo.write(pos);            
    delay(15);                      
  }
}
  void buzzoff (){
    digitalWrite (buz, HIGH);
    delay (20);
    digitalWrite (buz, LOW);
    delay (20);
    digitalWrite (buz, HIGH);
    delay (20);
    digitalWrite (buz, LOW);
  }
 
void loop() {
  
  buzsound = digitalRead (dev);
  statodev = digitalRead (dev);
  if (statodev ==0){
    digitalWrite (ledr, HIGH);
    digitalWrite (ledv, LOW);
   }
  if (statodev ==1){
    digitalWrite (ledr, LOW);
    digitalWrite (ledv, HIGH);
    start();
  }
  if (buzsound == 0)  {
    for (int i=0; i<3; i++){
    buzzoff();
    }
  }
}

Prova così

#include <Servo.h>
Servo myservo;
const int ledv = 2; // led rosso collegato al pin 2
const int ledr = 3; // led verde collegato al pin 3
const int buz = 4; // buzzer collegato al pin 4
const int dev = 5; // deviatore collegato al pin 5
byte statodev; // stato del diviatore
// int pos = 60; // posizione iniziale del servomotore del servomotore
bool buzsound;

void setup() {
  myservo.attach  (10); //servomotore collegato al pin 10
  myservo.write (90); // servo parte a 90°
  pinMode(ledr, OUTPUT);
  pinMode(ledv, OUTPUT);
  pinMode (buz, OUTPUT);
  pinMode (dev, INPUT);
  buzsound = true;
}

void start () {
  for (int pos = 60; pos <= 120; pos += 1) {
    // in steps of 1 degree
    myservo.write(pos);
    delay(15);
  }
  for (int pos = 120; pos >= 60; pos -= 1) {
    myservo.write(pos);
    delay(15);
  }
}

void buzzoff () {
  digitalWrite (buz, HIGH);
  delay (20);
  digitalWrite (buz, LOW);
  delay (20);
  digitalWrite (buz, HIGH);
  delay (20);
  digitalWrite (buz, LOW);
}

void loop() {
  statodev = digitalRead (dev);

  if (statodev == 0) {
    digitalWrite (ledr, HIGH);
    digitalWrite (ledv, LOW);
    if (buzsound == true) for (int i = 0; i < 3; i++) buzzoff();
    buzsound = false;
  }

  if (statodev == 1) {
    digitalWrite (ledr, LOW);
    digitalWrite (ledv, HIGH);
    start();
  }

} // End Loop

marcom87:
non sono riuscito comunque, provo a postare il codice:

No, naturalmente usare un'altra variabile in modo identico alla singola non modifica le cose.
In generale quando si vuole fare qualcosa una sola volta quando uno stato cambia, bisogna tenere traccia dello stato al tempo T-1, ad esempio in una variabile chiamata "precedente", aggiornandola ogni volta che viene trovata diversa dal valore "attuale". Schematicamente:

precedente = statoiniziale


loop
   attuale = leggi
   if (precedente != attuale)
   {
       precedente = attuale
       fa qualcosa una sola volta ogni cambiamento
   }

PaoloP:
Prova così

#include <Servo.h>

Servo myservo;
const int ledv = 2; // led rosso collegato al pin 2
const int ledr = 3; // led verde collegato al pin 3
const int buz = 4; // buzzer collegato al pin 4
const int dev = 5; // deviatore collegato al pin 5
byte statodev; // stato del diviatore
// int pos = 60; // posizione iniziale del servomotore del servomotore
bool buzsound;

void setup() {
  myservo.attach  (10); //servomotore collegato al pin 10
  myservo.write (90); // servo parte a 90°
  pinMode(ledr, OUTPUT);
  pinMode(ledv, OUTPUT);
  pinMode (buz, OUTPUT);
  pinMode (dev, INPUT);
  buzsound = true;
}

void start () {
  for (int pos = 60; pos <= 120; pos += 1) {
    // in steps of 1 degree
    myservo.write(pos);
    delay(15);
  }
  for (int pos = 120; pos >= 60; pos -= 1) {
    myservo.write(pos);
    delay(15);
  }
}

void buzzoff () {
  digitalWrite (buz, HIGH);
  delay (20);
  digitalWrite (buz, LOW);
  delay (20);
  digitalWrite (buz, HIGH);
  delay (20);
  digitalWrite (buz, LOW);
}

void loop() {
  statodev = digitalRead (dev);

if (statodev == 0) {
    digitalWrite (ledr, HIGH);
    digitalWrite (ledv, LOW);
    if (buzsound == true) for (int i = 0; i < 3; i++) buzzoff();
    buzsound = false;
  }

if (statodev == 1) {
    digitalWrite (ledr, LOW);
    digitalWrite (ledv, HIGH);
    start();
  }

} // End Loop

grazie della risposta, sicuramente mi sono spiegato male io, ma in questo i 2 bip me li fa solo una volta, a me serve che li faccia solo una volta ma ogni qualvolta che lo stato è 0

Claudio_F:
No, naturalmente usare un’altra variabile in modo identico alla singola non modifica le cose.
In generale quando si vuole fare qualcosa una sola volta quando uno stato cambia, bisogna tenere traccia dello stato al tempo T-1, ad esempio in una variabile chiamata “precedente”, aggiornandola ogni volta che viene trovata diversa dal valore “attuale”. Schematicamente:

precedente = statoiniziale

loop
  attuale = leggi
  if (precedente != attuale)
  {
      precedente = attuale
      fa qualcosa una sola volta ogni cambiamento
  }



grazie, provo a lavorarci sopra :)

Allora segui il consiglio di Claudio F e controlla lo stato precedente. Se uguale non esegui il beep se diverso si.

PaoloP:
Allora segui il consiglio di Claudio F e controlla lo stato precedente. Se uguale non esegui il beep se diverso si.

grazie comunque dell'aiuto :slight_smile: