problema con sensore arduino

Ciao,
dopo diversi prove, sono qui a chiedere il Vs. aiuto per un problema con un sensore induttivo in una applicazione un pò complessa, arduino rileva correttamente il passaggio da HIGH a LOW, però saltuariamente e senza regolarità rileva anche il passaggio del sensore da LOW ad HIGH, il sensore è circondato da masse metalliche e tutte le masse sono collegate alla massa dell’alimentazione, ho provato il sensore lontano dalle masse metalliche ma il problema continua a presentarsi. Allego lo schema di come ho collegato il sensore, non chiedo la soluzione ma altre prove che potrei fare.

Grazie

/*
distributore
versione del 20150210
 */

//codice sviluppato partendo dal lavoro dei sottoelencati autori
//  Author  : Carlyn Maw, Tom Igoe
//  Notes   : Code for using a CD4021B Shift Register
//  Notes   : Code for using a 74hc595 Shift Register

/*il seguente codice utilizza le funzioni shifout
 e le funzioni shiftin, viene eseguito il controllo dello stato
 dei contatti su shiftin e la memorizzazione
 nei registri di shiftin e riprodotti sui led dalla funzione shiftout
 il led sarà in parallelo alla elettrovalvola
 */

//pin per shiftout
const byte dataPinOUT = 11; //Pin connected to DS of 74HC595 14
const byte latchPinOUT = 10;//Pin connected to ST_CP of 74HC595 12
const byte clockPinOUT = 12;//Pin connected to SH_CP of 74HC595 11
const byte OEPinOUT = 9;//Pin connected to OE of 74HC595 13

//pin per shiftin
const byte dataPinIN = 7;//Pin connected to Q8 of 4021 3
const byte latchPinIN = 6;//Pin connected to P/SC of 4021 9
const byte clockPinIN = 5;//Pin connected to CLOCK of 4021 10

//Define variables to hold the data
//for shift register.
//starting with a non-zero numbers can help troubleshoot
byte switchVar1, switchVar2;
byte Var1, Var2;

int n;//contatore
int ritardo[11] = {
  20, 40, 50, 65, 80, 80, 65, 50, 40, 20, 100
};

volatile byte statosensore1;
byte stato1;

byte pin_out_4 = 4; //pin da collegare al pin_in 4 della scheda della pinza shiftout
byte pin_out_8 = 8; //pin da collegare al pin_in 8 della scheda della pinza shiftout

void setup()
{
  //set pins to output so you can control the shift registers
  //shiftout define pin modes
  pinMode(dataPinOUT, OUTPUT);
  pinMode(latchPinOUT, OUTPUT);
  pinMode(clockPinOUT, OUTPUT);
  pinMode(OEPinOUT, OUTPUT);
  digitalWrite(OEPinOUT, LOW);


  //shiftin define pin modes
  pinMode(dataPinIN, INPUT);
  pinMode(latchPinIN, OUTPUT);
  pinMode(clockPinIN, OUTPUT);

  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, sensore1, FALLING); //sensore induttivo collegato al pin 2

  pinMode(pin_out_4, OUTPUT);
  digitalWrite(pin_out_4, HIGH);
  pinMode(pin_out_8, OUTPUT);
  digitalWrite(pin_out_8, HIGH);

  statosensore1 = 0;  //stato iniziale del sensore
  stato1 = 0;

  n = 0;
  Var1 = B00000000;
  Var2 = B00000000;
  switchVar1 = B00000000;//6_10
  switchVar2 = B00000000;//1_5

  //sezione per shiftout spegne tutti i led
  digitalWrite(latchPinOUT, LOW);                         //Pull latch LOW to start sending data
  shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, B00000000); //Send the data byte 2
  shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, B00000000); //Send the data byte 1
  digitalWrite(latchPinOUT, HIGH);                        //Pull latch HIGH to stop sending data

  delay(1000);
  //Serial.begin(9600);
}

void loop()
{
  //lettura dello stato dei pin in input
    digitalWrite(latchPinIN, HIGH);  //set it to 1 to collect parallel data, wait
    delayMicroseconds(50);
    digitalWrite(latchPinIN, LOW); //set it to 0 to transmit data serially
    //while the shift register is in serial mode
    //collect each shift register into a byte
    //the register attached to the chip comes in first
    switchVar2 = shiftIn(dataPinIN, clockPinIN);//1_5
    switchVar1 = shiftIn(dataPinIN, clockPinIN);//6_10

  //Serial.println(switchVar1, BIN);//6_10
  // Serial.print('\t');
  // Serial.println(switchVar2, BIN);//1_5

  //questa sezione è il cuore e scopo del programma
  //lo shiftin ha memorizzato lo stato dei 10 sensori HIGH o LOW
  //per la verifica della presenza o meno della pianta nel condotto

  if (switchVar1 == B11111111 && switchVar2 == B11111111) //per caricare il distributore al primo giro
  {
    digitalWrite(pin_out_8, LOW);
    digitalWrite(pin_out_4, LOW);
    
    delay(100);

    digitalWrite(pin_out_8, HIGH);
    digitalWrite(pin_out_4, HIGH);
    
    delay(100);
    
    statosensore1 = 0;
  }

  //primo ciclo do per le prime 5 posizioni 1-5
  if (statosensore1 == 1 && n < 5)
  {
    statosensore1 = 0;
    stato1 = 1;
    do
    {
      if (bitRead(switchVar2, n) == 0) //H assente L presente
      {
        delay(ritardo[n]);//ritardo tra una fila e l'altra
        //EV on
        bitWrite(Var2, n, 1);

        digitalWrite(latchPinOUT, LOW);                       //Pull latch LOW to start sending data
        shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, Var1);  //Send the data byte 2
        shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, Var2);    //Send the data byte 1
        digitalWrite(latchPinOUT, HIGH);                      //Pull latch HIGH to stop sending data

        delay(ritardo[10]);  //ritardo per lo scarico della pianta

        //EV off
        digitalWrite(latchPinOUT, LOW);                     //Pull latch LOW to start sending data
        shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, B00000000);  //Send the data byte 2
        shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, B00000000);    //Send the data byte 1
        digitalWrite(latchPinOUT, HIGH);                    //Pull latch HIGH to stop sending data

        Var1 = B00000000;
        Var2 = B00000000;
        //statosensore1 = 0;
        stato1 = 0;
      }
      n++;
    }
    //while (statosensore1 == 1 && n < 5);
    while (stato1 == 1 && n < 5);

    if (n == 5)
    {
      digitalWrite(pin_out_8, LOW);
    }
  }
...

induttivo.pdf (12.9 KB)

Ho provato a compilarlo ma mi da una serie di errori… probabilmente lo sketch che hai messo non è completo… in quello completo hai dichiarato “sensore1”? perchè in questo non lo vedo… inoltre vedo che hai dichiarato il pullup interno sul pin2 ma poi hai messo anche il pullup esterno…

lo sketch è troppo lungo ma la seconda parte del LOOP è simile
ho messo anche un pullup esterno in altre situazioni non mi ha creato problemi consigli di eliminarne uno?

dimenticavo di dire che il fotoaccoppiatore è un 4n35

questo è il sensore
http://www.ebay.it/itm/LJ12A3-4-Z-AX-Inductive-Proximity-Sensor-Detection-Switch-NPN-DC6-36V-/121579119601?pt=LH_DefaultDomain_3&hash=item1c4eae23f1

ho tolto la resistenza di PULLUP esterna, nessun cambiamento
ho collegato la base del foto a massa, nessun cambiamento
ho messo una resistenza da 1M ohm tra base del foto e massa, nessun cambiamento