X
Делаем инфракрасный датчик расстояния с двойным опросом
Две версии на основе tcrt5000l и сборной пары.
Делаем два опроса фототранзистора: при зажженном и отключенном светодиоде, получаем два значения, разница между ними величина потока света, отраженного от объекта, который перед датчиком.
Программа реализована с использованием возможностей встраиваемой операционной системы FreeRTOS для опроса датчиков в фоне.
#define GPUO_IRDIODE 16//4
#define GPIO_IRTRANSISTOR 34//35
#define GPUO_IRDIODE2 4
#define GPIO_IRTRANSISTOR2 35
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
double sensorvolume=0;
double sensorvolume2=0;
void TaskIrSensor (void);
void TaskSerialPrint (void);
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
void setup()
{
Serial.begin(115200);
pinMode(GPUO_IRDIODE, OUTPUT);
pinMode(GPIO_IRTRANSISTOR, INPUT);
pinMode(GPUO_IRDIODE2, OUTPUT);
pinMode(GPIO_IRTRANSISTOR2, INPUT);
xTaskCreatePinnedToCore(TaskIrSensor, "irsensors", 4096, NULL, 10, NULL, 0);
xTaskCreatePinnedToCore(TaskSerialPrint, "printInfo", 4096, NULL, 1, NULL, 0);
}
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
void loop()
{
}
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
void TaskIrSensor (void *pvParameters)
{
// TickType_t xLastWakeTime;
// xLastWakeTime = xTaskGetTickCount ();
int ligh_s;
int ligh_s2;
while (true)
{
digitalWrite(GPUO_IRDIODE, HIGH);
digitalWrite(GPUO_IRDIODE2, HIGH);
vTaskDelay(5); //Отдаем управление на 5мСек
ligh_s=0; ligh_s2=0;
for(int i=0;i<5;i++) { ligh_s-=analogRead(GPIO_IRTRANSISTOR); ligh_s2-=analogRead(GPIO_IRTRANSISTOR2);}
digitalWrite(GPUO_IRDIODE, LOW);
digitalWrite(GPUO_IRDIODE2, LOW);
vTaskDelay(5); //Отдаем управление на 5мСек
for(int i=0;i<5;i++){ ligh_s+=analogRead(GPIO_IRTRANSISTOR); ligh_s2+=analogRead(GPIO_IRTRANSISTOR2);}
ligh_s = constrain(ligh_s,0,16000);
ligh_s2 = constrain(ligh_s2,0,16000);
sensorvolume = double(ligh_s);
sensorvolume2 = double(ligh_s2);
}
}
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
void TaskSerialPrint (void *pvParameters)
{
TickType_t xLastWakeTime;
xLastWakeTime = xTaskGetTickCount ();
while (true)
{
Serial.print(sensorvolume); Serial.print(" == "); Serial.println(sensorvolume2);
vTaskDelayUntil( &xLastWakeTime, 300 ); //Отдаем управление на 5мСек
}
}
//*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
ОСТАВИТЬ КОММЕНТАРИЙ
Форма авторизации
ВОЙТИ С ПОМОЩЬЮ:
ИЛИ Авторизация на сайте: