Khoa đIỆn tử viễn thông cộng hoà XÃ HỘi chủ nghĩa việt nam


Sử dụng hệ điều hành thời gian thực FREERTOS



tải về 5.34 Mb.
trang2/2
Chuyển đổi dữ liệu13.09.2023
Kích5.34 Mb.
#55136
1   2
Báo-cáo-FReeRTOS (1)

Sử dụng hệ điều hành thời gian thực FREERTOS


Hệ điều hành thời gian thực FreeRTOS là một hệ điều hành nhỏ gọn và hiệu quả được phát triển để quản lý các tác vụ đa luồng trên các vi điều khiển nhúng. FreeRTOS cung cấp các chức năng quản lý tác vụ đơn giản và hiệu quả, giúp tối ưu hóa hiệu suất của hệ thống.


  1. Đọc dữ liệu cảm biến thân nhiệt với FREERTOS




Code

#include
#include
LiquidCrystal_I2C lcd(0X27,16,2);
SoftwareSerial Bluetooth(2,3);
int pir = 8;
int mosfet = 4;
int relay = 9;
void setup()
{
pinMode(8, INPUT);
pinMode(4, OUTPUT);
pinMode(9, OUTPUT);
Serial.begin(9600);
Bluetooth.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(4, 0);
lcd.print("NGOI NHA IOT");
}

char docgiatri;
String voice;
void loop()
{
if (digitalRead(8) == HIGH)
{
lcd.setCursor(0, 1);
lcd.print("Bat den");
digitalWrite(mosfet, HIGH);
}
else
{
digitalWrite(mosfet, LOW);
lcd.setCursor(0, 1);
lcd.print("Tat den");


}
if (Bluetooth.available())
{
voice = "";
delay(2);
voice = Bluetooth.readStringUntil('\n');
delay(2);
Bluetooth.println(voice);
}
if (voice == "bật đèn") {
digitalWrite(9, HIGH);
} else if (voice == "Tắt Đèn") {
digitalWrite(9, LOW);
}
}


Như ở phần code TaskLed ở trên ta được kết quả như sau

Khi có chuyển động qua cảm biến thì led xanh bật





Dưới đây là toàn bộ code


#include


#include
#include
#include
#include
#include
#include
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27, 16, 2);


SemaphoreHandle_t xMutex;


SemaphoreHandle_t xArray;
QueueHandle_t xQueue;
QueueHandle_t xArrayTemp;

#define MAX_SIZE 10


float *pTemperatures = NULL;


void TaskTemp(void *pvParameters)


{

while (1)


{
float temperature;
char temp_str[6];
sensors.requestTemperatures();
temperature = sensors.getTempCByIndex(0);
dtostrf(temperature, 5, 1, temp_str);
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE ) {
xQueueSend(xQueue, &temperature, 0);
lcd.setCursor(0, 0);
lcd.print("Temperature:");
lcd.setCursor(0, 1);
lcd.print(temp_str);
lcd.print((char)223);
lcd.print("C");
xSemaphoreGive(xMutex);
}
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void TaskAddArray(void *pvParameters)
{
float temperature;
int count = 0;
while (1)
{
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE ) {
xQueueReceive(xQueue, &temperature, 0);
xSemaphoreGive(xMutex);
}
if (count < MAX_SIZE) {
// Nếu chưa cấp phát bộ nhớ cho mảng thì thực hiện
if (pTemperatures == NULL) {
pTemperatures = (float *) pvPortMalloc(MAX_SIZE * sizeof(float));
}
pTemperatures[count] = temperature;
count++;
}
else {
// Giải phóng bộ nhớ của phần tử đầu tiên trong mảng
vPortFree(&pTemperatures[0]);
// Dịch chuyển các phần tử còn lại trong mảng
for (int i = 0; i < MAX_SIZE - 1; i++) {
pTemperatures[i] = pTemperatures[i + 1];
}
// Thêm phần tử mới vào vị trí cuối cùng của mảng
pTemperatures[MAX_SIZE - 1] = temperature;
}

// if (xSemaphoreTake(xArray, portMAX_DELAY) == pdTRUE ) {


xQueueSend(xArrayTemp, &pTemperatures, 0);
// xSemaphoreGive(xArray);
// }
float *receivedArray;
xQueueReceive(xArrayTemp, &receivedArray, portMAX_DELAY);
for (int i = 0; i < 10; i++) {
Serial.print("Temperature ");
Serial.print(i);
Serial.print(": ");
Serial.println(receivedArray[i]);
}
vTaskDelay(500 / portTICK_PERIOD_MS);
}

}
void TaskReadArray(void *pvParameters)


{
float *receivedArray;

while (1)


{
if (xSemaphoreTake(xArray, portMAX_DELAY) == pdTRUE ) {
xQueueReceive(xArrayTemp, &receivedArray, portMAX_DELAY);
xSemaphoreGive(xArray);
}
for (int i = 0; i < 10; i++) {
Serial.print("Temperature ");
Serial.print(i);
Serial.print(": ");
Serial.println(receivedArray[i]);
}
vTaskDelay(500 / portTICK_PERIOD_MS);
}

}


void TaskLed(void *pvParameters)
{
float temperature;
int red_led = 3;
int yellow_led = 4;
int green_led = 5;

pinMode(red_led, OUTPUT);


pinMode(yellow_led, OUTPUT);
pinMode(green_led, OUTPUT);

while (1)


{
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE ) {
xQueueReceive(xQueue, &temperature, 0);
xSemaphoreGive(xMutex);
}
if (temperature > 40)
{
digitalWrite(red_led, HIGH);
digitalWrite(yellow_led, LOW);
digitalWrite(green_led, LOW);
}
else if (temperature > 30 && temperature <= 40)
{
digitalWrite(red_led, LOW);
digitalWrite(yellow_led, HIGH);
digitalWrite(green_led, LOW);
}
else
{
digitalWrite(red_led, LOW);
digitalWrite(yellow_led, LOW);
digitalWrite(green_led, HIGH);
}
}
}

void setup()


{
xArray = xSemaphoreCreateMutex();
xMutex = xSemaphoreCreateMutex();
xQueue = xQueueCreate(1, sizeof(float));
xArrayTemp = xQueueCreate(11, sizeof(float));
lcd.init();
lcd.backlight();

sensors.begin();


xTaskCreate(TaskTemp, "Temperature Sensor", 128, NULL, 1, NULL);


xTaskCreate(TaskAddArray, "TaskAddArray ", 128, NULL, 1, NULL);
// xTaskCreate( TaskReadArray, " TaskReadArray ", 128, NULL, 2, NULL);
xTaskCreate(TaskLed, "LED Control", 128, NULL, 1, NULL);
Serial.begin(9600);
vTaskStartScheduler();
}
void loop() {

}


V. Kết luận




Trong báo cáo này, chúng em đã trình bày cách sử dụng cảm biến thân nhiệt Pir hc - sr501 và hệ điều hành FreeRTOS để đo nhiệt độ và xử lý dữ liệu. Việc tích hợp cảm biến nhiệt độ vào các ứng dụng nhúng thời gian thực trở nên dễ dàng hơn với sự hỗ trợ của các công nghệ nhúng và các hệ điều hành thời gian thực. Tuy nhiên, việc triển khai phần cứng và phần mềm đòi hỏi sự nắm vững kiến thức về các thiết bị nhúng và các hệ điều hành thời gian thực. Chúng em hy vọng rằng báo cáo này sẽ giúp người đọc hiểu thêm về việc tích hợp cảm biến nhiệt độ trong các ứng dụng nhúng thời gian thực.
tải về 5.34 Mb.

Chia sẻ với bạn bè của bạn:
1   2




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương