Lo strano caso del "Soffio"

Buongiorno a tutti, voglio parlarvi e magari cercare di capire lo strano problema che si presenta nel circuitino che ho realizzato.
Stiamo parlando di un progettino abbastanza semplice, formato da un MPU6050 e un AtTiny che legge la posizione del sensore. Il funzionamento è paragonabile ad un antifurto che memorizza la posizione (inclinazione), e se il sensore viene inclinato più di un tot, fa scattare un relè.

Dopo aver creato un prototipo sulla breadboard, ho creato attraverso easyeda un pcb, di cui allego il circuito elettrico e sketch dell’attiny.
Arrivato il pcb, saldato il tutto ho giusto verificato se funzionasse correttamente.
Mi è capitato di soffiare sopra il sensore perchè c’era un po’ di polvere e FATTO STRANO, è scattato il relè :o :o
Ed è proprio questo il fatto strano, basta soffiare sul MPU (con forza) e il relè scatta, come se il sensore venisse inclinato.
L’Attiny e l’MPU utilizzano il protocollo i2C con resistenze di pull-up da 4k7 e sono distanti circa 10cm.

Allora per fare un test, ho collegato l’MPU ad un arduino uno, lasciando l’mpu nel pcb ed effettivamente se ci soffio sopra, ottengo dal sensore una lettura di un movimento quindi come se in quell’istante avessi spostato/inclinato l’mpu. A parer mio, il problema sembra essere hardware.

Com’è possibile? :o Vi è mai capitato qualcosa di simile?
La stessa cosa accade se “punzecchio” con il puntale del tester, il pin 5V del MPU.
Il mio obiettivo è quello di creare un circuito affidabile, e non che basti soffiarci sopra per crea un falso
positivo.

link immagine

#include <TinyWireS.h>
#include <TinyWireM.h>

const byte MPU = 0x68;//0x53
const byte pin_allarme = 1;
const byte I1 = 3;
const byte I2 = 4;
unsigned long int t_acce, t_attesa, t_suono;
char comando[9] = {0};
unsigned int k = 0;
int att_x = 0;
int att_y = 0;
int AcX = 0;
int AcY = 0;
uint8_t val_pin3 = 0, val_pin4 = 0;
bool allerta = false, attesa = false;
 
void setup()
{
  TinyWireM.begin();
  TinyWireM.beginTransmission(MPU);
  TinyWireM.send(0x6B);
  TinyWireM.send(0);
  TinyWireM.endTransmission();

  pinMode(I1,INPUT);
  pinMode(I2,INPUT);
  pinMode(pin_allarme,OUTPUT);
  digitalWrite(pin_allarme,LOW);
  t_acce = t_attesa = t_suono = 0;  
}
  
void loop() 
{
  val_pin3 = digitalRead(I1);
  val_pin4 = digitalRead(I2);
  if( (val_pin3 == 1) && (val_pin4 == 1) )
  {
    if(!allerta && !attesa)
    {
      attesa = true;
      t_attesa = millis();
    }
  }
  else if( (val_pin3 == 0) && (val_pin4 == 0) )
  {
    allerta = attesa = false;
    digitalWrite(pin_allarme,LOW);
  }
  
  if(attesa && (t_attesa + 8000 < millis()))
  {
    if(!allerta)
    {
      salva_posizione();
      allerta = true;
      attesa = false;
      t_attesa = millis();
    }
  }
  else if(attesa)
  {
    if(millis() - t_suono > 2000)
    {
      t_suono = millis();
    }
  }

  if(allerta && (millis() - t_acce > 700))
  {
    Motion();
    if((AcX > (att_x + 30) || AcX < (att_x - 30) ) ||  (AcY > (att_y + 30) || AcY < (att_y - 30)) )
    {
      digitalWrite(pin_allarme, HIGH);
    }
    t_acce = millis();
  }
    // This needs to be here
    TinyWireS_stop_check();
    delay(100);
}

void Motion()
{
  TinyWireM.beginTransmission(MPU);
  TinyWireM.send(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(MPU,14);
  AcX = (TinyWireM.receive()<<8|TinyWireM.receive()) / 55;  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY = (TinyWireM.receive()<<8|TinyWireM.receive()) / 55;  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  TinyWireM.receive()<<8|TinyWireM.receive();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  TinyWireM.receive()<<8|TinyWireM.receive();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  TinyWireM.receive()<<8|TinyWireM.receive();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  TinyWireM.receive()<<8|TinyWireM.receive();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  TinyWireM.receive()<<8|TinyWireM.receive();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  AcX = ((AcX < 0) ? -AcX : AcX);
  AcY = ((AcY < 0) ? -AcY : AcY);
}

void salva_posizione()
{
  delay(130);
  TinyWireM.beginTransmission(MPU);
  TinyWireM.send(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(MPU,14);
  att_x = (TinyWireM.receive()<<8|TinyWireM.receive()) / 55;  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  att_y = (TinyWireM.receive()<<8|TinyWireM.receive()) / 55;  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  TinyWireM.receive()<<8|TinyWireM.receive();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  TinyWireM.receive()<<8|TinyWireM.receive();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  TinyWireM.receive()<<8|TinyWireM.receive();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  TinyWireM.receive()<<8|TinyWireM.receive();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  TinyWireM.receive()<<8|TinyWireM.receive();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  att_x = ((att_x < 0) ? -att_x : att_x);
  att_y = ((att_y < 0) ? -att_y : att_y);
}

Questo è lo screen di easy eda, del pcb relativo al MPU
PCB

Il pcb contiene altra roba, non so se postare l'intera foto o basta la parte relativa al mpu

Questo è il PCB Completo

Ho provato anche a saldare un condensatore da 10uF proprio ai pin +5 e Gnd del mpu, ma niente da fare. Nel pcb sono stato attento a non creare dei ground-loop e il relè l'ho messo più lontano possibile dal attiny. C'è qualche altra accortezza che dovevo prendere per evitare il fatto strano che si presenta?

Scusa ma la MPU non è il singolo chip, ma un modulino già montato ? Posta pure link a dove l'hai comprato.
Se è un modulino, lo puoi collegare alla uno senza pcb, il soffio da ancora problemi ?

Leggendo il datasheet (purtroppo in inglese) si leggono delle avvertenze su come sistemare la mcu su un pcb (il singolo chip). Ma sono un softwarista.

Si scusami, l' MPU che intendo è un modulo su cui è installato il chip MPU6050

Questo modulo era nel kit che ho comprato anni fa, quindi il link non ce l'ho.
Però questa è un sua foto

Se riesco nel pomeriggio faccio una prova a collegare questo modulo sulla breadboard con arduino uno e vedo che succede

Ho appena collegato il modulo MPU6050 sulla breadboard caricando lo stesso sketch, e il probema del soffio o se punzecchio il pin 5V non si presenta. Credo allora che il problema sia il pcb, ma dove?

Azzaro. Il modulino ha già le resistenze di pullup i2c, tu ne hai messe altre ?

Si vero, ho messo delle altre resistente di pull-up, non mi ero accorto che il modulino ce le avesse già.

Comunque ho subito dissaldato le resistenze in più dal pcb e ho fatto una prova, e niente da fare, stesso problema di prima