.. note:: Hello, welcome to the SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community on Facebook! Dive deeper into Raspberry Pi, Arduino, and ESP32 with fellow enthusiasts. **Why Join?** - **Expert Support**: Solve post-sale issues and technical challenges with help from our community and team. - **Learn & Share**: Exchange tips and tutorials to enhance your skills. - **Exclusive Previews**: Get early access to new product announcements and sneak peeks. - **Special Discounts**: Enjoy exclusive discounts on our newest products. - **Festive Promotions and Giveaways**: Take part in giveaways and holiday promotions. 👉 Ready to explore and create with us? Click [|link_sf_facebook|] and join today! .. _2.2.2_c: 2.2.2 Thermistor ====================== .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left Depending on your kit version, please identify whether you have **ADC0834** or **MCP3008** and proceed with the matching section. Introduction ------------ Just like photoresistor can sense light, thermistor is a temperature sensitive electronic device that can be used for realizing functions of temperature control, such as making a heat alarm. Required Components ------------------------------ In this project, we need the following components. .. image:: ../img/list_2.2.2_thermistor.png It's definitely convenient to buy a whole kit, here's the link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Name - ITEMS IN THIS KIT - LINK * - Raphael Kit - 337 - |link_Raphael_kit| You can also buy them separately from the links below. .. list-table:: :widths: 30 20 :header-rows: 1 * - COMPONENT INTRODUCTION - PURCHASE LINK * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_thermistor` - |link_thermistor_buy| * - :ref:`cpn_adc0834` - \- Schematic Diagram ----------------- .. image:: ../img/image323.png .. image:: ../img/image324.png Experimental Procedures ----------------------- **Step 1:** Build the circuit. .. image:: ../img/image202.png **Step 2:** Go to the folder of the code. .. raw:: html .. code-block:: cd ~/raphael-kit/c/2.2.2/ **Step 3:** Compile the code. .. raw:: html .. code-block:: gcc 2.2.2_Thermistor.c -lwiringPi -lm .. note:: -lm is to load the library math. Do not omit, or you will make an error. **Step 4:** Run the executable file. .. raw:: html .. code-block:: sudo ./a.out With the code run, the thermistor detects ambient temperature which will be printed on the screen once it finishes the program calculation. .. note:: If it does not work after running, or there is an error prompt: \"wiringPi.h: No such file or directory\", please refer to :ref:`install_wiringpi`. **Code** .. code-block:: c #include #include #include typedef unsigned char uchar; typedef unsigned int uint; #define ADC_CS 0 #define ADC_CLK 1 #define ADC_DIO 2 uchar get_ADC_Result(uint channel) { uchar i; uchar dat1=0, dat2=0; int sel = channel > 1 & 1; int odd = channel & 1; digitalWrite(ADC_CLK, 1); delayMicroseconds(2); digitalWrite(ADC_CLK, 0); delayMicroseconds(2); pinMode(ADC_DIO, OUTPUT); digitalWrite(ADC_CS, 0); // Start bit digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,1); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); //Single End mode digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,1); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); // ODD digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,odd); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); //Select digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,sel); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); digitalWrite(ADC_CLK,0); delayMicroseconds(2); for(i=0;i<8;i++) { digitalWrite(ADC_CLK,1); delayMicroseconds(2); digitalWrite(ADC_CLK,0); delayMicroseconds(2); pinMode(ADC_DIO, INPUT); dat1=dat1<<1 | digitalRead(ADC_DIO); } for(i=0;i<8;i++) { dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))< There is a C numerics library which declares a set of functions to compute common mathematical operations and transformations. .. code-block:: c analogVal = get_ADC_Result(0); This function is used to read the value of the thermistor. .. code-block:: c Vr = 5 * (double)(analogVal) / 255; Rt = 10000 * (double)(Vr) / (5 - (double)(Vr)); temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25))); cel = temp - 273.15; Fah = cel * 1.8 +32; printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah); These calculations convert the thermistor values into Celsius values. .. code-block:: c Vr = 5 * (double)(analogVal) / 255; Rt = 10000 * (double)(Vr) / (5 - (double)(Vr)); These two lines of codes are calculating the voltage distribution with the read value analog so as to get Rt (resistance of thermistor). .. code-block:: c temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25))); This code refers to plugging Rt into the formula **T\ K\ =1/(ln(R\ T/R\ N)/B+1/T\ N)** to get Kelvin temperature. .. code-block:: c temp = temp - 273.15; Convert Kelvin temperature into degree Celsius. .. code-block:: c Fah = cel * 1.8 +32; Convert degree Celsius into Fahrenheit. .. code-block:: c printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah); Print centigrade degree, Fahrenheit degree and their units on the display. Phenomenon Picture ------------------ .. image:: ../img/image203.jpeg