久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5150|回復: 8
打印 上一主題 下一主題
收起左側(cè)

全網(wǎng)首發(fā)SCD40二氧化碳傳感器源程序

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:397211 發(fā)表于 2022-1-11 16:56 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本程序芯片為STM32F103C8T6,使用HAL庫,通過官方的庫GITHUP移植而來,源代碼可以到GITHUP中搜索SCD40。
此模塊因為有速度要求,每5秒刷新一次數(shù)據(jù),所以都懂的。


單片機源程序如下:
  1. #include "scd4x_i2c.h"
  2. #include "sensirion_common.h"
  3. #include "sensirion_i2c.h"
  4. #include "sensirion_i2c_hal.h"

  5. #define SCD4X_I2C_ADDRESS 98

  6. int16_t scd4x_start_periodic_measurement() {
  7.     int16_t error;
  8.     uint8_t buffer[2];
  9.     uint16_t offset = 0;
  10.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x21B1);

  11.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  12.     if (error) {
  13.         return error;
  14.     }
  15.     sensirion_i2c_hal_sleep_usec(1000);
  16.     return NO_ERROR;
  17. }

  18. int16_t scd4x_read_measurement_ticks(uint16_t* co2, uint16_t* temperature,
  19.                                      uint16_t* humidity) {
  20.     int16_t error;
  21.     uint8_t buffer[9];
  22.     uint16_t offset = 0;
  23.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0xEC05);

  24.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  25.     if (error) {
  26.         return error;
  27.     }

  28. //    sensirion_i2c_hal_sleep_usec(1000);

  29.     error = sensirion_i2c_read_data_inplace(SCD4X_I2C_ADDRESS, &buffer[0], 6);
  30.     if (error) {
  31.         return error;
  32.     }
  33.     *co2 = sensirion_common_bytes_to_uint16_t(&buffer[0]);
  34.     *temperature = sensirion_common_bytes_to_uint16_t(&buffer[2]);
  35.     *humidity = sensirion_common_bytes_to_uint16_t(&buffer[4]);
  36.     return NO_ERROR;
  37. }
  38. //需要5秒才能再次調(diào)用,傳感器的響應(yīng)時間為5秒
  39. int16_t scd4x_read_measurement(uint16_t* co2, int32_t* temperature_m_deg_c,
  40.                                int32_t* humidity_m_percent_rh) {
  41.     int16_t error;
  42.     uint16_t temperature;
  43.     uint16_t humidity;
  44.     error = scd4x_read_measurement_ticks(co2, &temperature, &humidity);
  45.     if (error) {
  46.         return error;
  47.     }
  48. #if 1
  49.     *temperature_m_deg_c = ((21875 * (int32_t)temperature) >> 13) - 45000;
  50.     *humidity_m_percent_rh = ((12500 * (int32_t)humidity) >> 13);
  51. #else
  52.     *temperature_m_deg_c = ((175000 * (int32_t)temperature) >> 15) - 45000;
  53.     *humidity_m_percent_rh = ((100000 * (int32_t)humidity) >> 15);
  54. #endif
  55.     return NO_ERROR;
  56. }

  57. //int16_t scd4x_stop_periodic_measurement() {
  58. //    int16_t error;
  59. //    uint8_t buffer[2];
  60. //    uint16_t offset = 0;
  61. //    offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x3F86);

  62. //    error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  63. //    if (error) {
  64. //        return error;
  65. //    }
  66. //    sensirion_i2c_hal_sleep_usec(500000);
  67. //    return NO_ERROR;
  68. //}

  69. int16_t scd4x_get_temperature_offset_ticks(uint16_t* t_offset) {
  70.     int16_t error;
  71.     uint8_t buffer[3];
  72.     uint16_t offset = 0;
  73.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x2318);

  74.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  75.     if (error) {
  76.         return error;
  77.     }

  78.     sensirion_i2c_hal_sleep_usec(1000);

  79.     error = sensirion_i2c_read_data_inplace(SCD4X_I2C_ADDRESS, &buffer[0], 2);
  80.     if (error) {
  81.         return error;
  82.     }
  83.     *t_offset = sensirion_common_bytes_to_uint16_t(&buffer[0]);
  84.     return NO_ERROR;
  85. }

  86. int16_t scd4x_get_temperature_offset(int32_t* t_offset_m_deg_c) {
  87.     int16_t error;
  88.     uint16_t t_offset;

  89.     error = scd4x_get_temperature_offset_ticks(&t_offset);
  90.     if (error) {
  91.         return error;
  92.     }
  93.     *t_offset_m_deg_c = ((21875 * (int32_t)t_offset) >> 13);
  94.     return NO_ERROR;
  95. }

  96. int16_t scd4x_set_temperature_offset_ticks(uint16_t t_offset) {
  97.     int16_t error;
  98.     uint8_t buffer[5];
  99.     uint16_t offset = 0;
  100.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x241D);

  101.     offset = sensirion_i2c_add_uint16_t_to_buffer(&buffer[0], offset, t_offset);

  102.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  103.     if (error) {
  104.         return error;
  105.     }
  106.     sensirion_i2c_hal_sleep_usec(1000);
  107.     return NO_ERROR;
  108. }

  109. int16_t scd4x_set_temperature_offset(int32_t t_offset_m_deg_c) {
  110.     uint16_t t_offset = (uint16_t)((t_offset_m_deg_c * 12271) >> 15);
  111.     return scd4x_set_temperature_offset_ticks(t_offset);
  112. }

  113. int16_t scd4x_get_sensor_altitude(uint16_t* sensor_altitude) {
  114.     int16_t error;
  115.     uint8_t buffer[3];
  116.     uint16_t offset = 0;
  117.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x2322);

  118.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  119.     if (error) {
  120.         return error;
  121.     }

  122.     sensirion_i2c_hal_sleep_usec(1000);

  123.     error = sensirion_i2c_read_data_inplace(SCD4X_I2C_ADDRESS, &buffer[0], 2);
  124.     if (error) {
  125.         return error;
  126.     }
  127.     *sensor_altitude = sensirion_common_bytes_to_uint16_t(&buffer[0]);
  128.     return NO_ERROR;
  129. }

  130. int16_t scd4x_set_sensor_altitude(uint16_t sensor_altitude) {
  131.     int16_t error;
  132.     uint8_t buffer[5];
  133.     uint16_t offset = 0;
  134.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x2427);

  135.     offset = sensirion_i2c_add_uint16_t_to_buffer(&buffer[0], offset,
  136.                                                   sensor_altitude);

  137.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  138.     if (error) {
  139.         return error;
  140.     }
  141.     sensirion_i2c_hal_sleep_usec(1000);
  142.     return NO_ERROR;
  143. }

  144. int16_t scd4x_set_ambient_pressure(uint16_t ambient_pressure) {
  145.     int16_t error;
  146.     uint8_t buffer[5];
  147.     uint16_t offset = 0;
  148.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0xE000);

  149.     offset = sensirion_i2c_add_uint16_t_to_buffer(&buffer[0], offset,
  150.                                                   ambient_pressure);

  151.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  152.     if (error) {
  153.         return error;
  154.     }
  155.     sensirion_i2c_hal_sleep_usec(1000);
  156.     return NO_ERROR;
  157. }

  158. int16_t scd4x_perform_forced_recalibration(uint16_t target_co2_concentration,
  159.                                            uint16_t* frc_correction) {
  160.     int16_t error;
  161.     uint8_t buffer[5];
  162.     uint16_t offset = 0;
  163.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x362F);

  164.     offset = sensirion_i2c_add_uint16_t_to_buffer(&buffer[0], offset,
  165.                                                   target_co2_concentration);

  166.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  167.     if (error) {
  168.         return error;
  169.     }

  170.     sensirion_i2c_hal_sleep_usec(400000);

  171.     error = sensirion_i2c_read_data_inplace(SCD4X_I2C_ADDRESS, &buffer[0], 2);
  172.     if (error) {
  173.         return error;
  174.     }
  175.     *frc_correction = sensirion_common_bytes_to_uint16_t(&buffer[0]);
  176.     return NO_ERROR;
  177. }

  178. int16_t scd4x_get_automatic_self_calibration(uint16_t* asc_enabled) {
  179.     int16_t error;
  180.     uint8_t buffer[3];
  181.     uint16_t offset = 0;
  182.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x2313);

  183.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  184.     if (error) {
  185.         return error;
  186.     }

  187.     sensirion_i2c_hal_sleep_usec(1000);

  188.     error = sensirion_i2c_read_data_inplace(SCD4X_I2C_ADDRESS, &buffer[0], 2);
  189.     if (error) {
  190.         return error;
  191.     }
  192.     *asc_enabled = sensirion_common_bytes_to_uint16_t(&buffer[0]);
  193.     return NO_ERROR;
  194. }

  195. int16_t scd4x_set_automatic_self_calibration(uint16_t asc_enabled) {
  196.     int16_t error;
  197.     uint8_t buffer[5];
  198.     uint16_t offset = 0;
  199.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x2416);

  200.     offset =
  201.         sensirion_i2c_add_uint16_t_to_buffer(&buffer[0], offset, asc_enabled);

  202.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  203.     if (error) {
  204.         return error;
  205.     }
  206.     sensirion_i2c_hal_sleep_usec(1000);
  207.     return NO_ERROR;
  208. }

  209. int16_t scd4x_start_low_power_periodic_measurement() {
  210.     uint8_t buffer[2];
  211.     uint16_t offset = 0;
  212.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x21AC);

  213.     return sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  214. }

  215. int16_t scd4x_get_data_ready_status(uint16_t* data_ready) {
  216.     int16_t error;
  217.     uint8_t buffer[3];
  218.     uint16_t offset = 0;
  219.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0xE4B8);

  220.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  221.     if (error) {
  222.         return error;
  223.     }

  224.     sensirion_i2c_hal_sleep_usec(1000);

  225.     error = sensirion_i2c_read_data_inplace(SCD4X_I2C_ADDRESS, &buffer[0], 2);
  226.     if (error) {
  227.         return error;
  228.     }
  229.     *data_ready = sensirion_common_bytes_to_uint16_t(&buffer[0]);
  230.     return NO_ERROR;
  231. }

  232. int16_t scd4x_persist_settings() {
  233.     int16_t error;
  234.     uint8_t buffer[2];
  235.     uint16_t offset = 0;
  236.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x3615);

  237.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  238.     if (error) {
  239.         return error;
  240.     }
  241.     sensirion_i2c_hal_sleep_usec(800000);
  242.     return NO_ERROR;
  243. }

  244. int16_t scd4x_get_serial_number(uint16_t* serial_0, uint16_t* serial_1,
  245.                                 uint16_t* serial_2) {
  246.     int16_t error;
  247.     uint8_t buffer[9];
  248.     uint16_t offset = 0;
  249.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x3682);

  250.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  251.     if (error) {
  252.         return error;
  253.     }

  254.     sensirion_i2c_hal_sleep_usec(1000);

  255.     error = sensirion_i2c_read_data_inplace(SCD4X_I2C_ADDRESS, &buffer[0], 6);
  256.     if (error) {
  257.         return error;
  258.     }
  259.     *serial_0 = sensirion_common_bytes_to_uint16_t(&buffer[0]);
  260.     *serial_1 = sensirion_common_bytes_to_uint16_t(&buffer[2]);
  261.     *serial_2 = sensirion_common_bytes_to_uint16_t(&buffer[4]);
  262.     return NO_ERROR;
  263. }

  264. int16_t scd4x_perform_self_test(uint16_t* sensor_status) {
  265.     int16_t error;
  266.     uint8_t buffer[3];
  267.     uint16_t offset = 0;
  268.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x3639);

  269.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  270.     if (error) {
  271.         return error;
  272.     }

  273.     sensirion_i2c_hal_sleep_usec(10000000);

  274.     error = sensirion_i2c_read_data_inplace(SCD4X_I2C_ADDRESS, &buffer[0], 2);
  275.     if (error) {
  276.         return error;
  277.     }
  278.     *sensor_status = sensirion_common_bytes_to_uint16_t(&buffer[0]);
  279.     return NO_ERROR;
  280. }

  281. int16_t scd4x_perform_factory_reset() {
  282.     int16_t error;
  283.     uint8_t buffer[2];
  284.     uint16_t offset = 0;
  285.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x3632);

  286.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  287.     if (error) {
  288.         return error;
  289.     }
  290.     sensirion_i2c_hal_sleep_usec(800000);
  291.     return NO_ERROR;
  292. }

  293. int16_t scd4x_reinit() {
  294.     int16_t error;
  295.     uint8_t buffer[2];
  296.     uint16_t offset = 0;
  297.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x3646);

  298.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  299.     if (error) {
  300.         return error;
  301.     }
  302.     sensirion_i2c_hal_sleep_usec(20000);
  303.     return NO_ERROR;
  304. }

  305. int16_t scd4x_measure_single_shot() {
  306.     int16_t error;
  307.     uint8_t buffer[2];
  308.     uint16_t offset = 0;
  309.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x219D);

  310.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  311.     if (error) {
  312.         return error;
  313.     }
  314.     sensirion_i2c_hal_sleep_usec(5000000);
  315.     return NO_ERROR;
  316. }

  317. int16_t scd4x_measure_single_shot_rht_only() {
  318.     int16_t error;
  319.     uint8_t buffer[2];
  320.     uint16_t offset = 0;
  321.     offset = sensirion_i2c_add_command_to_buffer(&buffer[0], offset, 0x2196);

  322.     error = sensirion_i2c_write_data(SCD4X_I2C_ADDRESS, &buffer[0], offset);
  323.     if (error) {
  324.         return error;
  325.     }
  326.     sensirion_i2c_hal_sleep_usec(50000);
  327.     return NO_ERROR;
  328. }


復制代碼

以上11個文件下載,請自行加入到您的工程中:
SCD4xco2.zip (24.32 KB, 下載次數(shù): 131)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1023701 發(fā)表于 2022-5-4 13:06 | 只看該作者
你的最終數(shù)據(jù)變量是哪一個啊 可不可以給一下main.c的代碼 求求了
回復

使用道具 舉報

板凳
ID:1024381 發(fā)表于 2022-5-6 18:50 | 只看該作者
謝謝,正需要,調(diào)試。官方Git下載的運行不正常
回復

使用道具 舉報

地板
ID:397211 發(fā)表于 2022-6-2 17:04 | 只看該作者
北道無轍 發(fā)表于 2022-5-4 13:06
你的最終數(shù)據(jù)變量是哪一個啊 可不可以給一下main.c的代碼 求求了

我這個是官方移植的
回復

使用道具 舉報

5#
ID:397211 發(fā)表于 2022-6-2 17:05 | 只看該作者
ws51dhy 發(fā)表于 2022-5-6 18:50
謝謝,正需要,調(diào)試。官方Git下載的運行不正常

我這個是叫我們傳感器廠商移植的,采樣時間在5秒一次才不會出現(xiàn)問題
回復

使用道具 舉報

6#
ID:667696 發(fā)表于 2022-9-28 16:28 | 只看該作者
謝謝,正需要,調(diào)試
回復

使用道具 舉報

7#
ID:667696 發(fā)表于 2022-10-10 11:46 | 只看該作者
上面SCD的MAIN.c有嗎?能不能一起發(fā)出來一下
回復

使用道具 舉報

8#
ID:272926 發(fā)表于 2023-8-18 14:12 | 只看該作者
拿官方的代碼有什么意義? CO2的值都是1000多,哪個能準嗎
回復

使用道具 舉報

9#
ID:162723 發(fā)表于 2023-10-25 17:54 | 只看該作者
謝謝,正好需要,官方的例子調(diào)了一下午沒調(diào)通
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人午夜免费在线视频 | 中文字幕黄色大片 | 中文字幕 亚洲一区 | 在线成人免费视频 | 999久久久久久久久6666 | 久久成人精品视频 | 天天爽一爽 | 日韩精品在线免费观看 | 亚洲精品一区二区在线观看 | 精品国产乱码一区二区三区a | 99福利网 | 91综合网| 麻豆久久久 | 国产午夜精品久久久 | 九九热这里只有精品6 | 色橹橹欧美在线观看视频高清 | 日韩在线免费视频 | 黄色av网站在线免费观看 | 亚洲欧美在线免费观看 | 久久乐国产精品 | 成人av在线播放 | 成人在线不卡 | 免费看一区二区三区 | 久久久久久久91 | 91久久久久久久久久久久久 | 久久av一区二区三区 | 四虎成人免费电影 | 久热伊人 | 国产一区二区三区色淫影院 | 91精品国产一区二区在线观看 | 国产高清在线观看 | caoporn地址 | 日韩精品一区二区三区中文在线 | 欧美一区二区三区在线看 | 二区三区视频 | 国产精品一区视频 | 日韩欧美国产成人一区二区 | 久久99蜜桃综合影院免费观看 | 久久高清精品 | 国产高清在线精品一区二区三区 | 欧洲精品码一区二区三区免费看 |