Odczyt temperatury z ds18b20
Core/Src/ds18b20.c float DS18B20_ReadTemp(void)
{
uint8_t addr[8];
uint8_t data[12];
float temperature;
if (DS18B20_Start() == 0) {
DS18B20_WriteByte(DS18B20_SKIP_ROM);
DS18B20_WriteByte(DS18B20_CONVERT_T);
HAL_Delay(750);
DS18B20_Start();
DS18B20_WriteByte(DS18B20_SKIP_ROM);
DS18B20_WriteByte(DS18B20_READ_SCRATCHPAD);
for (int i = 0; i < 9; i++) {
data[i] = DS18B20_ReadByte();
}
temperature = (float)((data[1] << 8) | data[0]) / 16.0;
return temperature;
}
return -127.0;
}
Funkcja odczytuje temperaturę z czujnika ds18b20. Wykonuje sekwencję komunikacji 1-Wire, czyta dane z pamięci czujnika i konwertuje je do wartości float.
Odczyt napięcia z ADC
Core/Src/adc.c float ReadBatteryVoltage(void)
{
uint32_t adc_value;
float voltage;
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
adc_value = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
voltage = (adc_value * 3.3f) / 4095.0f;
voltage = voltage * 2.0f; // Due to voltage divider (1:2)
return voltage;
}
Funkcja odczytuje napięcie z akumulatora za pomocą ADC. Wykonuje konwersję, przekształca wartość cyfrową na napięcie woltów i stosuje korektę dla dzielnika napięcia.
Wysyłanie danych przez LoRa w formacie JSON
Core/Src/CommunicationMessagesV2.c void SendCarStatusData(void)
{
char json_buffer[256];
cJSON *root = cJSON_CreateObject();
float temperature = DS18B20_ReadTemp();
float voltage = ReadBatteryVoltage();
cJSON_AddNumberToObject(root, "temperature", temperature);
cJSON_AddNumberToObject(root, "voltage", voltage);
cJSON_AddStringToObject(root, "device_id", "car_engine_module");
strcpy(json_buffer, cJSON_Print(root));
cJSON_Delete(root);
// Send via LoRa
LoRa_SendData((uint8_t*)json_buffer, strlen(json_buffer));
}
Funkcja tworzy dane w formacie JSON zawierające temperaturę i napięcie, a następnie wysyła je przez LoRa. Wykorzystuje bibliotekę cJSON do generowania struktury JSON.
Odbiór komendy LoRa
Core/Src/CommunicationMessagesV2.c void ProcessLoRaCommand(uint8_t *data, uint16_t length)
{
cJSON *root = cJSON_Parse((const char*)data);
if (root != NULL) {
const char *command = cJSON_GetObjectItemCaseSensitive(root, "command")->valuestring;
if (strcmp(command, "start_engine") == 0) {
// Start engine logic
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
SendAcknowledge("Engine started");
} else if (strcmp(command, "stop_engine") == 0) {
// Stop engine logic
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
SendAcknowledge("Engine stopped");
}
cJSON_Delete(root);
}
}
Funkcja przetwarza otrzymaną komendę LoRa. Parsuje dane JSON i wykonuje odpowiednie akcje w zależności od komendy: uruchomienie lub zatrzymanie silnika.