Hi,
zum Glück habe ich jetzt wieder Zeit, um mich ein bisschen mit dem Programmieren zu beschäftigen.
Als nächstes Projekt möchte ich, abhängig von verschiedenen Messwerten, bestimmte Geräte steuern.
Erfasst werden soll: Die Temperatur, Luftfeuchte, Wind, ...
Bei der Temperatur und Luftfeuchte möchte ich analoge Sensoren verwenden, da ich solche noch in der Werkstatt habe.
Der Arduino UNO hat einen 10 Bit ADW - heißt also ich kann 0 -5 V mit 1024 Schritte auflösen. Bei der Feuchte passt's, die kann ich mit einer Dezimalstelle ausgeben. Bei der Temperatur wird's eng! Deshalb möchte ich die Auflösung des ADWs erhöhen.
Ohne einen externen ADW habe ich nur die Möglichkeit Oversampling zu betreiben. Nach meinen Recherchen ist das nichts anderes, als sehr sehr oft zu Messen (> 16 Hz).
Dazu habe ich folgenden Code zusammenkopiert:
#define BUFFER_SIZE 16 // For 12 Bit ADC data
volatile uint32_t result[BUFFER_SIZE];
volatile int i = 0;
volatile uint32_t sum=0;
/*ADC and Timer1 setup function
Argument 1: uint8_t channel must be between 0 and 7
Argument 2: int frequency must be integer from 1 to 600
WARNING! Any value above 600 is likely to result in a loss
of data and could result in a reduced accuracy of ADC
conversions
*/
void setup()
{
Serial.begin(9600);
pinMode(A2, INPUT);
setupADC(2, 16);
}
void loop()
{
delay(1500);
Serial.println("TEST TEST");
}
void setupADC(uint8_t channel, int frequency)
{
cli();
ADMUX = channel | _BV(REFS0);
ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0) | _BV(ADATE) | _BV(ADIE);
ADCSRB |= _BV(ADTS2) | _BV(ADTS0); //Compare Match B on counter 1
TCCR1A = _BV(COM1B1);
TCCR1B = _BV(CS11)| _BV(CS10) | _BV(WGM12);
uint32_t clock = 250000;
uint16_t counts = clock/(BUFFER_SIZE*frequency);
OCR1B = counts;
TIMSK1 = _BV(OCIE1B);
ADCSRA |= _BV(ADEN) | _BV(ADSC);
sei();
}
ISR(ADC_vect)
{
result[i] = ADC;
i=++i&(BUFFER_SIZE-1);
for(int j=0;j<BUFFER_SIZE;j++)
{
sum+=result[j];
}
if(i==0)
{
sum = sum>>2;
Serial.println(sum,DEC);
}
sum=0;
TCNT1=0;
}
ISR(TIMER1_COMPB_vect)
{
}
Jetzt gibt der mir am Serial-Monitor sehr viele Werte aus, bis er mal das "TEST TEST" ausgibt - ich möchte aber doch nur einen. So wie man es von analogRead() gewöhnt ist.
Was mache ich da falsch? Wo muss ich mir den Messwert abknöpfen? Und wie müsste ich den Code modifizieren, dass nur z.B. alle 5 Sek. eine Messung gemacht wird?
Ich bin ehrlich gesagt ziemlich überfordert damit...... :~ :~
Problem 2: Der Feuchtesensor (Poti) ist nicht linear. Wie erhalte ich da "das beste" Ergebnis? Mit Excel kann man eine Nährungsformel erstellen, aber ist das auch genau?
Wäre schön, wenn Ihr bei meinen vielen Problemen helfen könntet.
Gruß
Jan