finalmente ci sono riuscito, riposto il codice completo e corretto grazie ai vostri aiuti.
se a qualcuno potrebbe servire almeno lo trova visto che in giro lo vendono a sui 100 euro
//programma lettura pellet nel silos
#include "SevSegShift.h"
#define TRIG_PIN 14 // ingresso A0 di arduino nano utilizzato come ingresso digitale
#define ECHO_PIN 15 // ingresso A1 di arduino nano utilizzato come ingresso digitale
#include <SR04.h>
SR04 sr04 = SR04(ECHO_PIN, TRIG_PIN); //inseriamo un oggetto di tipo SRO4, lo chiamiamo sr04 e gli diamo come parametri i pin utilizzati per TRIG ed ECHO
#define SHIFT_PIN_SHCP 4 // va collegato al 4 di arduino e al 14 del 74HC595
#define SHIFT_PIN_STCP 5 // va collegato al 5 di arduino e al 12 del 74HC595
#define SHIFT_PIN_DS 6 // va collegato al 6 di arduino e al 11 del 74HC595
SevSegShift sevseg(SHIFT_PIN_DS, SHIFT_PIN_SHCP, SHIFT_PIN_STCP);
//led di controllo sensore ultrasuoni
#define ledGreen 7
#define ledYellow 8
#define ledRed 9
//led sensori IR E18-D80NK
#define LedYellowSens 10
#define LedRedSens 11
// Ingresso sensori IR E18-D80NK
#define SensMezzo 2
#define SensFine 3
// variabili Debounce
long t = 0;
long debounce_delay = 2000;
int stato = 1;
// variabili lampeggio led
unsigned long ritardo;
int led = 0;
int pellet;
void setup() {
pinMode (ledGreen, OUTPUT);
pinMode (ledYellow, OUTPUT);
pinMode (ledRed, OUTPUT);
pinMode (LedYellowSens, OUTPUT);
pinMode (LedRedSens, OUTPUT);
pinMode (SensMezzo, INPUT);
pinMode (SensFine, INPUT);
// impostiamo la libreia sevseg con i relativi parametri.
byte numDigits = 4;
byte digitPins[] = {1, 2, 3, 4}; // of ShiftRegister(s) | 8+x (2nd Register)
byte segmentPins[] = {8 + 0, 8 + 1, 8 + 2, 8 + 3, 8 + 4, 8 + 5, 8 + 6, 8 + 7 }; // of Shiftregister(s) | 8+x (2nd Register)
bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_CATHODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = true; // Use 'true' if your decimal point doesn't exist or isn't connected
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
}
void loop() {
static unsigned long timer = millis();
if (millis() - timer >= 1000) { //sfruttando la funzione millis facciamo in modo che ogni 1000 ms dal reset della scheda
timer += 1000; //(o dall'avvio) avvenga una lettura del sensore di distanza
pellet = sr04.Distance();
Display();
}
sevseg.refreshDisplay();
if ((millis() - t) > debounce_delay) { // ritardo lettura sensori
int sens1 = digitalRead(SensMezzo); //sensore a ultrasuoni posto a metà della cassa del pellet
int sens2 = digitalRead(SensFine); //sensore a ultrasuoni posto alla fine della cassa del pellet
t = millis();
switch (stato) { // se i sensori sono tutti e 2 attivi i led sono spenti
case 1:
digitalWrite(LedYellowSens, HIGH);
digitalWrite(LedRedSens, HIGH );
//cambio di stato se:
if (sens1 && !sens2) stato = 2; // se il primo sens1 e spento e il sens2 e attivo si sposta allo stato 2
break;
case 2: // il led giallo e attivo e il led rosso è spento
digitalWrite(LedYellowSens, LOW);
digitalWrite(LedRedSens, HIGH);
//cambio di stato se:
if (sens1 && sens2) stato = 3; // se i sensori sono tutti e 2 spenti si passa allo stato 3
if (!sens2 && !sens1) stato = 1; // se i sensori sono tutti e 2 attivi i led sono spenti e si ritorna allo stato 1
break;
case 3: // il led giallo e spento e il led rosso e acceso lampeggiante
digitalWrite(LedYellowSens, HIGH);
if (millis() - ritardo > 500) {
led = !led; // il valore stato cambia ogni volta che l'if è vero
ritardo = millis(); // azzero il valvore di ritardo
}
digitalWrite(LedRedSens, led); // accendo e spengo il led in funzionae di "stato"
if (sens1 && !sens2) stato = 2; //se il primo sens1 e spento e il sens2 e attivo si sposta allo stato 2
break;
}
}
}
void Display(){
sevseg.setNumber(pellet); // stampiamo la lettura del sensore a ultrasuoni sul display
Serial.print(pellet); // stampiamo la lettura del sensore ad ultrasuoni sul pannello di arduino
Serial.println("cm");
// queste misure possono essere cambiate sostituendo i numeri e metterli a vostro piacere
if (pellet <= 40) { // accendiamo il primo led se la misura è sotto i 40 cm
digitalWrite (ledGreen, LOW);
digitalWrite (ledYellow, HIGH);
digitalWrite (ledRed, HIGH);
}
else if (pellet >= 41 && pellet <= 64) { // tra i 41 e i 64 cm facciamo accendere il secondo led
digitalWrite (ledGreen, HIGH);
digitalWrite (ledYellow, LOW);
digitalWrite (ledRed, HIGH);
}
else if (pellet >= 65) { //dopo i 65 cm facciamo accendere il terzo led
digitalWrite (ledGreen, HIGH);
digitalWrite (ledYellow, HIGH);
digitalWrite (ledRed, LOW);
}
}