This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Interfacing nRF52832 with ds18b20

Hello guys,

                 I'm trying to interface nrf52832 with ds18b20 temperature sensor and I'm using this code https://github.com/sigurdnev/Nordic-DS18B20 and I'm getting the output value but sometimes I'm getting temperature value as -0.063 and sometimes some random values I'm completely new to nRF so I don't know what I'm doing wrong

Parents Reply Children
  • How does your main.c file look like? is it 100% the same as the example main.c ?

    The example is very basic, and in a normal application, you likely want to trigger the reading in a app_timer callback so that the GPIO reading happens at a higher priority level, so that it's not preempted by other interrupts.

  • Hi,

    After your suggestion I added app_timer in the main.c  but I'm getting an error, I have added the images of the main code and the error I got, Can you tell why I'm  doing wrong

  • From the screenshots, it looks like you used the example from github(without modification) when you experienced this issue. In that case, there should not be any interrupts happening, that could cause the GPIO reading/writing timing to fail. You could try to start the HFCLK from the crystal oscillator, and see if that makes any difference. Also check the wiring to the sensor, and make sure they are all properly connected.

      // Start HFCLK from crystal oscillator
      NRF_CLOCK->TASKS_HFCLKSTART = 1;
      while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);

  • Ok this is what I have tried, and this is my main.c

    /**
     * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA
     * 
     * All rights reserved.
     * 
     * Redistribution and use in source and binary forms, with or without modification,
     * are permitted provided that the following conditions are met:
     * 
     * 1. Redistributions of source code must retain the above copyright notice, this
     *    list of conditions and the following disclaimer.
     * 
     * 2. Redistributions in binary form, except as embedded into a Nordic
     *    Semiconductor ASA integrated circuit in a product or a software update for
     *    such product, 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.
     * 
     * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
     *    contributors may be used to endorse or promote products derived from this
     *    software without specific prior written permission.
     * 
     * 4. This software, with or without modification, must only be used with a
     *    Nordic Semiconductor ASA integrated circuit.
     * 
     * 5. Any software provided in binary form under this license must not be reverse
     *    engineered, decompiled, modified and/or disassembled.
     * 
     * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
     * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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 "nrf_gpio.h"
    #include "nrf_delay.h"
    #include "app_timer.h"
    #include "nrf_drv_clock.h"
    
    #include <stdio.h>
    
    #include "ds18b20.h"
    
    //Datasheet: https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
    
    static float temp = 0;
    
    static void lfclk_request(void)
    {
        ret_code_t err_code = nrf_drv_clock_init();
        APP_ERROR_CHECK(err_code);
        nrf_drv_clock_lfclk_request(NULL);
    }
    
    APP_TIMER_DEF(m_repeated_timer_id);//ADDED
    
    /*static void repeated_timer_handler(void * p_context)
    {
        nrf_drv_gpiote_out_toggle(LED_1);
    }*/
    
    static void timers_init(void)
    {
        ret_code_t err_code = app_timer_init();
        APP_ERROR_CHECK(err_code);
    }
    
    /*static void app_create_timers()
    {
        ret_code_t err_code;
    
        // Create timers
        err_code = app_timer_create(&m_repeated_timer_id,
                                    APP_TIMER_MODE_REPEATED,
                                    ds18b20_get_temp_method_2);
        APP_ERROR_CHECK(err_code);
        return;
    }*/
    
    void main()
    {
        NRF_CLOCK->TASKS_HFCLKSTART = 1;
        while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);
        lfclk_request();
        timers_init();
        ds18b20_setResolution(12);
    
       //temp = ds18b20_get_temp_method_2();
       //printf("Temperature: %.3f \r\n", temp);
    
        while(1)
        {   
            NRF_CLOCK->TASKS_HFCLKSTART = 1;
            while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);
            nrf_delay_ms(2000);
            timers_init();
            temp =app_timer_start(&m_repeated_timer_id, APP_TIMER_MODE_REPEATED,ds18b20_get_temp_method_2);
            //ret_code_t err_code =app_timer_start(&m_repeated_timer_id, APP_TIMER_MODE_REPEATED,ds18b20_get_temp_method_2); 
            APP_ERROR_CHECK(temp);
            //temp = app_timer_stop(&m_repeated_timer_id, APP_TIMER_MODE_REPEATED,ds18b20_get_temp_method_2);
            APP_ERROR_CHECK(temp);
            //temp = app_timer_start(m_repeated_timer_id,APP_TIMER_TICKS(0),NULL); // timer for 3secs
            //APP_ERROR_CHECK(temp);
            //temp = ds18b20_get_temp_method_2();
            //temp = ds18b20_get_temp();
            printf("Temperature: %.3f \r\n", temp);
           
        }
    }
    
    
    /** @} */

  • And this is my ds18b20.c

    /**
     * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA
     * 
     * All rights reserved.
     * 
     * Redistribution and use in source and binary forms, with or without modification,
     * are permitted provided that the following conditions are met:
     * 
     * 1. Redistributions of source code must retain the above copyright notice, this
     *    list of conditions and the following disclaimer.
     * 
     * 2. Redistributions in binary form, except as embedded into a Nordic
     *    Semiconductor ASA integrated circuit in a product or a software update for
     *    such product, 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.
     * 
     * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
     *    contributors may be used to endorse or promote products derived from this
     *    software without specific prior written permission.
     * 
     * 4. This software, with or without modification, must only be used with a
     *    Nordic Semiconductor ASA integrated circuit.
     * 
     * 5. Any software provided in binary form under this license must not be reverse
     *    engineered, decompiled, modified and/or disassembled.
     * 
     * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
     * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
     * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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 "nrf_gpio.h"
    #include "nrf_delay.h"
    
    #include "ds18b20.h"
    
    #define DS_PIN 26
    
    // Commands
    #define STARTCONVO      0x44
    #define READSCRATCH     0xBE
    #define WRITESCRATCH    0x4E
    
    // Scratchpad locations
    #define TEMP_LSB        0
    #define TEMP_MSB        1
    
    // Device resolution
    #define TEMP_9_BIT  0x1F //  9 bit
    #define TEMP_10_BIT 0x3F // 10 bit
    #define TEMP_11_BIT 0x5F // 11 bit
    #define TEMP_12_BIT 0x7F // 12 bit
    
    typedef uint8_t ScratchPad[9];
    
    /**@brief Function for sending one bit to bus.
     */
    void ds18b20_send(char bit)
    {
        nrf_gpio_cfg_output(DS_PIN);
        nrf_gpio_pin_clear(DS_PIN);
    
        nrf_delay_us(5);
    
        if(bit==1)
        {
            nrf_gpio_pin_set(DS_PIN);
        }
        nrf_delay_us(80);
        nrf_gpio_pin_set(DS_PIN);
    }
    
    
    /**@brief Function for reading one bit from bus.
     */
    unsigned char ds18b20_read(void)
    {
        unsigned char presence=0;
        nrf_gpio_cfg_output(DS_PIN);
        nrf_gpio_pin_clear(DS_PIN);
    
        nrf_delay_us(2);
    
        nrf_gpio_pin_set(DS_PIN);;
        nrf_delay_us(15);
    
        nrf_gpio_cfg_input(DS_PIN,NRF_GPIO_PIN_NOPULL);
    
        if(nrf_gpio_pin_read(DS_PIN))
        {
            presence = 1;
        }
        else
        {
            presence = 0;
        }
        
        return presence;
    }
    
    
    /**@brief Function for sending one byte to bus.
     */
    void ds18b20_send_byte(char data)
    {
        unsigned char i;
        unsigned char x;
        for(i=0;i<8;i++)
        {
          x = data>>i;
          x &= 0x01;
          ds18b20_send(x);
        }
        nrf_delay_us(100);
    }
    
    
    /**@brief Function for reading one byte from bus.
     */
    unsigned char ds18b20_read_byte(void)
    {
        unsigned char i;
        unsigned char data = 0;
        for (i=0;i<8;i++)
        {
            if(ds18b20_read()) data|=0x01<<i;
            nrf_delay_us(15);
        }
        return(data);
    }
    
    
    /**@brief Function for sending reset pulse.
     */
    unsigned char ds18b20_reset(void)
    {
      unsigned char presence;
    
      nrf_gpio_cfg_output(DS_PIN);
      nrf_gpio_pin_clear(DS_PIN);
    
      nrf_delay_us(500);
      nrf_gpio_pin_set(DS_PIN);
    
      nrf_gpio_cfg_input(DS_PIN,NRF_GPIO_PIN_NOPULL); // usikkert p? pull her. m? sjekkes
      nrf_delay_us(30);
    
    
        if(nrf_gpio_pin_read(DS_PIN) == 0)
        {
            presence = 1;
        }
        else
        {
            presence = 0;
        }
    
        nrf_delay_us(470);
    
        if(nrf_gpio_pin_read(DS_PIN) == 1)
        {
            presence = 1;
        }
        else
        {
            presence = 0;
        }
    
      return presence;
    }
    
    
    /**@brief Function for reading temperature.
     */
    float ds18b20_get_temp(void)
    {
        unsigned char check;
        char temp1=0, temp2=0;
    
        check=ds18b20_reset();
        if(check)
        {
            ds18b20_send_byte(0xCC);
            ds18b20_send_byte(0x44);
            nrf_delay_ms(600UL);
            check=ds18b20_reset();
            ds18b20_send_byte(0xCC);
            ds18b20_send_byte(0xBE);
            temp1=ds18b20_read_byte();
            temp2=ds18b20_read_byte();
            check=ds18b20_reset();
            float temp=0;
            temp=(float)(temp1+(temp2*256))/16;
            return temp;
        }
          return 0;
    }
    
    
    /**@brief Function for reading bit.
     */
    uint8_t OneWire_read_bit(void)
    {
        uint8_t r;
        nrf_gpio_cfg_output(DS_PIN);
        nrf_gpio_pin_clear(DS_PIN);
        nrf_delay_us(3);
        nrf_gpio_cfg_input(DS_PIN,NRF_GPIO_PIN_NOPULL);
        nrf_delay_us(10);
        r =nrf_gpio_pin_read(DS_PIN);
        nrf_delay_us(53);
        return r;
    }
    
    
    /**@brief Function for reading.
     */
    uint8_t OneWire_read()
    {
        uint8_t bitMask;
        uint8_t r = 0;
    
        for (bitMask = 0x01; bitMask; bitMask <<= 1) {
    	if ( OneWire_read_bit()) r |= bitMask;
        }
        return r;
    }
    
    
    /**@brief Function for reading scratchpad value
     */
    void ds18b20_readScratchPad(uint8_t *scratchPad, uint8_t fields)
    {
        ds18b20_reset();
        ds18b20_send_byte(0xCC);
        ds18b20_send_byte(READSCRATCH);
    
        for(uint8_t i=0; i < fields; i++)
        {
            scratchPad[i] = OneWire_read();
        }
        ds18b20_reset();
    }
    
    
    /**@brief Function for request temperature reading
     */
    void ds18b20_requestTemperatures(void)
    {
        ds18b20_reset();
        ds18b20_send_byte(0xCC);
        ds18b20_send_byte(STARTCONVO);
    }
    
    
    /**@brief Function for reading temperature method 2
     */
    float ds18b20_get_temp_method_2(void)
    {
        ds18b20_requestTemperatures();
        unsigned char check;
    
        ScratchPad scratchPad;
        ds18b20_readScratchPad(scratchPad, 2);
        int16_t rawTemperature = (((int16_t)scratchPad[TEMP_MSB]) << 8) | scratchPad[TEMP_LSB];
        float temp = 0.0625 * rawTemperature;
        return temp;
        printf("Temperature: %.3f \r\n", temp);
    }
    
    
    /**@brief Function for setting temperature resolution
     */
    void ds18b20_setResolution(uint8_t resolution)
    {
        ds18b20_reset();
        ds18b20_send_byte(0xCC);
        ds18b20_send_byte(WRITESCRATCH);
        // two dummy values for LOW & HIGH ALARM
        ds18b20_send_byte(0);
        ds18b20_send_byte(100);
        switch (resolution)
        {
            case 12:
                ds18b20_send_byte(TEMP_12_BIT);
                break;
    
            case 11:
                ds18b20_send_byte(TEMP_11_BIT);
                break;
    
            case 10:
                ds18b20_send_byte(TEMP_10_BIT);
                break;
    
            case 9:
            default:
                ds18b20_send_byte(TEMP_9_BIT);
                break;
        }
        ds18b20_reset();
    }

Related