Error en conexión SPI entre ADXL345 y NodeMCU ESP8266

Intente conectar mediante protocolo spi un adxl345 al esp8266 pero no logro obtener resultados.
El esquema de conexión que uso es:

esp8266                     ADXL345
3V3     ---------------->  VCC
GND     ---------------->  GND
D8 (GPIO15) ----------->  CS
D7 (GPIO13) ----------->  SDA (MOSI)
D5 (GPIO14) ----------->  SCL (SCK)
D6 (GPIO12) ----------->  SDO (MISO)

Cuando subo el programa debo desconectar el pin D8 porque de otra forma no carga el programa.
Al desconectar D8 y volver a conectarlo despues de subido el programa tengo el siquiente msj de error:

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

Exception (4):
epc1=0x40201104 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffe50 end: 3fffffd0 offset: 0160
3fffffb0:  3fffdad0 00000000 3ffee738 40202fd4  
3fffffc0:  feefeffe feefeffe 3fffdab0 40101001  
<<<stack<<<

Utilicé la siguiente extension de Exception decoder para buscar el error y obtengo este resultado:
Extension: GitHub - dankeboy36/esp-exception-decoder: ESP8266/ESP32 Exception Decoder Extension for the Arduino IDE

Exception 4: Level1Interrupt: Level-1 interrupt as indicated by set level-1 bits in the INTERRUPT register
PC: 0x40201104: setup() at C:\Users\Usuario\Documents\Arduino\SPISPISPI\SPISPISPI.ino:48
EXCVADDR: 0x00000000

Decoding stack results
0x40202fd4: loop_wrapper() at C:\Users\Usuario\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\cores\esp8266\core_esp8266_main.cpp:255

Si alguien con mayor conocimiento me podría ayudar se lo agradecería jaja
Este es el código:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
 
 #define CS_PIN 2 //GPIO2 es D4

/* Assign a unique ID to this sensor at the same time */
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(SCK, MISO, MOSI, SS, 12345);
 
 
void displayDataRate(void)
{
  Serial.print  ("Data Rate:    "); 
   
  switch(accel.getDataRate())
  {
    case ADXL345_DATARATE_3200_HZ:
      Serial.print  ("3200 "); 
      break;
  }  
  Serial.println(" Hz");  
}
 
void displayRange(void)
{
  Serial.print  ("Range:         +/- "); 
   
  switch(accel.getRange())
  {
    case ADXL345_RANGE_16_G:
      Serial.print  ("16 "); 
      break;
  }  
  Serial.println(" g");  
}
 
void setup(void) 
{
#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif
  Serial.begin(9600);
  Serial.println("Accelerometer Test"); Serial.println("");
   
  /* Initialise the sensor */
  if(!accel.begin())
  {
    /* There was a problem detecting the ADXL345 ... check your connections */
    Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
    while(1);
  }
 
  /* Set the range to whatever is appropriate for your project */
  accel.setRange(ADXL345_RANGE_16_G);
  // accel.setRange(ADXL345_RANGE_8_G);
  // accel.setRange(ADXL345_RANGE_4_G);
  // accel.setRange(ADXL345_RANGE_2_G);
   
     
  /* Display additional settings (outside the scope of sensor_t) */
  displayDataRate();
  displayRange();
  Serial.println("");
}
 
void loop(void) 
{
  /* Get a new sensor event */
  sensors_event_t event; 
  accel.getEvent(&event);
  
  /* Display the results (acceleration is measured in m/s^2) */
  Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("  ");
  Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("  ");
  Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("  ");Serial.println("m/s^2 ");
  delay(500);
}

Se me olvido aclarar que uso la biblioteca de adafruit, basicamente segui los pasos de esta pagina

Adjunta el código que estás utilizando (revisa las Normas del Foro en Español, punto 7) porque sino es difícil ayudarte.

Seguramente hay un lazo while() o algún delay() que provoca el reinicio por WDT, pero sin ver el codigo...

Busca otro CS e indicalo en el código. Como vas a estar desconectando y conectando algo? No tiene mucho sentido.

Hola, gracias por responder. Soy nuevo, este es el código:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
 
/* Assign a unique ID to this sensor at the same time */
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(SCK, MISO, MOSI, SS, 12345);
 
 
void displayDataRate(void)
{
  Serial.print  ("Data Rate:    "); 
   
  switch(accel.getDataRate())
  {
    case ADXL345_DATARATE_3200_HZ:
      Serial.print  ("3200 "); 
      break;
  }  
  Serial.println(" Hz");  
}
 
void displayRange(void)
{
  Serial.print  ("Range:         +/- "); 
   
  switch(accel.getRange())
  {
    case ADXL345_RANGE_16_G:
      Serial.print  ("16 "); 
      break;
  }  
  Serial.println(" g");  
}
 
void setup(void) 
{
#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif
  Serial.begin(9600);
  Serial.println("Accelerometer Test"); Serial.println("");
   
  /* Initialise the sensor */
  if(!accel.begin())
  {
    /* There was a problem detecting the ADXL345 ... check your connections */
    Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
    while(1);
  }
 
  /* Set the range to whatever is appropriate for your project */
  accel.setRange(ADXL345_RANGE_16_G);
  // accel.setRange(ADXL345_RANGE_8_G);
  // accel.setRange(ADXL345_RANGE_4_G);
  // accel.setRange(ADXL345_RANGE_2_G);
   
     
  /* Display additional settings (outside the scope of sensor_t) */
  displayDataRate();
  displayRange();
  Serial.println("");
}
 
void loop(void) 
{
  /* Get a new sensor event */
  sensors_event_t event; 
  accel.getEvent(&event);
  
  /* Display the results (acceleration is measured in m/s^2) */
  Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("  ");
  Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("  ");
  Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("  ");Serial.println("m/s^2 ");
  delay(500);
}

Hola, intenté con D2 y D4 pero obtengo los mismos resultados.

Probá comentando (con // delante) la línea

while();

que está en setup().

Lo acabo de hacer, ahora no aparece ningún error pero la aceleración en los 3 ejes me da cero todo el tiempo

X: 0.00  Y: 0.00  Z: 0.00  m/s^2 
X: 0.00  Y: 0.00  Z: 0.00  m/s^2 
X: 0.00  Y: 0.00  Z: 0.00  m/s^2 
X: 0.00  Y: 0.00  Z: 0.00  m/s^2 

¿No sale "Oops..." en la terminal?

Porque el WDT salta por ese bucle y ese buche se ejecuta cuando no encuentra la placa.

Para mí hay algo mal en la asignación de los pines. ¿Te fijaste que estás usando los mismos que están definidos en MISO, MOSI, etc?

no, ya no hay ningún mensaje de error. Pero el sensor no mide aceleración en ningún eje, voy a ver si cambiando los pines logro alguna medición

Me equivoqué, al presionar rst en el esp8266 hay errores de todas formas y el código se detiene.

11:02:31.079 -> �HPȸ����E�xG�d�2DO��h˃�H���

Probé cambiando el pin d8 y de nuevo error:

11:03:42.723 -> X: 0.00  Y: 0.00  Z: 0.00  m/s^2 
11:03:43.253 -> X: 0.00  Y: 0.00  Z: 0.00  m/s^2 
11:03:43.749 -> Ȥl�kh�$n,4�C��Etx�fJ�E�xG�d�

estos son los nuevos pines

#define SCKpin 14
#define MISOpin 12
#define MOSIpin 13
#define SSpin 4//GPIO 4 D2 CHip Select

/* Assign a unique ID to this sensor at the same time */
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(SCK, MISO, MOSI, SS, 12345);

el error se lo puede ver en el monitor serie a 74880 baudios

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3424, room 16 
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8 
tail 0
chksum 0x2b
csum 0x2b
v000445c0
~ld
rf cal sector: 1020
freq trace enable 0

sin solución hasta el momento

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.