Autor Tema: Sensor scd30 con pic 18f4550  (Leído 1225 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Alanzapata

  • PIC10
  • *
  • Mensajes: 3
Sensor scd30 con pic 18f4550
« en: 02 de Marzo de 2022, 23:17:38 »
buenas tardes espero se encuentren bien.
estoy tratando de conectar mediante conexion i2c el sensor scd30 a un pic 18f4550 el cual nivel de co2 humedad relativa y temperatura la verdad desconozco totalmente sobre el tema. necesito leer los datos por separado  y guardarlos en una variable y mandarlos a una pantalla nextion mediante rs32 el codigo para mandarle datos a la nextion ya lo tengo, pero desconozco como recibir datos del sensor scd30 el codigo que masones trate de hacer para leer los datos es el siguiente lo hice basandome en el datasheet del siguiente link
https://media.digikey.com/pdf/Data%20Sheets/Sensirion%20PDFs/CD_AN_SCD30_Interface_Description_D1.pdf
agradecería su ayuda

#include <16F877A.h>
#device ADC=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=4MHz)
#use i2c(MASTER, sda=pin_b0, scl=pin_b1)


float datos;

void lectura_continua(){
i2c_start();
i2c_write(0xC2);
i2c_write(0x00);
i2c_write(0x10);
i2c_write(0x00);
i2c_write(0x00);
i2c_write(0x81);
i2c_stop();
i2c_start();
i2c_write(0xC3); // le decimos que vamos a leer
i2c_write(0x00);
i2c_write(0x00);
i2c_write(0x81);
datos= i2c_read();
i2c_stop();

}

void main()
{

   while(TRUE)
   {
      if ((pin_d2)==1){
         lectura_continua();
         
      }
     

   }

}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Sensor scd30 con pic 18f4550
« Respuesta #1 en: 04 de Marzo de 2022, 21:51:10 »
Todo depende de cuando queres leerlo, si deseas que el modulo este continuamente leyendo el ambiente, o cuando vos lo desees.

Estoy mas que seguro que con el último caso sería lo adecuado para vos. Por lo tanto en el datasheet deberias hacer el que dice "Read measurement"

Es decir... Primero escribir para decirle que realice una lectura de los sensores..

Código: C
  1. i2c_start();
  2. i2c_write(0xC2);
  3. i2c_write(0x03);
  4. i2c_write(0x00);
  5. i2c_stop();

Luego un delay mayor a 3ms, o de ultima preguntar por el estado si esta lista la lectura., generemos un delay para que sea mas sencillo.

Código: C
  1. delay_ms(10)

Finalmente leer los datos..
Código: C
  1. i2c_start();
  2. i2c_write(0xC3); // le decimos que vamos a leer
  3.  
  4. // Nivel de CO2
  5. dataco2 = i2c_read() << 24  ;
  6. dataco2 += i2c_read() << 16;
  7. i2c_read(); // El CRC
  8. dataco2 += i2c_read() << 8  ;
  9. dataco2 += i2c_read();
  10. i2c_read(); // El CRC
  11.  
  12. // Temperatura
  13. datatemp = i2c_read() << 24  ;
  14. datatemp += i2c_read() << 16;
  15. i2c_read(); // El CRC
  16. datatemp += i2c_read() << 8  ;
  17. datatemp += i2c_read();
  18. i2c_read(); // El CRC
  19.  
  20. // Humedad
  21. datahum = i2c_read() << 24  ;
  22. datahum += i2c_read() << 16;
  23. i2c_read(); // El CRC
  24. datahum += i2c_read() << 8  ;
  25. datahum += i2c_read();
  26. i2c_read(); // El CRC
  27.  
  28. i2c_stop();
  29.  
  30. concentracionco2 = *(float*)&dataco2;
  31. temperatura = *(float*)&datatemp;
  32. humedad = *(float*)&datahum;


Ademas necesitas darle 2 segundos hasta que el sensor inicie antes de solicitarle alguna conversión.

Modifica el while asi solo se ejecuta una sola vez la lectura... y no muchas veces mientras tengas presionado el botón (el código es para probar):

Código: C
  1. while(TRUE)
  2.    {
  3.       if ((pin_d2)==1){
  4.          while(pin_d2); //Hasta que no suelto no continua.
  5.          lectura_continua();
  6.       }


PD: Seguramente tenga miles de errores, pero es lo que interpreto de la hoja de datos que pasaste.

PD2: El 0xC2 y el 0xC3 es de la direccion 0x61 dezplazada a la izquierda un lugar ( 0xC2 ) y el cuando escribis el LSB esta en 1, por eso queda 0xC3
« Última modificación: 04 de Marzo de 2022, 21:54:02 por KILLERJC »

Desconectado Alanzapata

  • PIC10
  • *
  • Mensajes: 3
Re:Sensor scd30 con pic 18f4550
« Respuesta #2 en: 07 de Marzo de 2022, 20:15:30 »
gracias por tu respuesta habia estado de viaje y no habia podido probar lo el codigo que me pasaste hoy lo probe y no pude hacerlo funcionar pero parece que cuando empieza el primer i2c_start se congela el codigo o algo por el estilo por que despues de esa linea ya no hace nada

#include <16F877A.h>
#device ADC=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=4000000)
#use i2c(MASTER, sda=pin_b0, scl=pin_b1)

# include <lcd.c>
# include <stdint.h>
char concentracionco2,temperatura,humedad;
byte datos;
byte dataco2,datatemp,datahum;
void main()
{
   set_tris_d(0);
   
   while(TRUE)
   {
      set_tris_c(0b11111111);
      lcd_init();
      delay_ms(2000);
      printf(lcd_putc,"hola" );
      delay_ms(500);                         // Le damos un retardo de 500 ms
      lcd_putc("\f");
      printf(lcd_putc,"hola222222" );
      delay_ms(500);                         // Le damos un retardo de 500 ms
      lcd_putc("\f");
      delay_ms(500);   
      output_high(pin_a0);
      delay_ms(100);
      delay_ms(200);
      output_low(pin_a0);
      delay_ms(200);
      i2c_start();
      delay_ms(200);
      i2c_write(0xC2);
      delay_ms(200);
      i2c_write(0x00);
      delay_ms(200);
      i2c_write(0x10);
      delay_ms(200);
      i2c_stop();
      delay_ms(2000);
      i2c_start();
      delay_ms(200);
      i2c_write(0xC3); // le decimos que vamos a leer
      delay_ms(200);
// Nivel de CO2
      dataco2 = i2c_read() << 24  ;
      delay_ms(200);
      dataco2 += i2c_read() << 16;
      delay_ms(200);
      i2c_read(); // El CRC
      delay_ms(200);
      dataco2 += i2c_read() << 8  ;
      delay_ms(200);
      dataco2 += i2c_read();
      delay_ms(200);
      i2c_read(); // El CRC
      delay_ms(200);
      printf(lcd_putc,"hola 2 para co2" );
      delay_ms(200);
      delay_ms(500);                         // Le damos un retardo de 500 ms
      delay_ms(200);
      lcd_putc("\f");
      delay_ms(200);
      delay_ms(500);
// Temperatura
      datatemp = i2c_read() << 24  ;
      datatemp += i2c_read() << 16;
      i2c_read(); // El CRC
      datatemp += i2c_read() << 8  ;
      datatemp += i2c_read();
      i2c_read(); // El CRC
      printf(lcd_putc,"hola3" );
      delay_ms(500);                         // Le damos un retardo de 500 ms
      lcd_putc("\f");
      delay_ms(500);
// Humedad
      datahum = i2c_read() << 24  ;
      datahum += i2c_read() << 16;
      i2c_read(); // El CRC
      datahum += i2c_read() << 8  ;
      datahum += i2c_read();
      i2c_read(); // El CRC
      i2c_stop();
      printf(lcd_putc,"hola444" );
      delay_ms(500);                         // Le damos un retardo de 500 ms
      lcd_putc("\f");
      delay_ms(500);
 
      delay_ms(100);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%2u:%2u:%2u",concentracionco2,temperatura,humedad);
      lcd_gotoxy (1,2);                       //Uvicamos la palabra en la segunda fila y la primera columna
      delay_ms(500);
      printf(lcd_putc,concentracionco2 );
      delay_ms(500);                         // Le damos un retardo de 500 ms
      lcd_putc("\f");
      delay_ms(500);

   }

}
adjunto el codigo
el sensor lo tengo conectado a 3.3 v en vin gnd a tierra y el sel a tierra

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Sensor scd30 con pic 18f4550
« Respuesta #3 en: 07 de Marzo de 2022, 21:11:28 »
Mirando de nuevo:


Citar
Maximal I2C speed is 100 kHz and the master has to support clock stretching

No encuentro como activarlo, es como si estuviera activo el clock strectching y la unica opcion que posee es NO_STRETCH.
Sino fijate de fijar una velocidad menor a 50Khz para el i2C, usando la opcion FAST=nnnnnn (donde nnn son los Hz) en el USE I2C

Hasta ahora es lo unico que se me ocurre que podes probar.

Desconectado Alanzapata

  • PIC10
  • *
  • Mensajes: 3
Re:Sensor scd30 con pic 18f4550
« Respuesta #4 en: 07 de Marzo de 2022, 21:49:00 »
buenas aqui reportando mi principal error era que tenia los pines de scl y sda configurados para b0 y b1  ahora el problema que tengo es que me imprime siempre los mismos valores la verdad no se si sea un error de declaracion de variabales ya que decalaro datahum, dataco2 y datatemp como int y concentracionco2 como int no se si tenga que decalara dataco2 como byte o de alguna otra forma

      delay_ms(100);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"%d"concentracionco2);  // aqui en el lcd imprime un cero
      delay_ms(2000);
      lcd_gotoxy (1,2);                       //
      printf(lcd_putc,"%u,%u,%u"datahum,temperatura,dataco2 ); // aqui en el lcd me imprime 221 , 0, 221
      delay_ms(500);                         //
      lcd_putc("\f");
      delay_ms(500);

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Sensor scd30 con pic 18f4550
« Respuesta #5 en: 08 de Marzo de 2022, 17:57:03 »
Al comienzo son INT de 32 bits... me refiero por ejemplo datatemp.

Y luego son float, me refiero a temperatura, humedad.