Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///////////////////////////////////////////////////////
- //
- // AS-MLV_P VOC Sensor
- //
- // Test program
- //
- // (c) 2014 by Koepi
- //
- ///////////////////////////////////////////////////////
- #include <stdio.h>
- #define heater 0b00000100 // Heater VCC on D2 (PinD2)
- #define sensor 0b00000001 // Sensor VCC/Input on A0 (PinC0)
- #define GREEN 0b00001000 // RGB LED green
- #define BLUE 0b00010000 // RGB LED blue
- #define RED 0b00100000 // RGB LED red
- volatile uint16_t sensor_val = 0;
- uint32_t sensor_ovs = 0;
- volatile uint32_t timer = 0;
- volatile uint16_t milliseconds = 0;
- volatile bool sent = false;
- volatile uint8_t ms_old = 0;
- ISR(TIMER0_COMPA_vect)
- {
- milliseconds++;
- if (milliseconds == 1001) {
- milliseconds = 0;
- timer++;
- }
- if (milliseconds & 0x02) { // PWM duty 25% for LED - switch on every 2nd uneven ms.
- if (sensor_val<500) {
- PORTD |= GREEN;
- } else if (sensor_val<1000) {
- PORTD |= BLUE;
- } else if (sensor_val>=1000) {
- PORTD |= RED;
- }
- } else PORTD&=~(RED|GREEN|BLUE); // switch all LEDs off again. It's PWM! ;)
- }
- void setup() {
- // setup the sensor
- DDRD |= heater; // Heater is OUTPUT
- PORTD &= ~(heater); // Heater is OFF
- DDRC &= ~(sensor); // Sensor is INPUT
- PORTC &= ~(sensor); // Disable PullUp
- // ADC setup
- ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)); //Prescaler at 128 -> 125Khz ADC clock source
- ADMUX |= (1<<REFS1); // Avcc(+5v) as voltage reference
- ADMUX |= 0; // Pin A0 -> No change in MUX register...
- ADCSRA |= (1<<ADEN); //Power up the ADC
- ADCSRA |= (1<<ADSC); //Start converting
- // setup the LED
- DDRD |= RED | GREEN | BLUE; // RGB LED is OUTPUT
- // setup timer for LED PWM
- cli(); // disable global interrupts
- TCNT0 = 0; // reset Timer2 counter value
- TCCR0A = (1 << WGM01); // CTC mode
- TCCR0B = (1 << CS02) | (1 << CS00); // Prescaler 1024
- OCR0A = 15; // 1000 Hz, Prescaler 1024 -> F_CPU / 1024 (Prescaler) /1000 (Hz) -1 -> 15,625Hz
- TIMSK0 = (1<<OCIE0A); // enable comapre-match OCR2A interrupt
- sei(); // start global interrupts
- // for monitoring
- Serial.begin(115200);
- }
- void loop() {
- char text[16];
- if ((milliseconds >= 100) && (milliseconds <=120)) { // heat up the sensor
- if (milliseconds & 0x01) PORTD |= heater; // turn on heating
- else PORTD &= ~(heater); // turn off heating
- }
- if (milliseconds == 121) PORTD &= ~(heater); // turn off heating
- if (milliseconds == 200) { // measure the sensor
- for (int i=0; i<64; i++) { // Oversampling
- ADCSRA |= (1<<ADSC); // Start a new conversion
- cli(); // disable interrupt
- while(ADCSRA & (1<<ADSC)); // Wait for the conversion to finish
- sensor_ovs += ADC << 1;
- sei(); // enable interrupts
- }
- sensor_val = (sensor_ovs >> 5);
- sensor_ovs=0;
- sent = false;
- milliseconds+=24; // compensate for measuring time
- }
- if (milliseconds == 250) { // print out results via serial console
- if (!sent) {
- sprintf(text, "$1;1;%u;",timer);
- Serial.print(text);
- sprintf(text, "%u;0",sensor_val);
- Serial.println(text);
- sent = true;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement