ciao a tutti, chiedo un vostro aiuto dato che sono alle prime armi e prima di fare danni con la scheda sto provando il codice su un simulatore, quindi ci saranno sicuramente dei piccoli errori che poi andrò a correggere)
quello che voglio fare è che durante tutto il tempo in cui il servo è in movimento (penso che lo sostituirò con un motore passo/passo quindi il tempo sarà molto più lungo), due led lampeggino tipo flip-flop e poi si spengano dopo che il motore ha fatto andata e ritorno. è possibile?
vi allego la bozza del software che ho creato
#include <DHT.h>
#include <DHT_U.h>
#include <Servo.h>
#include "DHT.h"
Servo servo_4;
#define DHTPIN 9 //pin di collegamento sensore temperatura
#define DHTTYPE DHT11 //definizione modello
DHT dht(DHTPIN, DHTTYPE);
int stato; //per funzione relè
void setup()
{
Serial.begin(9600); //comunicazione seriale per controllo su pc
pinMode(5, INPUT);
pinMode(2, OUTPUT);
pinMode(3, INPUT);
servo_4.attach(4);
pinMode(6, OUTPUT);
stato=0; //per funzione relè
dht.begin(); //inizializzazione comunicazione sensore
}
void loop()
{
digitalRead(5); //controllo pulsante start
delay(100);
digitalRead(3); //controllo pulsante riarmo
delay(100);
float t = dht.readTemperature(); //dati sensore temperatura
float h = dht.readHumidity(); //dati umidità
Serial.print("Umidità: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" °C");
if (digitalRead(5)==1 and stato==0) //funzione per effetto relè acceso
{
stato=1;
}
else if (digitalRead(3)==1 and stato==1) //funzione per effetto relè spento
{
stato=0;
}
if (stato==1) //accensione
{
digitalWrite(2, HIGH); //accensione led notifica
servo_4.write(90); //rotazione servo per sgancio molla
delay(400);
if (t<=18) //imposta temperatura di accensione riscaldamento
{
digitalWrite (6, HIGH); // accensione relè riscaldamento
}
else if (t>=20) //imposta memperatura massima
{
digitalWrite (6, LOW); //spegnimento relè riscaldamento
}
} if (stato==0) //riarmo sistema
{
digitalWrite(2, LOW); //spegnimento led notifica
servo_4.write(0); //rotazione servo per blocco molla
digitalWrite(6, LOW); //spegnimento relè riscaldamento
}
delay(10); // Delay a little bit to improve simulation performance
}
in alternativa (se la funzione del lampeggio non è possibile farla) potrei optare per un buzzer passivo che suoni per tutto il tempo del movimento. questo è possibile farlo?
il metodo più grezzo sarebbe usare un buzzer attivo comandato da relè ma vorrei evitare questa opzione perchè vorrei scegliere la frequenza del suono
Dovresti cambiare la struttura del programma e utilizzare millis() invece di delay(). Col delay() il programma si blocca e non puoi fare altre cose, come appunto far lampeggiare i led.
In alternativa compri un led che lampeggia da solo e lo fai partire subito prima di avviare il motore...
fratt:
Dovresti cambiare la struttura del programma e utilizzare millis() invece di delay(). Col delay() il programma si blocca e non puoi fare altre cose, come appunto far lampeggiare i led.
In alternativa compri un led che lampeggia da solo e lo fai partire subito prima di avviare il motore...
Grazie per la risposta.
Mi stai dicendo che ci sono in commercio led che lampeggiano autonomamente? Cioè io dò un digitalwrite High e lui lampeggia?
Proverò anche a passare a millis
Non sono un elettronico, ma da qualche parte ho letto che ci sono dei led con all'interno un circuito che li fa lampeggiare. Quindi lampeggiano da soli. Ma non saprei dirti da dove cominciare a cercarli...
In ogni caso puoi fare tutto anche con un normalissimo led se strutturi il programma nel modo corretto.
Per cominciare a capire il funzionamento di millis() puoi guardare l'esempio dell'ide "blink without delay".
grazie per i link, mi sono fatto un po di cultura
ora provo a buttare giù il codice, ma quindi io non andrò a dirgli "lampeggia finchè il motore gira, ma bensì devo vedere +o- quanto tempo ci mette a fare il percorso e lo impongo al codice, giusto?
edit: anzi, ora che ci penso ho un pulsante di finecorsa che devo utilizzare come "azzeramento motore, potrei dirgli che lampeggi per tutto il tempo in cui NON è premuto il pulsante (dato che il motore sarà in rotazione
sono riuscito ad integrare la parte di codice nel programma sfruttando il pulsante di finecorsa del motore e su simulatore funziona.
in tutte le guide ho trovato la procedura per far lampeggiare un solo led, ma io vorrei far alternare 2 led.
ho provato a modificare il codice (sicuramente sbagliando perchè il simulatore dà i numeri). allego qui parte del codice con la mia prova evidenziando l'aggiunta.
if (blinking) {
currentMillis = millis(); // better to store in variable, for less jitter
if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { // enough time passed yet?
digitalWrite(7, !digitalRead(7)); // shortcut to toggle the LED
previousMillis = currentMillis; // sets the time we wait "from"
digitalWrite(2, LOW); //PROVA INTERMITTENZA CON GIALLLO
}
} else {
digitalWrite(7, LOW); // force LED off when not blinking
digitalWrite(2, HIGH); //PROVA INTERMITTENZA CON GIALLO
}
int reading = digitalRead(3);
delay(50); // crude de-bouncing
praticamente la mia idea è stata che quando a un led viene dato il comando di high, all'altro ho impostato low.
ma lampeggia in modo anomalo... cosa ho sbagliato?
rieccomi qui con un'altro problema con il lampeggio.
sono passato dal test su simulatore alla prova reale ma ho un problema
quando i 2 led sono in lampeggio, ogni 2 secondi il lampeggio si "blocca" per circa 0.5/1 secondo e poi riparte ma non riesco a capire dovè il problema, ho solo un dalay da 50 e uno da 10, che sia quello il problema? praticamente il quel tempo si spegne anche il led RX sulla scheda mentre per tutto il resto del tempo rimane acceso
è che da quello che ho capito per un corretto funzionamento almeno un dalay serve... alego il mio codice
edit: anche togliendo i dalay il problema rimane
#include <DHT.h>
#define DHTPIN 13 // pin di arduino a cui connetto il sensore
#define DHTTYPE DHT11 //definizione modello sensore
DHT dht(DHTPIN, DHTTYPE);
int stato; //per funzione relè
int val=24; // temperatura da mantenere
int ledstato = 2;
int ledmovimento = 3;
int rele = 4;
int startcentrale = 5;
int finecorsa = 6;
int riarmo = 7;
//impostazioni per lampeggio
bool blinking = false; //defines when blinking should occur
unsigned long blinkInterval = 150; // number of milliseconds for blink
unsigned long currentMillis; // variables to track millis()
unsigned long previousMillis;
void setup()
{
pinMode(startcentrale, INPUT); //pulsante avvio sistema
pinMode(finecorsa, INPUT); //pulsante lampeggio movimento/reset motore
pinMode(riarmo, INPUT); //pulsante riarmo
pinMode(ledstato, OUTPUT); // led stato sistema prenotato
pinMode(rele, OUTPUT); //relè riscaldamento
pinMode(ledmovimento, OUTPUT); //led lampeggio movimento
stato=0; //per funzione relè
pinMode(DHTPIN, INPUT); // sensore temperatura
digitalWrite (rele, HIGH); //stato relè spento ad accensione
//comunicazione seriale
Serial.begin(9600); // inizializzo la comunicazione seriale
Serial.println("Test Sensore DHTxx!");
Serial.println("");
dht.begin(); // inizializzo la comunicazione del sensore
}
void loop()
{
float h = dht.readHumidity(); //lettura umidita
float t = dht.readTemperature(); //lettura temperatura
// controllo l'avvenuta comunicazione, ed avvio la scrittuta dei dati sulla seriale, ed in caso negativo scrito che è fallita
if (isnan(t) || isnan(h)) {
Serial.println("Errore lettura sensore DHT FALLITA");
} else {
Serial.print("Umidita': ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.println(" *C");
}
Serial.println("");
// codice per lampeggio
if (blinking) {
currentMillis = millis(); // better to store in variable, for less jitter
if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { // enough time passed yet?
digitalWrite((ledmovimento), !digitalRead((ledmovimento))); // led rosso
digitalWrite((ledstato), !digitalRead((ledmovimento))); //intermittenza led giallo
previousMillis = currentMillis; // sets the time we wait "from"
}
} else {
digitalWrite((ledmovimento), LOW); // spegnimento led rosso
}
int reading = digitalRead(finecorsa);
delay (50);// delay 50
if (reading==LOW) // condizione a finecorsa non premuto
blinking=true; // start blinking
else
blinking=false; // stop blinking
//fine codice lampeggio
if (digitalRead(startcentrale)==1 and stato==0) //funzione per effetto relè
{
stato=1;
}
else if (digitalRead(riarmo)==1 and stato==1)
{
stato=0;
}
if (stato==1) //accensione
{
if ((digitalRead(finecorsa) == HIGH) && (stato == 1))
{
digitalWrite(ledstato, HIGH); //accensione led notifica
}
if (t<val) //temperatura di mantenimento
{
digitalWrite (rele, LOW); //accensione relè
}
else
{
digitalWrite (rele, HIGH); //spegnimento relè
}
}
if (stato==0) //riarmo sistema
{
if ((digitalRead(finecorsa) == HIGH) && (stato == 0))
{
digitalWrite(ledstato, LOW); //spegnimento led notifica
}
digitalWrite(rele, HIGH); //spegnimento relè riscaldamento
}
delay (10);// Delay a little bit to improve simulation performance
}
rieccomi alle prese col mio progetto, ora ho unito il motore passo-passo (28byj-48) al resto del circuito ed ho il problema che mentre il motore è in movimento i led non lampeggiano! (i quali mi servono proprio per segnalare che il motore è in movimento)
so che il motivo è che il processore o fà una cosa o fà un'altra, ma ce un modo per "imbrogliarlo"?
eccomi qui, lo sketch può risultare un po "sporco" perchè sto facendo delle prove:
praticamente all'if di "avviamento motore" lui fà 90 gradi avanti e poi indietro per un colpo solo, ma essendo anche il pulsante finecorsa non premuto dovrebbe lampeggiare
#include <DHT.h>
#include <StepperMotor.h>
#define DHTPIN 13 // pin di arduino a cui connetto il sensore
#define DHTTYPE DHT11 //definizione modello sensore
DHT dht(DHTPIN, DHTTYPE);
int stato; //per funzione relè
int val=24; // temperatura da mantenere
int ledstato = 2;
int ledmovimento = 3;
int rele = 4;
int startcentrale = 5;
int finecorsa = 6;
int riarmo = 7;
int _PIN1 = 8; //pin motore
int _PIN2 = 9; //pin motore
int _PIN3 = 10; //pin motore
int _PIN4 = 11; //pin motore
int cicalino = 12; //cicalino
volatile boolean riposo = false;
int punto0 = 0; //variabile per reset motore
int statoprec = 0; //variabile stato precedente
StepperMotor stepper(_PIN1, _PIN2, _PIN3, _PIN4);
//impostazioni per lampeggio
bool blinking = false; //defines when blinking should occur
unsigned long blinkInterval = 150; // number of milliseconds for blink
unsigned long currentMillis; // variables to track millis()
unsigned long previousMillis;
void setup()
{
pinMode(startcentrale, INPUT); //pulsante avvio sistema
pinMode(finecorsa, INPUT); //pulsante lampeggio movimento/reset motore
pinMode(riarmo, INPUT); //pulsante riarmo
pinMode(ledstato, OUTPUT); // led stato sistema prenotato
pinMode(rele, OUTPUT); //relè riscaldamento
pinMode(ledmovimento, OUTPUT); //led lampeggio movimento
stato=0; //per funzione relè
pinMode(DHTPIN, INPUT); // sensore temperatura
stepper.setPeriod(1);
digitalWrite (rele, HIGH); //stato relè spento ad accensione
digitalWrite (cicalino, HIGH); //stato cicalino spento
pinMode(_PIN1, OUTPUT); //pin motore
pinMode(_PIN2, OUTPUT); //pin motore
pinMode(_PIN3, OUTPUT); //pin motore
pinMode(_PIN4, OUTPUT); //pin motore
pinMode(cicalino, OUTPUT); //cicalino
//comunicazione seriale
Serial.begin(9600); // inizializzo la comunicazione seriale
Serial.println("Test Sensore DHTxx!");
Serial.println("");
dht.begin(); // inizializzo la comunicazione del sensore
digitalRead (finecorsa);
punto0 = digitalRead(finecorsa);
while (punto0 ==LOW)
{
Serial.println(" azzeramento in corso ");
digitalWrite (cicalino, LOW); //accensione cicalino)
stepper.move (500);
delay (200);
punto0 = digitalRead(finecorsa);
}
stepper.stop ();
digitalWrite (cicalino, HIGH); //spegnimento cicalino
Serial.println(" azzeramento eseguito ");
}
void loop()
{
//float h = dht.readHumidity(); //lettura umidita
float t = dht.readTemperature(); //lettura temperatura
// controllo l'avvenuta comunicazione, ed avvio la scrittuta dei dati sulla seriale, ed in caso negativo scrito che è fallita
if (isnan(t)) {
Serial.println("Errore lettura sensore DHT FALLITA");
} else {
// Serial.print("Temperatura: ");
//Serial.print(t);
//Serial.println(" *C");
}
//Serial.print("Umidita': ");
//Serial.print(h);
//Serial.print(" %\t");
//Serial.print("Temperatura: ");
//Serial.print(t);
//Serial.println(" *C");
//Serial.println("");
// codice per lampeggio
if (blinking) {
currentMillis = millis(); // better to store in variable, for less jitter
if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { // enough time passed yet?
digitalWrite((ledmovimento), !digitalRead((ledmovimento))); // led rosso
digitalWrite((ledstato), !digitalRead((ledmovimento))); //intermittenza led giallo
previousMillis = currentMillis; // sets the time we wait "from"
}
} else {
digitalWrite((ledmovimento), LOW); // spegnimento led rosso
}
int reading = digitalRead(finecorsa);
//delay (50);// delay 50
if (reading==LOW) // condizione a finecorsa non premuto
blinking=true; // start blinking
else
blinking=false; // stop blinking
//fine codice lampeggio
if (digitalRead(startcentrale)==1 and stato==0) //funzione per effetto relè
{
Serial.print("stato=1");
stato=1;
}
else if (digitalRead(riarmo)==1 and stato==1)
{
Serial.print("stato=0");
stato=0;
}
if ((stato != statoprec) && stato == 1) //avviamento motore
{
Serial.print("avviamento motore");
digitalWrite (cicalino, LOW); //accensione cicalino)
stepper.move (-2000);
delay (5);
stepper.move (2000);
stepper.stop ();
statoprec = 1;
digitalWrite (cicalino, HIGH);
}
if (stato==1) //accensione
{
Serial.print("accensione");
if ((digitalRead(finecorsa) ==HIGH) && (stato == 1))
{
digitalWrite(ledstato, HIGH); //accensione led notifica
}
if (t<val) //temperatura di mantenimento
{
digitalWrite (rele, LOW); //accensione relè
}
else
{
digitalWrite (rele, HIGH); //spegnimento relè
}
}
if (stato==0) //riarmo sistema
{
// Serial.print("riarmo sistema");
if ((digitalRead(finecorsa) == HIGH) && (stato == 0))
{
digitalWrite(ledstato, LOW); //spegnimento led notifica
}
digitalWrite(rele, HIGH); //spegnimento relè riscaldamento
statoprec = 0;
}
delay (10);// Delay a little bit to improve simulation performance
}
ho ripulito il codice migliorandolo ancora e risolvendo alcuni bug.
ora il mio unico problema rimane solo la non simultaneità tra il lampeggio dei due led e il motore passopasso in movimento.
se non cè una "scappatoia" pensavo di sostituire il lampeggio con un cicalino PASSIVO.
funziona o torno allo stesso punto dato che ha bisogno di un'uscita PWM?
#include <DHT.h>
#include <StepperMotor.h>
#define DHTPIN 13 // pin di arduino a cui connetto il sensore
#define DHTTYPE DHT11 //definizione modello sensore
DHT dht(DHTPIN, DHTTYPE);
int stato; //per funzione relè
int val=24; // temperatura da mantenere
int temp; //variabile temperatura
int ledstato = 2;
int ledmovimento = 3;
int rele = 4;
int startcentrale = 5;
int finecorsa = 6;
int riarmo = 7;
int _PIN1 = 8; //pin motore
int _PIN2 = 9; //pin motore
int _PIN3 = 10; //pin motore
int _PIN4 = 11; //pin motore
int cicalino = 12; //cicalino
volatile boolean riposo = false;
int punto0 = 0; //variabile per reset motore
int statoprec = 0; //variabile stato precedente
StepperMotor stepper(_PIN1, _PIN2, _PIN3, _PIN4);
//impostazioni per lampeggio
bool blinking = false; //defines when blinking should occur
unsigned long blinkInterval = 150; // number of milliseconds for blink
unsigned long currentMillis; // variables to track millis()
unsigned long previousMillis;
unsigned long tempinterval; //intervallo tra 2 letture di temperatura
void setup()
{
pinMode(startcentrale, INPUT); //pulsante avvio sistema
pinMode(finecorsa, INPUT); //pulsante lampeggio movimento/reset motore
pinMode(riarmo, INPUT); //pulsante riarmo
pinMode(ledstato, OUTPUT); // led stato sistema prenotato
pinMode(rele, OUTPUT); //relè riscaldamento
pinMode(ledmovimento, OUTPUT); //led lampeggio movimento
pinMode(cicalino, OUTPUT); //cicalino
stato=0; //per funzione relè
pinMode(DHTPIN, INPUT); // sensore temperatura
stepper.setPeriod(1);
digitalWrite (rele, HIGH); //stato relè spento ad accensione
digitalWrite (cicalino, HIGH); //stato cicalino spento
pinMode(_PIN1, OUTPUT); //pin motore
pinMode(_PIN2, OUTPUT); //pin motore
pinMode(_PIN3, OUTPUT); //pin motore
pinMode(_PIN4, OUTPUT); //pin motore
tempinterval=millis();
Serial.begin(9600); // inizializzo la comunicazione seriale
dht.begin(); // inizializzo la comunicazione del sensore
digitalRead (finecorsa);
punto0 = digitalRead(finecorsa); //variabile per reset iniziale
while (punto0 ==LOW)
{
Serial.println(" azzeramento in corso ");
digitalWrite (cicalino, LOW); //accensione cicalino)
stepper.move (200);
delay (1);
punto0 = digitalRead(finecorsa);
}
stepper.stop ();
digitalWrite (cicalino, HIGH); //spegnimento cicalino
Serial.println(" azzeramento eseguito ");
}
void loop()
{
currentMillis = millis();
if ((unsigned long)(currentMillis) > tempinterval+5000) {
//float h = dht.readHumidity(); //lettura umidita
temp = dht.readTemperature(); //lettura temperatura
Serial.print("Temperatura: ");
Serial.print(temp);
Serial.println(" *C");
tempinterval=millis();
}
// codice per lampeggio
if (blinking) {
if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { // enough time passed yet?
digitalWrite((ledmovimento), !digitalRead((ledmovimento))); // led rosso
digitalWrite((ledstato), !digitalRead((ledmovimento))); //intermittenza led giallo
previousMillis = currentMillis; // sets the time we wait "from"
}
} else {
digitalWrite((ledmovimento), LOW); // spegnimento led rosso
}
int reading = digitalRead(finecorsa);
if (reading==LOW) // condizione a finecorsa non premuto
blinking=true; // start blinking
else
blinking=false; // stop blinking
//fine codice lampeggio
if (digitalRead(startcentrale)==1 and stato==0) //funzione per effetto relè
{
Serial.print("stato=1");
stato=1;
}
else if (digitalRead(riarmo)==1 and stato==1)
{
Serial.print("stato=0");
stato=0;
}
if ((stato != statoprec) && stato == 1)
{
Serial.print("avviamento motore");
digitalWrite (cicalino, LOW); //accensione cicalino)
stepper.move (-2000);
delay (5);
punto0 = digitalRead(finecorsa); //variabile per battuta finecorsa
while (punto0 ==LOW) // ritorno fino a pressione finecorsa
{
Serial.println(" ritorno in posizione di riposo ");
digitalWrite (cicalino, LOW); //accensione cicalino)
stepper.move (200);
delay (1);
punto0 = digitalRead(finecorsa);
}
stepper.stop ();
digitalWrite (cicalino, HIGH); //spegnimento cicalino
Serial.println(" riposizionamento eseguito ");
statoprec = 1;
}
if (stato==1) //accensione
{
if ((digitalRead(finecorsa) ==HIGH) && (stato == 1))
{
digitalWrite(ledstato, HIGH); //accensione led notifica
}
if (temp<val) //temperatura di mantenimento
{
digitalWrite (rele, LOW); //accensione relè
}
else
{
digitalWrite (rele, HIGH); //spegnimento relè
}
}
if (stato==0) //riarmo sistema
{
if ((digitalRead(finecorsa) == HIGH) && (stato == 0))
{
digitalWrite(ledstato, LOW); //spegnimento led notifica
}
digitalWrite(rele, HIGH); //spegnimento relè riscaldamento
statoprec = 0;
}
delay (10);// Delay a little bit to improve simulation performance
}
Sono sul cell e faccio un po' fatica col codice, però mi sembra di vedere che il motore lo mandi tutto indietro con -2000 e poi avanti un po' per volta con 200 dentro il while... Durante il movimento non piloti i led... Quel pezzo di codice "blocca" il programma fino a quando non hai finito col motore...