Come unificare due progetti con un solo codice

ciao!
sono alle prime armi con arduino con la programmazione ed attualmente utilizzo il simulatore tinkercad.
Attualmente sono interessato a realizzare un circuito che premendo un pulsante mi faccia girare un servo motore e allo stesso momento faccia emettere ad un cicalino un beep
Ora io ho i due codici di programmazione per realizzare il tutto
il primo riguarda il servo motore che premendo il pulsante sul pin 6 mi fa girare il motore
ed è questo :

/*

beam_blocker.ino

Program that controls a 3D printed beam blocker that uses a servo as actuator

The circuit:
* Push-button connected to pin digital pin 6
* Servo motor connected to pin 9

Usage:
When the push button is pressed, the beam blocker opens or close depending on its previous state.

Additional information:
3D printed model can be downloaded from Thingiverse  

Created 08/Sept/2016
By Luis Jose Salazar-Serrano
totesalaz@gmail.com
http://opensourcelab.salazarserrano.com

*/

#include <Servo.h>

Servo servo1;

int ledPin = 13;                
int key_s6 = 6; // pin for push button

int index = 0;
boolean flag1 = false;

void setup()
{
  pinMode(ledPin, OUTPUT);      // Set Pin13 to output mode
  pinMode(key_s6, INPUT);       // Set Pin2 to input mode
  
  servo1.attach(9);             // Attach servo to digital port 9
  servo1.write(0);              // initialize servo position
  digitalWrite(ledPin, LOW);
}
void loop()
{
      
   // if button S6 is pressed...
   if(digitalRead(key_s6) == LOW && flag1 == false){        
    index++;
    flag1 = true;
   }

   // if button is NOT pressed...
   if(digitalRead(key_s6) == HIGH && flag1 == true){    
   
      if(index%2 == 1){
        servo1.write(90); // open beam block
        digitalWrite(ledPin, HIGH);
      }

      if(index%2 == 0){
        servo1.write(0);  // close beam block
        digitalWrite(ledPin, LOW);
      }
      
      flag1 = false;
   }
           
}

mentre il codice riguardo il cicalino è questo :

#define pulsante 6
#define suono 5
int a;
void setup() {

pinMode(pulsante,INPUT);
pinMode(suono,OUTPUT);
digitalWrite(suono,LOW);
}

void loop() {
a=digitalRead(pulsante);
if(a==HIGH)
{
  digitalWrite(suono,HIGH);
}else{
  digitalWrite(suono,LOW);
}
}

Come si implementa il tutto ?

Ciao...se il pulsante è lo stesso prova a dichiararlo/definirlo nello stesso modo...nel primo usi una variabile nel secondo un #define...e forse ti viene più chiaro

sto appena iniziando,quindi non so proprio la differenza tra variabile e define
define sta per definizione?
quindi nel primo codice dovrei cambiarlo chiamandolo pulsante al posto di button???

ciao,

per entrambe ti conviene dare un occhio a reference di ARDUINO QUI più in generale ad un reference di C/C++.

detto questo...come suggeriscono i "nomi" stessi...variabile è una cosa che può variare #define (definire) è una cosa fissa..che non può variare...cioè se tu dichiari una variabile così:

int LED = 6;
pinMode(LED,OUTPUT);
digitalWrite(LED,HIGH);

avrai che il pin 6 viene impostato come output...e poi lo imposti "attivo" e quindi il LED si accende...ma nel programma puoi anche fare:

LED = 7;
digitalWrite(LED,LOW);

a questo punto cosa succede?...e compilando non hai errori!
invece facendo così:

#define LED 6
pinMode(LED,OUTPUT);
digitalWrite(LED,HIGH);
LED=7;

il compilatore ti da un errore perchè stai tentando di cambiare un valore ad una costante.

detto questo...quello che intendevo è che per lo stesso pulsante hai usato due modi/nomi diversi...quindi, magari, già chiamandoli con lo stesso "nome" potrebbe risultarti più semplice capire come unire i due progetti...cioè importare gli if() del secondo sketch nel primo...

scusa io escluderei nel mio progetto il led che non mi serve,ma come dicevo dall'inizio io vorrei fare in modo che al premere il pulsante ,mi fa girare il motore a tot gradi,e al premere del pulsante mi faccia suonare il cicalino per almeno un secondo
si potrebbe sostituire la voce led con quella del buzzer?

ciao...dimmi una cosa...di quello che ho scritto nel mio ultimo post (quello prima di questo)...ti è chiaro tutto, ed intendo tutto, o qualche cosa non lo è?...e nel caso cosa?

Domanda: vuoi che il pulsante sia lo stesso o che siano due diversi?
Se vuoi che siano due allora ti basta riunire le parti uguali dei due scatch, modificando se necessario i numeri (inteso che fai un terzo scatch contenente copia/incollate le dichiarazioni di entrambi i precedenti, la xui setup() contiene il contenuto di entrambe le precedenti, e la cui loop() contiene il contenuto di entrambe le precedenti).
Ricorda che delay() diventa bloccante, se la hai usata (in realtà lo era anche prima, ma non era visibile)

ORSO2001:

sinceramente non ho capito come modificare il tutto,dato che sono all'inizio mi è difficile comprendere
io pensavo di tener presenti le voci
void setup
void loop
e quindi andare a modificare all'interno copiando il codice del cicalino e andandolo ad incollare nel codice del servo motore.
Il pulsante come dicevo è unico,che aziona il servo motore al momento che lo premi e ti fa suonare il cicalino emettendo un breve beep di un secondo circa

Alla fine lo scopo è modificare il codice uno che fa riferimento al servo motore ed inserire dei comandi nel codice in modo che mi faccia suonare anche un buzzer,quindi non unifichiamo nulla èpiu semplice se mi riuscite a trovare un'alternativa

ciao...lasciami dire...va benissimo "copia ed incolla" all'inizio (mica si nasce maghi)...però hai capito, passo per passo, cosa fà il primo sketch, quello del servo, che hai postato?
per come l'ho intuita io il secondo puoi averlo scritto tu ma il primo sicuramente no.
perchè guardando bene cosa fa il primo sketch è già tutto li...basta che, se il buzzer deve suonare finchè il pulsante è premuto, ci aggiungi 5 righe di codice...1 all'inizio per definire il pin del buzzer, 2 nel setup() e 2 nel loop().

diverso è se il primo sketch è "arabo"...e allora ti suggerisco di leggere/studiare gli ottimi pdf della Prof.ssa Tiziana Marsella QUESTO, QUESTO e QUESTO

non ho scritto nessun codice,mi serviva un circuito per il mio progetto ed ho trovato il primo per far muovere un motore ,ma mancava il cicalino

All'inizio per definire il pin del buzzer

all'inizio abbiamo questo

#include <Servo.h>

Servo servo1;

int ledPin = 13;                
int key_s6 = 6; // pin for push button

int index = 0;
boolean flag1 = false;

non è già inclusa l'istruzione ? (dove c'è scritto pin for push button)

fin qui ci sono,oppure devo comunque aggiungere un ulteriore istruzione per il pulsante?

l'ho modificato cosi,guardando un altro codice ed aggiungendo sul pin 3 il cicalino

#include <Servo.h>

Servo servo1;
                
int key_s6 = 6; // pin for push button
const int buttonPin = 6;
const int ledPin =  3;
int buttonState = 0;
int index = 0;
boolean flag1 = false;

void setup()
{
pinMode(ledPin, OUTPUT);      

  pinMode(buttonPin, INPUT);  
  pinMode(key_s6, INPUT);       // Set Pin2 to input mode
  
  servo1.attach(9);             // Attach servo to digital port 9
  servo1.write(0);              // initialize servo position

}
void loop()
{
     buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH) {     
    digitalWrite(ledPin, HIGH);  
  } 
  else {

    digitalWrite(ledPin, LOW); 
  }
   // if button S6 is pressed...
   if(digitalRead(key_s6) == LOW && flag1 == false){        
    index++;
    flag1 = true;
   }

   // if button is NOT pressed...
   if(digitalRead(key_s6) == HIGH && flag1 == true){    
   
      if(index%2 == 1){
        servo1.write(90); // open beam block
      }

      if(index%2 == 0){
        servo1.write(0);  // close beam block
      }
      
      flag1 = false;
   }

ho simulato il tutto con thinkercad e sembra che funziona

mi segnalava solo l'errore che alla fine dovevo aggiungere un'altra parentesi graffa

dovrei solo modificare la tonalità del suono del cicalino con la frequenza (?)
e poi dovrebbe girare passo passo in un solo senso e non quando premo il pulsante per una seconda volta tornare indietro

ORSO2001:
Ciao...se il pulsante è lo stesso prova a dichiararlo/definirlo nello stesso modo...nel primo usi una variabile nel secondo un #define...e forse ti viene più chiaro

alexxandro:
ciao!
sono alle prime armi con arduino con la programmazione ed attualmente utilizzo il simulatore tinkercad.
Attualmente sono interessato a realizzare un circuito che premendo un pulsante mi faccia girare un servo motore e allo stesso momento faccia emettere ad un cicalino un beep
Ora io ho i due codici di programmazione per realizzare il tutto
il primo riguarda il servo motore che premendo il pulsante sul pin 6 mi fa girare il motore
ed è questo :

/*

beam_blocker.ino

Program that controls a 3D printed beam blocker that uses a servo as actuator

The circuit:

  • Push-button connected to pin digital pin 6
  • Servo motor connected to pin 9

Usage:
When the push button is pressed, the beam blocker opens or close depending on its previous state.

Additional information:
3D printed model can be downloaded from Thingiverse

Created 08/Sept/2016
By Luis Jose Salazar-Serrano
totesalaz@gmail.com
http://opensourcelab.salazarserrano.com

*/

#include <Servo.h>

Servo servo1;

int ledPin = 13;               
int key_s6 = 6; // pin for push button

int index = 0;
boolean flag1 = false;

void setup()
{
  pinMode(ledPin, OUTPUT);      // Set Pin13 to output mode
  pinMode(key_s6, INPUT);      // Set Pin2 to input mode
 
  servo1.attach(9);            // Attach servo to digital port 9
  servo1.write(0);              // initialize servo position
  digitalWrite(ledPin, LOW);
}
void loop()
{
     
  // if button S6 is pressed...
  if(digitalRead(key_s6) == LOW && flag1 == false){       
    index++;
    flag1 = true;
  }

// if button is NOT pressed...
  if(digitalRead(key_s6) == HIGH && flag1 == true){   
 
      if(index%2 == 1){
        servo1.write(90); // open beam block
        digitalWrite(ledPin, HIGH);
      }

if(index%2 == 0){
        servo1.write(0);  // close beam block
        digitalWrite(ledPin, LOW);
      }
     
      flag1 = false;
  }
         
}





mentre il codice riguardo il cicalino è questo :


#define pulsante 6
#define suono 5
int a;
void setup() {

pinMode(pulsante,INPUT);
pinMode(suono,OUTPUT);
digitalWrite(suono,LOW);
}

void loop() {
a=digitalRead(pulsante);
if(a==HIGH)
{
  digitalWrite(suono,HIGH);
}else{
  digitalWrite(suono,LOW);
}
}




Come si implementa il tutto ?

alexxandro:
ciao!
sono alle prime armi con arduino con la programmazione ed attualmente utilizzo il simulatore tinkercad.
Attualmente sono interessato a realizzare un circuito che premendo un pulsante mi faccia girare un servo motore e allo stesso momento faccia emettere ad un cicalino un beep
Ora io ho i due codici di programmazione per realizzare il tutto
il primo riguarda il servo motore che premendo il pulsante sul pin 6 mi fa girare il motore
ed è questo :

/*

beam_blocker.ino

Program that controls a 3D printed beam blocker that uses a servo as actuator

The circuit:

  • Push-button connected to pin digital pin 6
  • Servo motor connected to pin 9

Usage:
When the push button is pressed, the beam blocker opens or close depending on its previous state.

Additional information:
3D printed model can be downloaded from Thingiverse

Created 08/Sept/2016
By Luis Jose Salazar-Serrano
totesalaz@gmail.com
http://opensourcelab.salazarserrano.com

*/

#include <Servo.h>

Servo servo1;

int ledPin = 13;               
int key_s6 = 6; // pin for push button

int index = 0;
boolean flag1 = false;

void setup()
{
  pinMode(ledPin, OUTPUT);      // Set Pin13 to output mode
  pinMode(key_s6, INPUT);      // Set Pin2 to input mode
 
  servo1.attach(9);            // Attach servo to digital port 9
  servo1.write(0);              // initialize servo position
  digitalWrite(ledPin, LOW);
}
void loop()
{
     
  // if button S6 is pressed...
  if(digitalRead(key_s6) == LOW && flag1 == false){       
    index++;
    flag1 = true;
  }

// if button is NOT pressed...
  if(digitalRead(key_s6) == HIGH && flag1 == true){   
 
      if(index%2 == 1){
        servo1.write(90); // open beam block
        digitalWrite(ledPin, HIGH);
      }

if(index%2 == 0){
        servo1.write(0);  // close beam block
        digitalWrite(ledPin, LOW);
      }
     
      flag1 = false;
  }
         
}





mentre il codice riguardo il cicalino è questo :


#define pulsante 6
#define suono 5
int a;
void setup() {

pinMode(pulsante,INPUT);
pinMode(suono,OUTPUT);
digitalWrite(suono,LOW);
}

void loop() {
a=digitalRead(pulsante);
if(a==HIGH)
{
  digitalWrite(suono,HIGH);
}else{
  digitalWrite(suono,LOW);
}
}




Come si implementa il tutto ?

alexxandro:
ciao!
sono alle prime armi con arduino con la programmazione ed attualmente utilizzo il simulatore tinkercad.
Attualmente sono interessato a realizzare un circuito che premendo un pulsante mi faccia girare un servo motore e allo stesso momento faccia emettere ad un cicalino un beep
Ora io ho i due codici di programmazione per realizzare il tutto
il primo riguarda il servo motore che premendo il pulsante sul pin 6 mi fa girare il motore
ed è questo :

/*

beam_blocker.ino

Program that controls a 3D printed beam blocker that uses a servo as actuator

The circuit:

  • Push-button connected to pin digital pin 6
  • Servo motor connected to pin 9

Usage:
When the push button is pressed, the beam blocker opens or close depending on its previous state.

Additional information:
3D printed model can be downloaded from Thingiverse

Created 08/Sept/2016
By Luis Jose Salazar-Serrano
totesalaz@gmail.com
http://opensourcelab.salazarserrano.com

*/

#include <Servo.h>

Servo servo1;

int ledPin = 13;               
int key_s6 = 6; // pin for push button

int index = 0;
boolean flag1 = false;

void setup()
{
  pinMode(ledPin, OUTPUT);      // Set Pin13 to output mode
  pinMode(key_s6, INPUT);      // Set Pin2 to input mode
 
  servo1.attach(9);            // Attach servo to digital port 9
  servo1.write(0);              // initialize servo position
  digitalWrite(ledPin, LOW);
}
void loop()
{
     
  // if button S6 is pressed...
  if(digitalRead(key_s6) == LOW && flag1 == false){       
    index++;
    flag1 = true;
  }

// if button is NOT pressed...
  if(digitalRead(key_s6) == HIGH && flag1 == true){   
 
      if(index%2 == 1){
        servo1.write(90); // open beam block
        digitalWrite(ledPin, HIGH);
      }

if(index%2 == 0){
        servo1.write(0);  // close beam block
        digitalWrite(ledPin, LOW);
      }
     
      flag1 = false;
  }
         
}





mentre il codice riguardo il cicalino è questo :


#define pulsante 6
#define suono 5
int a;
void setup() {

pinMode(pulsante,INPUT);
pinMode(suono,OUTPUT);
digitalWrite(suono,LOW);
}

void loop() {
a=digitalRead(pulsante);
if(a==HIGH)
{
  digitalWrite(suono,HIGH);
}else{
  digitalWrite(suono,LOW);
}
}




Come si implementa il tutto ?

mah le cose che vuoi fare sono estremamente semplici e si possono fare benissimo in uno sketch solo fin dall inizio, invece non vedo nessun debounce su i pulsanti e queste cose e meglio metterli sempre

>elrospo: ... ma hai riletto il tuo post? ? ? :o :o :o ... cerca cortesemente di sistemarlo, grazie.

Guglielmo

Alla fine va bene il codice che ho postato ?
La simulazione mi conferma che premendo il pulsante gira il motore e al momento mi fa suonare il cicalino
Magari aprirò un altro post se nn devo continuare qui dato che mi serve che il motore deve girare sempre allo stesso verso di 45 a 45° e poi risolvere sul cicalino che deve emettere un bel beep,magari creerò un mini circuito apposito con altoparlantino come mi hanno detto in un altro post

Per il cicalino non so cosa dirti, perché pare tu usi solamente una digitalWrite per comandarlo, quindi senza possibilità di modifica.
Quanto al motore praticanente sei nella situazione che ora ti gira una vilta in un senso una volta nell'altro di 90° mentre vorresti lo faccia sempre nello stesso senso, ma di 45°. Giusto?

Il motore deve girare 45 gradi alla volta in un solo senso ,dato che devo creare un dispenser

Non sono un esperto, anzi, ma se il motore deve essere libero di girare continuamente non so se un servo sia la soluzione adatta.

girare liberamente il motore ?
premo il bottone parte il motore e si ferma a 45
premo il bottone riparte il motore ed esegue un altro giro di 45(90)
etc etc

da quel che so, ma posso sbagliare, i SERVO motori possono muoversi in un range preciso di gradi tipo 0-180 (mezzo giro) o 0-270 (3/4 giro)...questo dipende dal tipo di controllo del "motore"...e quindi non sono multigiro.
se a te serve un motore che si muova di 45 in 45 ma con numero "infinito" di giri...devi optare per altra soluzione dal SERVO....tipo QUESTO e poi nel forum trovi molte info.

Secondo me il problema sta nell'eleborazione che stai facendo col pulsante...che come ho imparato a mie spese tempo fà,non è cosi facile.
In condizione si trova il pulsante?
In condizione era prima?
Cosa ti serve dal pulsante?
...ect ect..

Forse qualkuno ricorda e magari puo indirizzarti su uno delle mie prime apparizioni sul forum,al topic "SEMAFORO" se non ricordo male,dove un utente,FrancescoFF sempre se non ricordo male ed anche altri,mi diedero una bellissima spiegazione sul ciclo finito del pulsante....è sono riusciti pure a farmelo capire.