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;
}