Grayscale Sensor
Module Source
Purchase link: https://detail.tmall.com/item.htm?abbucket=0&id=676917570259&ns=1&spm=a21n57.1.0.0.6a6b523c8GDuHU
Specifications
Operating voltage: 3.3V-5V Operating current: <20mA Output format: Analog signal output Control interface: ADC Number of pins: 3 Pin (2.54mm pitch header)
View Materials
The grayscale sensor includes a white high-brightness LED and a photoresistor. Since the light returned from the LED shining on papers of different grayscales is different, the photoresistor receives the returned light and its resistance value varies according to the light intensity, thereby realizing the measurement of grayscale values.
Porting Process
Pin Selection
Port to Project
Our goal is to port the example to the ESP32-S3 dev board. Complete driver code has been provided for you. Follow the steps below to complete the porting. For detailed instructions on creating folders and new .c and .h files, refer to section 1.4.2 in the [DHT11 Temperature and Humidity Sensor] chapter; we will not repeat it here. However, here we change the file names bsp_dht11.c and bsp_dht11.h to bsp_grayscale.c and bsp_grayscale.h, and change the folder name to Grayscale
Write Code
In the file bsp_grayscale.c, write the following code.
/*
* LCSC-Openkits (LCKFB) software and hardware materials and related expansion board software and hardware materials are all open source on the official website.
* Dev board official website: www.lckfb.com
* Technical support resides on the forum; any technical questions are welcome for exchange and learning at any time.
* LCKFB Forum: club.szlcsc.com
* Follow our Bilibili account: [LCSC-Openkits (LCKFB)] to keep up with our latest updates!
* We do not make money by selling boards; we take cultivating engineers as our mission.
* Change Logs:
* Date Author Notes
* 2024-01-09 LCKFB-lp first version
*/
#include "bsp_grayscale.h"
esp_adc_cal_characteristics_t *adc_chars;
void delay_ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
void delay_us(unsigned int us)
{
ets_delay_us(us);
}
void delay_1ms(unsigned int ms)
{
vTaskDelay(ms / portTICK_PERIOD_MS);
}
void delay_1us(unsigned int us)
{
ets_delay_us(us);
}
/******************************************************************
* Function Name: ADC_Init
* Function Description: Initialize functions
* Function Parameters: none
* Function Return: none
* Author: LC
* Notes: none
******************************************************************/
void ADC_Init(void)
{
adc1_config_width(width);// 12-bit resolution
//ADC_ATTEN_DB_0: indicates reference voltage is 1.1V
//ADC_ATTEN_DB_2_5: indicates reference voltage is 1.5V
//ADC_ATTEN_DB_6: indicates reference voltage is 2.2V
//ADC_ATTEN_DB_11: indicates reference voltage is 3.3V
//adc1_config_channel_atten( channel,atten);// Set channel 0 and 3.3V reference voltage
// Allocate memory
adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
// Initialize ADC characteristics so that conversion results and compensation factors can be correctly calculated
esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);
}
/******************************************************************
* Function Name: Get_Adc_Value
* Function Description: Output after calculating the average of saved data
* Function Parameters: CHx which scanned data
* Function Return: corresponding scanned ADC value
* Author: LC
* Notes: none
******************************************************************/
unsigned int Get_Adc_Value(char CHx)
{
unsigned char i = 0;
unsigned int AdcValue = 0;
/* Since it samples SAMPLES times, loop SAMPLES times */
for(i=0; i< SAMPLES; i++)
{
/* Accumulate */
AdcValue+=adc1_get_raw(CHx);
}
/* Calculate average */
AdcValue=AdcValue / SAMPLES;
return AdcValue;
}
/******************************************************************
* Function Name: Get_Grayscale_Percentage_value
* Function Description: Read grayscale sensor value and return percentage
* Function Parameters: none
* Function Return: returns percentage
* Author: LC
* Notes: none
******************************************************************/
unsigned int Get_Grayscale_Percentage_Value(void)
{
int adc_max = 4095;
int adc_new = 0;
int Percentage_value = 0;
adc_new = Get_Adc_Value(channel);
Percentage_value = ((float)adc_new/adc_max) * 100;
return Percentage_value;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
In the file bsp_grayscale.h, write the following code.
#ifndef _BSP_GRAYSCALE_H_
#define _BSP_GRAYSCALE_H_
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_rom_sys.h"
#include "esp_timer.h"
#include "driver/uart.h"
#include "rom/ets_sys.h"
#include "esp_system.h"
#include "driver/gptimer.h"
#include "esp_log.h"
#include "freertos/queue.h"
#include "driver/spi_master.h"
#include "nvs_flash.h"
#include "esp_adc/adc_cali_scheme.h"
#include "esp_adc/adc_cali.h"
#include "driver/adc.h"
#include "esp_adc_cal.h"
#define ADC_PIN 1
#define DEFAULT_VREF 1100 // Default reference voltage, unit mV
#define channel ADC_CHANNEL_0 // ADC measurement channel
#define width ADC_WIDTH_BIT_12 // ADC resolution
#define atten ADC_ATTEN_DB_11 // ADC attenuation
#define unit ADC_UNIT_1 // ADC1
// Number of samples
#define SAMPLES 30
void ADC_Init(void);
unsigned int Get_Adc_Value(char CHx);
unsigned int Get_Grayscale_Percentage_Value(void);
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
void delay_1us(unsigned int us);
void delay_1ms(unsigned int ms);
#endif2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Porting Verification
In the main function of your own project, write the following code.
/*
* LCSC-Openkits (LCKFB) software and hardware materials and related expansion board software and hardware materials are all open source on the official website.
* Dev board official website: www.lckfb.com
* Technical support resides on the forum; any technical questions are welcome for exchange and learning at any time.
* LCKFB Forum: club.szlcsc.com
* Follow our Bilibili account: [LCSC-Openkits (LCKFB)] to keep up with our latest updates!
* We do not make money by selling boards; we take cultivating engineers as our mission.
* Change Logs:
* Date Author Notes
* 2024-01-09 LCKFB-lp first version
*/
#include <stdio.h>
#include "bsp_grayscale.h"
void app_main(void)
{
ADC_Init();
printf("demo start\r\n");
while(1)
{
printf("%d%%\r\n", Get_Grayscale_Percentage_Value() );
delay_1ms(1000);
}
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Power-on effect:
Driver code:
File Download
📌 Materials Download Center (click to jump)
📌 In the Materials Download Center -> Module Porting Materials Download, inside the compressed package of this chapter.