summaryrefslogtreecommitdiff
path: root/Libraries/LightSensor/light_sensor_task.c
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LightSensor/light_sensor_task.c')
-rw-r--r--Libraries/LightSensor/light_sensor_task.c202
1 files changed, 0 insertions, 202 deletions
diff --git a/Libraries/LightSensor/light_sensor_task.c b/Libraries/LightSensor/light_sensor_task.c
deleted file mode 100644
index d1a0f89..0000000
--- a/Libraries/LightSensor/light_sensor_task.c
+++ /dev/null
@@ -1,202 +0,0 @@
-#include "light_sensor_task.h"
-#include "ltimers.h"
-
-// FreeRTOS includes
-#include "FreeRTOS.h"
-#include "task.h"
-#include "queue.h"
-#include "semphr.h"
-
-// Если используется фоторезистор:
-// - калибровка датчика освещенности ?
-// - добавить гистерезис
-// - плавное изменение яркости
-// - как будет реагировать фоторезистор на мерцание 50 Гц, 100 Гц на диодное и тд.
-
-// * Фоторезистор GL5516 стоит в нижнем плече делителя. В врехнем плече на питание
-// +3.3В подключен резистор 10К.
-// Фоторезистор в полной темноте дает сопротивление до 6МОм, на свету у окна
-// в пасмурную питерскую погоду около 200 Ом, а если на ярком солнце, то и еще
-// меньше.
-// В итоге, чем ярче освещение, тем ниже сопротивление, тем ниже напряжение
-// на АЦП.
-//
-// Порог переключения яркости ламп нужно в приложении настраивать под себя.
-// И сделать по умолчанию.
-//
-// - теперь нужно опытным путем определить порог, когда лампам нужно убавить яркость
-// Для начала сделать только два варианта - светло/темно.
-
-#define LIGHT_THREHSOLD 3300 // Значение АЦП, подобранное опытным путем
-#define LIGHT 0
-#define DARK 1
-
-#define TIME_LIGHT_SENSOR 3000 //ms
-
-static void ADC_Config(void);
-
-static uint16_t ADC_ConvertedValue = 0;//, ADC_ConvertedVoltage = 0;
-QueueHandle_t queue_light_sensor;
-
-// ----------------------------------------------------------------------------
-//
-// ----------------------------------------------------------------------------
-void LightSensorInit ( void )
-{
- // - ADC init
- ADC_Config ();
- queue_light_sensor = xQueueCreate ( 1, sizeof (LightSensorState_t) );
- configASSERT( queue_light_sensor );
-}
-
-
-// ----------------------------------------------------------------------------
-//
-// ----------------------------------------------------------------------------
-static void ADC_Config(void)
-{
- ADC_InitTypeDef ADC_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /* GPIOC Periph clock enable */
- RCC_AHBPeriphClockCmd(LIGHT_SENSOR_RCC_AHBPeriph_GPIOx, ENABLE);
-
- /* ADC1 Periph clock enable */
- LIGHT_SENSOR_RCC_APBxPeriphClockCmd(LIGHT_SENSOR_RCC_APBxPeriph_ADCx, ENABLE);
-
- /* Configure ADC Channelx as analog input */
- GPIO_InitStructure.GPIO_Pin = LIGHT_SENSOR_GPIO_PINx ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
- GPIO_Init(LIGHT_SENSOR_GPIOx, &GPIO_InitStructure);
-
- /* ADCs DeInit */
- ADC_DeInit(LIGHT_SENSOR_ADCx);
-
- /* Initialize ADC structure */
- ADC_StructInit(&ADC_InitStructure);
-
- /* Configure the ADC1 in continuous mode with a resolution equal to 12 bits */
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
- ADC_Init(LIGHT_SENSOR_ADCx, &ADC_InitStructure);
-
- /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */
- ADC_ChannelConfig(LIGHT_SENSOR_ADCx, LIGHT_SENSOR_ADC_Channelx , ADC_SampleTime_239_5Cycles);
-
- /* ADC Calibration */
- ADC_GetCalibrationFactor(LIGHT_SENSOR_ADCx);
-
- /* Enable the ADC peripheral */
- ADC_Cmd(LIGHT_SENSOR_ADCx, ENABLE);
-
- /* Wait the ADRDY flag */
- while(!ADC_GetFlagStatus(LIGHT_SENSOR_ADCx, ADC_FLAG_ADRDY));
-
- /* ADC1 regular Software Start Conv */
- ADC_StartOfConversion(LIGHT_SENSOR_ADCx);
-
-}
-
-
-// ----------------------------------------------------------------------------
-//
-// ----------------------------------------------------------------------------
-void ProcessFSM_LightSensor ( void )
-{
- static uint8_t process_light_state = 0;
- LightSensorState_t light_sensor_state;
- /* Test EOC flag */
- // - заменить этот файл на проверку и выход
- while(ADC_GetFlagStatus(LIGHT_SENSOR_ADCx, ADC_FLAG_EOC) == RESET);
- /* Get ADC1 converted data */
- ADC_ConvertedValue = ADC_GetConversionValue(LIGHT_SENSOR_ADCx);
- switch ( process_light_state )
- {
- case 0: // ждем когда посветлеет
- if (ADC_ConvertedValue < LIGHT_THREHSOLD) // если стало светло
- {
- // - запускаем таймер, в течение которого проверяем освещение
- StartLTimer (LTIMER_LIGHT_SENSOR);
- // - переходим в состояние проверки яркости в течение таймера
- process_light_state = 2;
- }
- break;
- case 1: // ждем когда потемнет
- if (ADC_ConvertedValue > LIGHT_THREHSOLD) // если стало темно
- {
- // - запускаем таймер, в течение которого проверяем освещение
- StartLTimer (LTIMER_LIGHT_SENSOR);
- // - переходим в состояние проверки яркости в течение таймера
- process_light_state = 3;
- }
- break;
- case 2:
- if ( GetLTimer (LTIMER_LIGHT_SENSOR) >= TIME_LIGHT_SENSOR )
- {
- // - если таймер вышел, значит подтверждается новое значение
- // освещенности
- // - отправляем сообщение на смену режима
- light_sensor_state = LIGHT_SENSOR_STATE_LIGHT;
- xQueueSend ( queue_light_sensor, &light_sensor_state, 0 );
- // - а затем идем проверять когда потемнеет
- process_light_state = 1;
- }
- else
- {
- // - если таймер еще тикает, то проверяем освещенность
- // и, если она изменилась, то возвращаемся в состояние 0
- // то есть в начало алгоритма проверки яркости (освещенности)
- if (ADC_ConvertedValue < LIGHT_THREHSOLD)
- {
- // то ничего не меняем
- }
- else
- {
- process_light_state = 0;
- }
- }
- break;
- case 3:
- if ( GetLTimer (LTIMER_LIGHT_SENSOR) >= TIME_LIGHT_SENSOR )
- {
- // - если таймер вышел, значит подтверждается новое значение
- // освещенности
- // - отправляем сообщение на смену режима
- light_sensor_state = LIGHT_SENSOR_STATE_DARK;
- xQueueSend ( queue_light_sensor, &light_sensor_state, 0 );
- // - а затем идем проверять когда посветлеет
- process_light_state = 0;
- }
- else
- {
- // - если таймер еще тикает, то проверяем освещенность
- // и, если она изменилась, то возвращаемся в состояние 0
- // то есть в начало алгоритма проверки яркости (освещенности)
- if (ADC_ConvertedValue > LIGHT_THREHSOLD)
- {
- // то ничего не меняем
- }
- else
- {
- process_light_state = 1;
- }
- }
- break;
- default:
- break;
- }
- vTaskDelay (100);
-}
-
-
-// ----------------------------------------------------------------------------
-// Задача ОС, реализующая головную задачу программы
-// ----------------------------------------------------------------------------
-void LightSensor_Task ( void *pvParameters )
-{
- while(1)ProcessFSM_LightSensor ();
-}