STM32_03.StartCar_STM32F411CEU6

Start Car engine Controller

Sterownik uruchamiania silnika samochodu z komunikacją LoRa. Odczyt temperatury i napięcia akumulatora z przesyłaniem danych do centralnej jednostki.

STM32F4CHALControl moduleAutomotiveLoRaTemperatureVoltageds18b20JSONCommunication

Informacje

  • Repozytorium: STM32_03.StartCar_STM32F411CEU6
  • Płytka / obszar: STM32F411CEU6
  • Kategoria: Embedded controller
  • Status: Public repository

Opis techniczny

  • Firmware steruje systemem uruchamiania silnika samochodu przez komunikację radiową LoRa i odczytuje dane z czujników temperatury oraz napięcia akumulatora.
  • System składa się z modułu sterującego uruchamianiem silnika, czujników ds18b20 do pomiaru temperatury, ADC do odczytu napięcia baterii oraz modułu LoRa do komunikacji.
  • Moduł obsługuje komendy LoRa do włączania/wyłączania silnika i przesyła dane do centralnej jednostki: temperaturę wnętrza samochodu i stan naładowania akumulatora.
  • Projekt integruje sprzętowe komponenty z systemem komunikacji radiowej, tworząc kompletny moduł sterowania w samochodzie.
  • Kod wykorzystuje bibliotekę cJSON do parsowania i przesyłania danych w formacie JSON, co ułatwia integrację z centralnym systemem.

Co dzieje się w kodzie

Wybrane najważniejsze mechanizmy z projektu.

  • Moduł steruje uruchamianiem silnika samochodu przez komunikację LoRa i przesyła dane do centralnej jednostki.
  • Wykorzystuje czujniki ds18b20 do pomiaru temperatury wnętrza samochodu oraz ADC do odczytu napięcia akumulatora.
  • Komunikacja LoRa obsługuje polecenia włączania/wyłączania silnika i przesyłanie danych o stanie systemu.
  • Dane są przesyłane w formacie JSON przy użyciu biblioteki cJSON, co zapewnia spójność i łatwość integracji.
  • USART służy do debugowania i przesyłania informacji diagnostycznych z modułu.
  • Moduł obsługuje zarówno odbiór komend LoRa, jak i wysyłanie danych do centralnej jednostki.

Kluczowe fragmenty kodu

Kod jest skrócony do części istotnych dla zrozumienia projektu.

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.