Hallo Liebes Forum,
Ich hatte für mein Aktuelles Projekt "Die ESP32 Wetterstation" vorgehabt die Batteriespannung zu messen und über dem HC12 zu übertragen an den ESP32.
Den einzigen freien Analogen Pin des Attiny85 den ich verwenden kann ist Pin 2, dementsprechend wird für den DHT22 der Pin 1 verwendet.
Nun meine Frage:
ich habe den Code für den Attiny85 angepasst und wollte wissen ob diese Codes und die Anschluss belegung so korrekt ist, bevor ich anfage dies entprechend um zu Löten.
Der Lötplan des Attiny85:
Der Angepasste Code zur Messung der Batteriespannung:
#include <Arduino.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <SoftwareSerial.h>
#include <dht22.h>
constexpr byte DHTPIN {1};
constexpr byte BATTERY_PIN {2}; // Pin, der mit dem Pluspol der Batterien verbunden ist
constexpr byte UNUSEDPINS[] {0};
SoftwareSerial hc12(4, 3); // RX = 4, TX = 3
dht22 dht;
// after how many watchdog wakeups we should collect and send the data
constexpr byte WATCHDOG_WAKEUPS_TARGET {7}; // 8 * 7 = 56 seconds between each data collection
// watchdog ISR
ISR(WDT_vect) {
// nothing to do here, just wake up
}
void enableWatchdog() {
cli();
// clear the reset flag
MCUSR &= ~(1 << WDRF);
// set WDCE to be able to change/set WDE
WDTCR |= (1 << WDCE) | (1 << WDE);
WDTCR = 1 << WDP0 | 1 << WDP3;
// enable the WD interrupt to get an interrupt instead of a reset
WDTCR |= (1 << WDIE);
sei();
}
// function to go to sleep
void enterSleep(void) {
set_sleep_mode(SLEEP_MODE_PWR_DOWN); /* SLEEP_MODE_PWR_DOWN for lowest power consumption. */
sleep_enable();
sleep_mode();
sleep_disable();
}
float readBatteryVoltage() {
// Messung der Batteriespannung
analogReference(INTERNAL); // Interne Referenzspannung für die Messung verwenden
int rawValue = analogRead(BATTERY_PIN);
float voltage = rawValue * (4.5 / 1023.0); // Umrechnung in die tatsächliche Spannung
return voltage;
}
void setup() {
hc12.begin(4800);
dht_init(&dht, DHTPIN);
// Set unused pins to INPUT_PULLUP to save power.
for (auto pin : UNUSEDPINS) {
pinMode(pin, INPUT_PULLUP);
}
// switch off ADC -320µA
ADCSRA &= ~(1 << ADEN);
delay(2000);
// enable the watchdog
enableWatchdog();
}
void loop() {
float temperature;
float humidity;
char toSend[30];
// Daten vom DHT22 Sensor lesen
if (dht_read_data(&dht, &temperature, &humidity) == 1) {
char tempData[6];
char humData[5];
char voltageData[5];
char separator[] = ",";
// Temperaturdaten konvertieren
dtostrf(temperature, 4, 1, tempData);
// Luftfeuchtigkeitsdaten konvertieren
dtostrf(humidity, 2, 0, humData);
// Batteriespannung messen und konvertieren
float batteryVoltage = readBatteryVoltage();
dtostrf(batteryVoltage, 3, 2, voltageData);
// Daten zusammenstellen
strcpy(toSend, tempData);
strcat(toSend, separator);
strcat(toSend, humData);
strcat(toSend, separator);
strcat(toSend, voltageData);
strcat(toSend, separator);
} else {
strcpy(toSend, "99.9,99,0.00,"); // Fehler
}
hc12.print(toSend); // Daten mit dem HC12-Sender übertragen
// Tiefschlaf
for (uint8_t i = 0; i < WATCHDOG_WAKEUPS_TARGET; i++) {
enterSleep();
}
}
Ein Beispiel-Code zum anzeigen der Batteriespannung:
#include <SoftwareSerial.h>
SoftwareSerial HC12Serial(26, 27); // RX an Pin 26, TX an Pin 27
void setup() {
Serial.begin(115200);
HC12Serial.begin(4800);
}
void loop() {
if (HC12Serial.available() > 0) {
String receivedData = HC12Serial.readStringUntil('\n');
float batteryVoltage = receivedData.toFloat();
// Umrechnung der Batteriespannung in Prozent (Beispiel: Annahme von 4,5 V als maximaler Wert)
int batteryPercentage = map(batteryVoltage, 0.0, 4.5, 0, 100);
// Ausgabe des Batterieprozentsatzes über die serielle Schnittstelle
Serial.print("Batteriespannung: ");
Serial.print(batteryPercentage);
Serial.println("%");
}
}
Vielen dank im Vorrause

