Hallo,
ich hab folgenden Code:
#include <VirtualWire.h> // http://www.airspayce.com/mikem/arduino/
ISR(WDT_vect) {
Sleepy::watchdogEvent();
}
//---------------------------------------------------------------------------------------------------------
// PIN-Konfiguration
//---------------------------------------------------------------------------------------------------------
const int SENSORID = 6; // Die ID des Sensor-Nodes. Dienst zur Identifizierung der Daten.
const int TX_Pin = 3; // PIN, an den der 433 Mhz Sender angeschlossen ist
const int interval = 5; // Interval x 60 Sekunden = Schlafzeit zwischen Sensordaten-Übermittlung
//---------------------------------------------------------------------------------------------------------
int durchlauf = interval;
char msg[20];
void setup()
{
vw_setup(2000); // VirtualWire und 433 Mhz-Sender initialisieren
vw_set_tx_pin(TX_Pin);
analogReference(INTERNAL); // Set the aref to the internal 1.1V reference
ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Stromsparen: ADC deaktivieren
}
void loop()
{
while(durchlauf < interval) {
durchlauf = durchlauf +1;
Sleepy::loseSomeTime(60000);
}
}
int vccINT = (int)readVcc();
// msg-Variable mit Daten zum Versand füllen, die später an das WebScript übergeben werden
snprintf(msg, 20, "s=%d&t=%d&v=%d", SENSORID,analogRead(A1),vccINT) ;
vw_send((uint8_t *)msg, strlen(msg)); // Daten per VirtualWire-Lib versenden
vw_wait_tx(); // Auf kompletten Versandt warten
durchlauf = 1; // Den Durchlauf-Zähler auf 0 setzen, damit das Interval von vorne beginnt
}
}
// readVcc()-Lib von Nathan Chantrell
// Gibt die Spannung der Stromversorgung in mV aus
// https://github.com/nathanchantrell/TinyTX/blob/master/TinyTX_DS18B20/TinyTX_DS18B20.ino
long readVcc() {
bitClear(PRR, PRADC);
ADCSRA |= bit(ADEN); // Enable the ADC
long result;
// Read 1.1V reference against Vcc
#if defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0); // For ATtiny84
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); // For ATmega328
#endif
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
// Kalibrierung der VCC-Anzeige
// http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/
// Abschnitt: Improving Accuracy
// scale_constant = internal1.1Ref * 1023 * 1000
// internal1.1Ref = 1.1 * Vcc1 (per voltmeter) / Vcc2 (per readVcc() function)
// Default: 1125300L
// Meine Konstante: 1070860L, errechnet mit 3x1,5V Batterien als VCC
result = 1070860L / result; // Back-calculate Vcc in mV; Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
ADCSRA &= ~ bit(ADEN);
bitSet(PRR, PRADC); // Disable the ADC to save power
return result;
}
Das Senden klappt aber der analog Wert wird immer mit 1023 übertragen.
Vielen dank für eure Mühe!