Greenhouse Climate Monitor

The HS3001 is a small temperature and humidity sensor that talks over I2C. Your job is to wire it up (including the pull-up resistors on the I2C lines), read its 4 byte measurement, work out the temperature and humidity from those bytes, and send the results out over UART. It's the sort of code you'd write for any board that needs to keep track of its surroundings.

Kart
STM32 · HAL
Zorluk
Orta
Konu
Sensör Arayüzü
Erişim
Ücretsiz

Görev

Sera İklim İzleme Sistemi

Akıllı seralar geliştiren bir girişim olan VerdeGrow’un donanım yazılımı ekibine katıldınız. Her bir yetiştirme modülünde, I2C üzerinden bir HS3001 sıcaklık ve nem sensörüne bağlı bir STM32 denetleyici bulunmaktadır. Bulut kontrol paneli, denetleyicinin UART bağlantısı üzerinden sürekli bir iklim verisi akışı beklemektedir.

Donanım ekibi kartı tamamladı. Sensör bağlandı ve güç verildi. Tek eksik olan şey, sensörle iletişim kuran ve iklim verilerini raporlayan donanım yazılımıdır — bu da sizin göreviniz.

Göreviniz

Core/Src/userCode.c içindeki userCode() dosyasını şu şekilde tamamlayın:

  1. I2C1 üzerinden HS3001 sensörünü okur.
  2. Ham baytları sıcaklık (°C) ve bağıl nem (%RH) olarak kod çözer.
  3. Her iki değeri de UART4 üzerinden yazdırır.
  4. Her biri arasında 100 ms bekleyerek 10 okuma yapsın.
  5. 10 okumanın tamamı bittiğinde geri dönsün.

Beklenen çıktı (kesir değerleriniz biraz farklı olabilir):

Temp: 25.01 C  Humidity: 60.02 %RH
Temp: 25.01 C  Humidity: 60.02 %RH
Temp: 25.01 C  Humidity: 60.02 %RH
...

UART Üzerinden Yazdırma

Her okuma değerini snprintf() ile biçimlendirin ve HAL_UART_Transmit() ile gönderin:

char message[48];
snprintf(message, sizeof(message),
         "Temp: %.2f C  Humidity: %.2f %%RH\r\n", tempC, humidityRH);
HAL_UART_Transmit(&huart4, (uint8_t *)message, strlen(message), 100);
Kullanıcı tanıtıcıları zaten sağlanmıştır

İhtiyacınız olan kullanıcı tanıtıcıları main.c ile zaten sağlanmıştır:

extern I2C_HandleTypeDef hi2c1;
extern UART_HandleTypeDef huart4;
% işaretini olduğu gibi yazdırma

%%, biçim dizesi içinde % işaretini olduğu gibi yazdırır.


Zamanlama ve Döngü

Aralarında 100 ms'lik bir duraklama olacak şekilde tam olarak 10 okuma alın:

for (int i = 0; i < 10; i++)
{
    // 1. read 4 bytes from the sensor
    // 2. decode raw humidity + temperature
    // 3. convert to %RH and °C
    // 4. print over UART4
    HAL_Delay(100);
}
Bayt sırasına dikkat edin

float'teki hesaplamayı yapın, ancak bayt sırasına dikkat edin: sıcaklık 2–3. baytlarda, nem ise 0–1. baytlarda bulunur.


Başarı Kriterleri

Çözümünüz aşağıdaki koşullar sağlandığında tamamlanmış sayılır:

  1. Firmware derlenir.
  2. userCode() çalışır ve sensörü okur.
  3. UART, her biri bir sıcaklık ve bir nem değeri içeren 10 satır yazdırır.
  4. Okumalar arasında 100 ms'lik bir aralık vardır.
  5. userCode(), 10. okumadan sonra geri döner.

Neler var

  • Firmware'in emüle edilmiş bir kartta derlenip çalıştırılır ve donanım seviyesindeki testlerle kontrol edilir.
  • Çözümün video anlatımı.
  • Geliştirme kartı veya yerel kurulum gerekmez.

Gömülüye yeni misin? Yol haritasıyla başla: Gömülü sistemler nasıl öğrenilir