Skip to content

Commit

Permalink
Merge branch 'add-raspi-pico-sample-implementation' into 'master'
Browse files Browse the repository at this point in the history
Add raspi pico sample implementation

See merge request MSO-SW/drivers/embedded/embedded-i2c-scd4x!17
  • Loading branch information
psachs committed Apr 30, 2024
2 parents e9c5f96 + 896ff77 commit 2ed88a9
Show file tree
Hide file tree
Showing 3 changed files with 229 additions and 0 deletions.
25 changes: 25 additions & 0 deletions sample-implementations/RaspberryPi_Pico/cMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
cmake_minimum_required(VERSION 3.12)
include(${PICO_SDK_PATH}/pico_sdk_init.cmake)

project(SCD4XSensor C CXX ASM)
pico_sdk_init()

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
add_executable(main
main.c
sensirion_i2c.c
sensirion_i2c.hal.c
scd4x_i2c.c
sensirion_common.c)

# pull in common dependencies and additional i2c hardware support
target_link_libraries(main pico_stdlib hardware_i2c)

pico_enable_stdio_usb(main 1)

pico_enable_stdio_uart(main 0)

# create map/bin/hex file etc.
pico_add_extra_outputs(main)

77 changes: 77 additions & 0 deletions sample-implementations/RaspberryPi_Pico/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@


#include "hardware/i2c.h"
#include "pico/binary_info.h"
#include "pico/stdlib.h"
#include "scd4x_i2c.h"
#include <stdio.h>

/// I2C address
static int addr = 0x62;

// I2C Pins
static uint sda_pin = 16;
static uint scl_pin = 17;

// This is the main entry for your c application. U
// is
int main() {

stdio_init_all();

// Setup I2c using pins 16 & 17
i2c_init(i2c_default, 400 * 1000);
gpio_set_function(PICO_DEFAULT_I2C_SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(PICO_DEFAULT_I2C_SCL_PIN, GPIO_FUNC_I2C);

// This variable will hold the return status of the function calls.
// You can separate each function call result into their own variable or re
// - use this.

int status = 0;

// Stop any readings if occuring
status = scd4x_stop_periodic_measurement();

// Perform self test
uint16_t* selfTest = 0;
scd4x_perform_self_test(selfTest);

// Get Serial number 3 parts
uint16_t one;
uint16_t two;
uint16_t three;

scd4x_get_serial_number(&one, &two, &three);

// Start the readings.
status1 = scd4x_start_periodic_measurement();

while (1) {

// Check if data is ready to read
bool dataReady;
while (dataReady == false) {

status1 = scd4x_get_data_ready_flag(&dataReady);
}

// Get the ticks. The scd4x_read_measurement function is giving
// incorrect data due to the arthimetic
uint16_t co2;
uint16_t temp;
uint16_t humidity;
status1 = scd4x_read_measurement_ticks(&co2, &temp, &humidity);

// Arithemtic to change raw data into information
int tempInCelsius = -45 + 175 * temp / 65536;
int tempInFarenheit = tempInCelsius * 1.8 + 32;
int humidityPercent = 100 * humidity / 65536;

// Print results to terminal (output)
printf("C:%d,T:%d,H:%d", co2, tempInFarenheit, humidityPercent);

// Sleep for 5 seconds.
sleep_ms(5000);
}
}
127 changes: 127 additions & 0 deletions sample-implementations/RaspberryPi_Pico/sensirion_i2c_hal.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
#include <hardware/i2c.h>
/*
* Copyright (c) 2018, Sensirion AG
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of Sensirion AG nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#include "sensirion_common.h"
#include "sensirion_config.h"
#include "sensirion_i2c_hal.h"

/*
* INSTRUCTIONS
* ============
*
* Implement all functions where they are marked as IMPLEMENT.
* Follow the function specification in the comments.
*/

/**
* Select the current i2c bus by index.
* All following i2c operations will be directed at that bus.
*
* THE IMPLEMENTATION IS OPTIONAL ON SINGLE-BUS SETUPS (all sensors on the same
* bus)
*
* @param bus_idx Bus index to select
* @returns 0 on success, an error code otherwise
*/
int16_t sensirion_i2c_hal_select_bus(uint8_t bus_idx) {
/* TODO:IMPLEMENT or leave empty if all sensors are located on one single
* bus
*/
return NOT_IMPLEMENTED_ERROR;
}

/**
* Initialize all hard- and software components that are needed for the I2C
* communication.
*/
void sensirion_i2c_hal_init(void) {
/* TODO:IMPLEMENT */
}

/**
* Release all resources initialized by sensirion_i2c_hal_init().
*/
void sensirion_i2c_hal_free(void) {
/* TODO:IMPLEMENT or leave empty if no resources need to be freed */
}

/**
* Execute one read transaction on the I2C bus, reading a given number of bytes.
* If the device does not acknowledge the read command, an error shall be
* returned.
*
* @param address 7-bit I2C address to read from
* @param data pointer to the buffer where the data is to be stored
* @param count number of bytes to read from I2C and store in the buffer
* @returns 0 on success, error code otherwise
*/
int8_t sensirion_i2c_hal_read(uint8_t address, uint8_t* data, uint16_t count) {
int status = i2c_read_blocking(i2c_default, address, data, count, false);
if (status == 0)
return 1;
else
return 0;
}

/**
* Execute one write transaction on the I2C bus, sending a given number of
* bytes. The bytes in the supplied buffer must be sent to the given address. If
* the slave device does not acknowledge any of the bytes, an error shall be
* returned.
*
* @param address 7-bit I2C address to write to
* @param data pointer to the buffer containing the data to write
* @param count number of bytes to read from the buffer and send over I2C
* @returns 0 on success, error code otherwise
*/
int8_t sensirion_i2c_hal_write(uint8_t address, const uint8_t* data,
uint16_t count) {
// I2C Default is used (I2C0).
int status = i2c_write_blocking(i2c_default, address, data, count, true);

if (status == 0)
return 1;
else
return 0;
}

/**
* Sleep for a given number of microseconds. The function should delay the
* execution for at least the given time, but may also sleep longer.
*
* Despite the unit, a <10 millisecond precision is sufficient.
*
* @param useconds the sleep time in microseconds
*/
void sensirion_i2c_hal_sleep_usec(uint32_t useconds) {
sleep_ms(useconds / 1000);
}

0 comments on commit 2ed88a9

Please sign in to comment.