Problematiche con millis() per time out

Ciao a tutti!
Sto scrivendo da qualche giorno un codice che andrà a dare vita a una piccola macchina per applicare etichette.
Si tratta sostanzialmente di 3 input, il primo la maggior parte delle volte resta schiacciato, e darà l’input al modulo relè, il secondo per leggere il passaggio dell’etichetta che mi ferma il motore, e il terzo per fare un avanzamento dell’etichetta senza avere per forza un oggetto a cui debba venire applicata una etichetta. Insieme a tutto questo ho collegato un lcd i2c, e fino a qui tutto bene.
Il problema è quando voglio introdurre un timeout secondo il quale, passati 3000ms dall’avviamento del motore mi dia un errore e fermi il motore, con una scritta errore sull’LCD.
Ho provato e riprovato, ma non mi pare di capire dove sta il mio errore.
Inoltre, visto che sono proprio un principiante, se avete suggerimenti su come rendere il codice più funzionale (a me sembra funzioni tutto eccetto millis()) sarei più che felice in modo tale da poter migliorare!!

<#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define I2C_ADDR 0X27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

#define PULSANTI 2
#define MOTORE 13
#define MICROSTOP 3
#define JOG 4

int val = LOW;
int vecchio_val = LOW;

int val2= LOW;
int vecchio_val2 = LOW;

int val3 = LOW;
int vecchio_val3 = LOW;

int n=0;
int stato=0;

unsigned long prevMillis = 0;
unsigned long interval = 2000;

LiquidCrystal_I2C LCD(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

void setup(){
pinMode(PULSANTI, INPUT);
pinMode(MICROSTOP, INPUT);
pinMode(MOTORE,OUTPUT);
pinMode(JOG,INPUT);

LCD.begin(16,2);
LCD.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
LCD.setBacklight(HIGH);
LCD.home();
LCD.setCursor(3,0);
LCD.print(“AREADERMA”);
delay(1000);
LCD.setCursor(3,1);
LCD.print(“PROTOTIPO”);
delay(1000);
LCD.clear();

}

void loop(){
LCD.setCursor(0,0);
LCD.print("Etichette ");
LCD.print(n);

val = digitalRead(PULSANTI);

if ((val == HIGH) && (vecchio_val == LOW)){ 
prevMillis = millis();
digitalWrite(MOTORE,HIGH); 
n++;
stato = 1;
}   
vecchio_val = val;  

if (( stato==1) && (millis()-prevMillis>=interval))
{

digitalWrite(MOTORE,LOW);
LCD.clear();
LCD.setCursor(0,0);
LCD.print(“ERRORE ETICHETTE”);
LCD.setCursor(1,1);
LCD.print("…attendere…");
stato=0;
delay(5000);
LCD.clear();
}

val2=digitalRead(MICROSTOP);

if ((val2 == HIGH) && (vecchio_val2 == LOW)){
delay(10);
stato=0;
Serial.print("Stato: ");
Serial.println(stato);
digitalWrite(MOTORE, LOW);
}

vecchio_val2 = val2;

val3 = digitalRead(JOG);

if ((val3 == HIGH) && (vecchio_val3 == LOW)){
stato=0;
delay(10);
digitalWrite (MOTORE,HIGH);
n++;
}
vecchio_val3 = val3;
}

C’è un errore nella seconda if. Invece di = dovresti usare ==

EDIT: dimenticavo, il codice mettilo direttamente nel post usando i tag CODE. è più semplice consultarlo.

1 Like

cavolo non me ne ero proprio accorto!!! Adesso funziona!! Secondo te, che funzione posso usare per far si che per uscire dall’errore devo premere un tasto? Ho sentito dell’interrupt ma non so se faccia al caso mio`

Per cortesia metti il codice dentro al post con gli appositi tag (bottone </> nella barra).
Non sono al pc di casa e faccio fatica a scaricare / leggere l’allegato.

1 Like

Scusa non avevo mai postato codici, cosi funziona?

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0X27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define PULSANTI 2                  
#define MOTORE 13
#define MICROSTOP 3
#define JOG 4
int val = LOW;                  
int vecchio_val = LOW;          
int val2= LOW;
int vecchio_val2 = LOW;
int val3 = LOW;
int vecchio_val3 = LOW; 
int n=0;
int stato=0;
unsigned long prevMillis = 0; 
unsigned long interval = 2000; 
LiquidCrystal_I2C LCD(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
void setup(){
  pinMode(PULSANTI, INPUT);       
  pinMode(MICROSTOP, INPUT); 
  pinMode(MOTORE,OUTPUT);
  pinMode(JOG,INPUT);
  LCD.begin(16,2);
  LCD.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  LCD.setBacklight(HIGH);
  LCD.home();
  LCD.setCursor(3,0);
  LCD.print("AREADERMA");
  delay(1000);
  LCD.setCursor(3,1);
  LCD.print("PROTOTIPO");
  delay(1000);
  LCD.clear();
}

void loop(){
    LCD.setCursor(0,0);
    LCD.print("Etichette ");
    LCD.print(n);
   
    val = digitalRead(PULSANTI);   

    
   if ((val == HIGH) && (vecchio_val == LOW)){ 
    prevMillis = millis();
    digitalWrite(MOTORE,HIGH); 
    n++;
    stato = 1;
    }   
    vecchio_val = val;  
    
  if  (( stato==1) && (millis()-prevMillis>=interval))
   {
    digitalWrite(MOTORE,LOW);
   LCD.clear();
   LCD.setCursor(0,0);
   LCD.print("ERRORE ETICHETTE");
   LCD.setCursor(1,1);
   LCD.print("...attendere...");
   stato=0;
   delay(5000);
   LCD.clear();
   }   
 val2=digitalRead(MICROSTOP);
  
  if ((val2 == HIGH) && (vecchio_val2 == LOW)){  
    delay(10);
    stato=0;
    Serial.print("Stato: ");
    Serial.println(stato);
    digitalWrite(MOTORE, LOW);       
  }   
   vecchio_val2 = val2;  
    val3 = digitalRead(JOG);
    if ((val3 == HIGH) && (vecchio_val3 == LOW)){
    stato=0;
    delay(10);
    digitalWrite (MOTORE,HIGH);
    n++; 
 }
  vecchio_val3 = val3;
 }

EDIT ecco sistemati!

Non tutto il codice è dentro i tag code.

NO, funziona come ho fatto ora io nel tuo post …

In pratica devi inserire il codice, selezionarlo tutto e poi usare il bottone </> che da solo lo mette nel formato giusto … NON devi mettere tu a mano < e > !!!

Guglielmo

1 Like