Show Posts
Pages: 1 2 [3] 4 5 ... 10
31  Using Arduino / Microcontrollers / Uneven respone to interrupt command on: September 02, 2012, 12:38:16 am
Hi,
I am struggeling with the accuracy of interrupt in Duemilanove 328. What I try to do is to get a quick and even response to an interrupt getting a HIGH to pin13.

Here is my issue: I am pushing a 5V signal into a interrupt 0 and want to get a immediate response. The acuracy shall be below +/-4 microseconds.

Below is the code I used.

I used the command "attachInterrupt(0, ignite, RISING);" command to put the LEDpin to high. I attached an oscilloscope screenshot of  showing the outcome. The interrupt trigger is very much left. The next rising signal (response1) is the response to it I normally get- which would be fine. But for whatever reason there is sometimes a response (response2) which is 20 micros delayed- and only 20 micros..not more and not less. This photo contains both response signals because I used a long exposure time with my camera to get some kind of overlaying signals.

Here is my question. How can I avoid this irregular response?


Code:
#include <EEPROM.h>
#include <avr/pgmspace.h>

int maps[4][23] = {
     {110, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0, 7500     } 
  ,  {310, 300, 290, 280, 270, 260, 250, 240, 230, 220, 210, 200, 190, 180, 170, 160, 150, 140, 130, 120, 110, 100, 7500} 
  ,  {410, 400, 390, 380, 370, 360, 350, 340, 330, 320, 310, 300, 290, 280, 270, 260, 250, 240, 230, 220, 210, 200, 7500} 
  ,  {510, 500, 490, 480, 470, 460, 450, 440, 430, 420, 410, 400, 390, 380, 370, 360, 350, 340, 330, 320, 310, 300, 7500} 
};

int lowgreenrpm=500;   
int lowyellowrpm=3000;   
int lowredrpm=4000;   

int dwell=2500;

//Shift register
#include <Shifter.h>
#define SER_Pin 5 //SER_IN
#define RCLK_Pin 4 //L_CLOCK
#define SRCLK_Pin 3 //CLOCK
#define NUM_REGISTERS 1 //how many registers are in the chain
Shifter shifter(SER_Pin, RCLK_Pin, SRCLK_Pin, NUM_REGISTERS);
//Shift register


//LCD
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

unsigned long refresh=0;         
unsigned long refreshold=0;     
unsigned long refreshtarget=500; 
//LCD


#define FASTADC 1
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

//Analoge Eingänge
int MAPPin=A0;         //Map Selektor
int baseZZPPotiPin=A1;
int EGTPin=A2;
int IATPin=A3;     

int baseZZPPin = 6; 
int LEDpin=13;              //Input trigger auf Board LED zeigen


//Verschiedene Variablen
int baseZZPPinstat;
int baseZZPPinstatold;
int EEPROMval;
int EGTval=0;         
int IATval=0;         
int MAPval;   
int z=1;
unsigned long delaycalc;
unsigned long mi;


unsigned long microshigh1; 
unsigned long microshigh2; 
float deltamicros; 
int delayignitionmicros=0;

int LEDbaseign = 13;
int LEDtrigger=11;

int RPMsteps[] = {  500,1000,1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000,7500,8000,8500,9000,10000,10500,11000};



int RPM;   //gemittelter Wert
int RPM1;  //Erster Wert der Mittelung
int RPM2;  //Zweiter Wert der Mittelung
float RPM3;  //Dritter Wert der Mittelung

int ignlow;
int ignhigh;
int retardlow;
int retardhigh;
float zzp;
float delayzzp;       
float baseZZP;       
float baseZZPadjust; 

void setup()
{
  Serial.begin(115200);

#if FASTADC
  sbi(ADCSRA,ADPS2) ;
  cbi(ADCSRA,ADPS1) ;
  cbi(ADCSRA,ADPS0) ;
#endif

  pinMode(baseZZPPin, INPUT);
  pinMode(LEDpin, OUTPUT);
 
  attachInterrupt(0, ignite, RISING);

  baseZZP=250;
  baseZZPadjust=EEPROM.read(1); //Korrektur ZZP aus EEPROM
 
//LCD Displaygrösse definieren 
  lcd.begin(16, 2);

  shifter.clear(); //set all pins on the shift register chain to LOW
  shifter.write(); //send changes to the chain and display them
}

void loop(){
 
external();  //lcd1();   //LCD Display Funktion Aktivierung
}

void ignite()
{
 
 mi=micros();


  digitalWrite(LEDpin, HIGH);//für LED
  microshigh2 = micros();
  deltamicros= microshigh2-microshigh1;
  digitalWrite(LEDpin, LOW);//für LED
  zzpcalc(); //Starte Berechnung des ZZP sofort nach Zündung
}

void lcd1()
{
}




void zzpcalc(){
//MAPval=1;
  //Errechnung der Drehzahl aus deltamicros und Mittelung der Drehzahl über die letzten 3 Werte
  RPM1=RPM2;
  RPM2=RPM3;
  RPM3=((1/ deltamicros)*60000000.0);   //Errechnung aktuellen der Drehzahl
  RPM= (RPM1+RPM2+RPM3)/3;           //Gemittelte Drehzahl zur weiteren Benutzung
  if (RPM3<100) (RPM=500);  //Falls bei der ersten Umdrehung noch keine Drehzahl errechnet werden kann oder 0 ist werden 500RPM angenommen
  microshigh1=  microshigh2; //Alten Wert in Buffer legen

  // Feststellen welche Spalte der ZZP und DrehzahlMap ausgelesen wird
  ignlow= (RPM/500)-1;
  ignhigh=ignlow+1;
  retardlow = maps[MAPval][ignlow]; //unterer ZZP Datenpunkt der Map zur interpolation
  retardhigh = maps[MAPval][ignhigh]; //oberer ZZP Datenpunkt der Map zur interpolation

if (RPM<500) {
retardlow=100;
retardhigh=100;
}

  zzp=((((float)retardlow +((float)RPM-RPMsteps[ignlow])*(((float)retardhigh-(float)retardlow)/((float)RPMsteps[ignhigh]-(float)RPMsteps[ignlow])))));//Lineare Interpolation//
  delayzzp= (deltamicros/360.00)*((baseZZP-(float)baseZZPadjust-(float)zzp)/10.0); // Erechnung des zeitlichen Verzögerung der Zündauslösung inklusive des Basiszündzeitpunkts
 
if (RPM>(maps[MAPval][22])) (delayzzp=100000); //Drehzahlbegrenzer: Zündung wird in einen Bereich verschoben, der später als der nächste Trigger liegt

if (baseZZPPinstat==HIGH){
  delayzzp= (deltamicros/360.00)*((baseZZP-(float)baseZZPadjust)/10); // Erechnung des zeitlichen Verzögerung der Zündauslösung inklusive des Basiszündzeitpunkts
}

}

void external(){ 
  if (z==1)   //einlesen EGT
  { 
EGTval= analogRead(EGTPin);
EGTval= EGTval/20;
  }


  if (z==2)   //Analogread Map (mit Zuweisung der Map)
 
 
  {   
    MAPval= analogRead(MAPPin);
if   ((MAPval>0) && (MAPval<256)) MAPval=0;
if   ((MAPval>257) && (MAPval<512)) MAPval=1;
if   ((MAPval>513) && (MAPval<767)) MAPval=2;
if   ((MAPval>768) && (MAPval<1024)) MAPval=3;

     }



  if (z==3)   //lese IAT und errechne Temperatur
  { 
 
IATval= analogRead(IATPin);  //WERT= 850
IATval= 731;
if (IATval>=466)(IATval=-0.1124*IATval+102.3);
if (IATval<466)(IATval=0.006*(IATval*IATval)-0.5229*IATval+169.35);

  }

  //***************************************************************
  //Schaltanzeige
  //***************************************************************
  if (z==4)   //DigitalRead für Displayumschaltung
  { 
    if (RPM > lowgreenrpm){
      if (RPM < lowyellowrpm)
      {
        shifter.setPin(0, LOW); //set pin 1 in the chain(second pin) HIGH
        shifter.setPin(1, HIGH); //set pin 1 in the chain(second pin) HIGH
        shifter.setPin(2, HIGH); //set pin 1 in the chain(second pin) HIGH
        shifter.write(); //send changes to the chain and display them
      }

      if (RPM > lowyellowrpm)
      {
        shifter.setPin(0, LOW); //set pin 1 in the chain(second pin) HIGH
        shifter.setPin(1, LOW); //set pin 1 in the chain(second pin) HIGH
        shifter.setPin(2, HIGH); //set pin 1 in the chain(second pin) HIGH
        shifter.write(); //send changes to the chain and display them
      }


      if (RPM > lowredrpm)
      {
        shifter.setPin(0, LOW); //set pin 1 in the chain(second pin) HIGH
        shifter.setPin(1, LOW); //set pin 1 in the chain(second pin) HIGH
        shifter.setPin(2, LOW); //set pin 1 in the chain(second pin) HIGH
        shifter.write(); //send changes to the chain and display them
      }
    }
    else
    {
      shifter.setPin(0, HIGH); //set pin 1 in the chain(second pin) HIGH
      shifter.setPin(1, HIGH); //set pin 1 in the chain(second pin) HIGH
      shifter.setPin(2, HIGH); //set pin 1 in the chain(second pin) HIGH
      shifter.write(); //send changes to the chain and display them
    }

  }
  if (z==5)   //Basiszündzeitpunkt Funktion
  { 
    baseZZPPinstat= digitalRead(baseZZPPin); //Auslesen des Schalters zum einstellen des BasisZZP
    if (baseZZPPinstat==HIGH) basezzp(); //basezzp einstellen
   
    if (baseZZPPinstat != baseZZPPinstatold)
    { 
      EEPROM.write(1, (baseZZPadjust));  //Schreibt Wert in den nichtflüchtigen Speicher wenn Schalter wieder umgelegt wird
      baseZZPPinstatold=LOW;
      baseZZPadjust=EEPROM.read(1);
    }
    baseZZPPinstatold= baseZZPPinstat;
  }

  // Zähler um die obigen Funktionen abwechselnd auszuführen
  if (z<7) z=z+1;
  if (z>6)  z=1;
  microshigh2 = microshigh1;  //wichtig um die ZZP zu berechnen
}

// Einstellung der Zündung ohne Schwungscheibe abzunehmen (Basezzp)
void basezzp(){ 
  baseZZPadjust= analogRead(baseZZPPotiPin); //angenommen wird ein Verstellbereich von 0 bis 10° KW
  baseZZPadjust= map(baseZZPadjust, 0, 1024, 0, 100);
}

32  Using Arduino / Project Guidance / Re: Arduino CDI with servo controler for motorcycle on: August 13, 2012, 10:53:58 am
Using the coil from TDR? "No" in this case. The Bosch one will replace your one.

May take a look to this page for stepper motor control: http://arduino.cc/hu/Tutorial/StepperUnipolar. May this fits you needs. But I think you need to investigate a little more how the motor works...

Have you searched for manuals how to tune the TDR? I found a few of them (in german unfortunalety) with a few clickes like http://www.yamco.de/tzr125offen.html
 or http://tdr-125.de/. They are speaking about "grounding" a ceratin cable of the CDI...
33  Using Arduino / Project Guidance / Re: Arduino CDI with servo controler for motorcycle on: August 12, 2012, 02:21:12 am
Is it a must for you to re-use the CDI? Why not using a Transistor ignition.

All you need is :
- Any Arduino
- A ignition coil with integrated amplifier (search in ebay for 6N0905104 and you will find a cheap VW Golf one)
- some control circuitry. The circuitry will pull the control pin to GND to charge the coil and remove the GND to fire. All this is done with a cheap NPN Transistor as switch. Pls see here http://www.bosch-motorsport.de/en-US/literature/en-US/Ignition_Module_IM_3.1_Datasheet_51_en_2778273675.pdf for a sample setup. I think the Bosch ignition amplifier was the master of the spare parts "copy".
- some input circuitry getting the TDR125 trigger clean to the Arduino interrupt pin
- Potentially small circuitry "cleaning" the spiky TDR input voltage with a inductor and capacitor
- any housing
34  Using Arduino / Motors, Mechanics, and Power / Re: A Spark plug controlled from the Arduino - Review of guide on: August 11, 2012, 11:44:59 am
Speed is strongly depending on code. But having a 2stroke engine having currently a fixed ignition retard everything is better than that.  A delay of 8microseconds at 8000RPM would mean a 0,4°retard, which is acceptable to me...there is no such accuracy in calibrating the engine with defined air temperature and engine temperature...

Firing a multicylinder 4-stroke engine is much more challenging and I do not have the software knowledg to do so...
35  Using Arduino / General Electronics / Power supply in rough automotive condition on: August 06, 2012, 12:45:18 am
Hi,
I would like to use the UNO in the car and need to make shure the voltage peaks from the car does not kill the board (And I do not trust the connector regarding vibration). Therefore I plan not using the UNO internal voltage controller but an external with according capacitor, coil and diode suppressing the voltage peaks. A LM2940 is the voltage regulator down to 5V.

Can I feed the 5V from the 2940 directly into the 5V pins on the board or does the UNO voltage controller on the board is being overstressed?
36  Using Arduino / Programming Questions / Re: Arduino drops time with interrupt time measurement on: July 28, 2012, 02:23:25 pm
Dear all,
I have found the issue. The code for blinking the trigger is based on mS and the ISR is based on microseconds. So I changed the code to the following:

Code:
int pin = 13;
volatile int state = LOW;
const int ledPin =  12;      // the number of the LED pin
int ledState = LOW;             // ledState used to set the LED
unsigned long previousMillis = 0;        // will store last time LED was updated
unsigned long interval = 1000;           // interval at which to blink (milliseconds)

int trigger = 13;     // Trigger Ausgnag
volatile unsigned long microshigh1;  //Microsekunden wenn der Trigger auf HIGH geht- vorheriger  Trigger
volatile unsigned long microshigh2;  //Microsekunden wenn der Trigger auf HIGH geht- aktueller Trigger
volatile unsigned long deltamicros;  //Abstand zweier high Flanken


void setup()
{
  //Wie werden die Arduino ÜPins benutzt?
  Serial.begin(115200);
  pinMode(pin, OUTPUT);
  attachInterrupt(0, ignite, CHANGE);  //put interrupt on pin 2--->  Triggereingang
  pinMode(ledPin, OUTPUT);// Virtueller trigger

}
void loop()

  unsigned long currentMillis = micros();

  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
 Serial.println(deltamicros);
  }
}


void ignite()
{
 
  digitalWrite(pin, state);
  digitalWrite(10, LOW);
  microshigh2 = micros();
  deltamicros= microshigh2-microshigh1;
 
  microshigh1=  microshigh2;
 state = !state;
}

And the result with 1000microseconds is reasonable good including SerialPrint:

Deltamicros   Difference
100000   
100012   12
100004   -8
100000   -4
100012   12
100004   -8
100012   8
100000   -12
100004   4
100012   8
100000   -12
100004   4
100012   8
100004   -8
100004   0
100008   4
100000   -8
100008   8
100008   0
100012   4


Thank you all for your support!
37  Using Arduino / Programming Questions / Re: Arduino drops time with interrupt time measurement on: July 28, 2012, 09:31:49 am
Code:
int pin = 13;
volatile int state = LOW;
const int ledPin =  12;      // the number of the LED pin
int ledState = LOW;             // ledState used to set the LED
unsigned long previousMillis = 0;        // will store last time LED was updated
unsigned long interval = 1000;           // interval at which to blink (milliseconds)

int trigger = 13;     // Trigger Ausgnag
unsigned long microshigh1;  //Microsekunden wenn der Trigger auf HIGH geht- vorheriger  Trigger
unsigned long microshigh2;  //Microsekunden wenn der Trigger auf HIGH geht- aktueller Trigger
unsigned long deltamicros;  //Abstand zweier high Flanken


void setup()
{
  //Wie werden die Arduino ÜPins benutzt?
  Serial.begin(115200);
  pinMode(pin, OUTPUT);
  attachInterrupt(0, ignite, CHANGE);  //put interrupt on pin 2--->  Triggereingang
  pinMode(ledPin, OUTPUT);// Virtueller trigger

}
void loop()

  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
 Serial.println(deltamicros);
  }
}


void ignite()
{
 
  digitalWrite(pin, state);
  digitalWrite(10, LOW);
  microshigh2 = micros();
  deltamicros= microshigh2-microshigh1;
 
  microshigh1=  microshigh2;
 state = !state;
}
38  Using Arduino / Programming Questions / Re: Arduino drops time with interrupt time measurement on: July 28, 2012, 07:16:08 am
Ahh- I misunderstood all of you not using SerialPrint at all. Sorry! Now I changed the code and put the command in the loop

Code:
void loop()

  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
 Serial.println(deltamicros);
  }
}

I decreased the speed of blinking to give more time for SerialPrintThe result remains unchanged. Still 1mS variation:

1001504
1001468
1000448
1001476
1000448
1001468
1000448
1001472
1000448

39  Using Arduino / Programming Questions / Re: Arduino drops time with interrupt time measurement on: July 28, 2012, 06:02:26 am
MarkT,
in general I do agree, but
- I need to know if the interrupt is working with a minimum (or at least a defined) delay
- the code shows an intervall of 100mS at 115200baud which should be quick enough to submit the data
- the serial data submission is after the interrupt work...shouldn't lead to a delay

But anyhow I do agree that this is not optimum, but I do not know any other way to control function accuracy and I do not have a oscilloscope
40  Using Arduino / Programming Questions / Re: Arduino drops time with interrupt time measurement on: July 28, 2012, 03:51:58 am
Tried the changed code. Is the modification what you have meant?


First the results in microseconds:
101372   
100356   -1016
101372   1016
101380   8
100348   -1032
101380   1032
101372   -8
100356   -1016
101372   1016
100352   -1020
101376   1024
101380   4
100352   -1028
101376   1024
101372   -4
100352   -1020
101376   1024
101380   4
101372   -8


This is the code

Code:
int pin = 13;
volatile int state = LOW;
const int ledPin =  12;      // the number of the LED pin
int ledState = LOW;             // ledState used to set the LED
unsigned long previousMillis = 0;        // will store last time LED was updated
unsigned long interval = 100;           // interval at which to blink (milliseconds)

int trigger = 13;     // Trigger Ausgnag
unsigned long microshigh1;  //Microsekunden wenn der Trigger auf HIGH geht- vorheriger  Trigger
unsigned long microshigh2;  //Microsekunden wenn der Trigger auf HIGH geht- aktueller Trigger
unsigned long deltamicros;  //Abstand zweier high Flanken


void setup()
{
  //Wie werden die Arduino ÜPins benutzt?
  Serial.begin(115200);
  pinMode(pin, OUTPUT);
  attachInterrupt(0, ignite, CHANGE);  //put interrupt on pin 2--->  Triggereingang
  pinMode(ledPin, OUTPUT);// Virtueller trigger

}
void loop()

  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

void ignite()
{
  state = !state;
  digitalWrite(pin, state);
  digitalWrite(10, LOW);
  microshigh2 = micros();
  deltamicros= microshigh2-microshigh1;
 Serial.println(deltamicros);
  microshigh1=  microshigh2;
}

This wasn't the root cause. I tried to put the microshigh1 and 2 into volatile memory state improving speed...no success as well
41  Using Arduino / Programming Questions / Re: Arduino drops time with interrupt time measurement on: July 28, 2012, 01:29:21 am
You're right. I changed it. Is that the root cause of the timing variation...?
42  Using Arduino / Programming Questions / Arduino drops time with interrupt time measurement on: July 28, 2012, 12:56:31 am
Hi ,
I used a Arduino Duemilanove to generate a 5V trigger signal to be measured by itself through an interrupt (So the microcontroller feeds the trigger is the same as the one measuring it). This is my code

Code:
int pin = 13;
volatile int state = LOW;
const int ledPin =  12;      // the number of the LED pin
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated
long interval = 100;           // interval at which to blink (milliseconds)

int trigger = 13;     // Trigger Ausgnag
unsigned long microshigh1;  //Microsekunden wenn der Trigger auf HIGH geht- vorheriger  Trigger
unsigned long microshigh2;  //Microsekunden wenn der Trigger auf HIGH geht- aktueller Trigger
unsigned long deltamicros;  //Abstand zweier high Flanken


void setup()
{
  //Wie werden die Arduino ÜPins benutzt?
  Serial.begin(115200);
  pinMode(pin, OUTPUT);
  attachInterrupt(0, ignite, CHANGE);  //put interrupt on pin 2--->  Triggereingang
  pinMode(ledPin, OUTPUT);// Virtueller trigger

}
void loop()

  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}


void ignite()
{
  state = !state;
  digitalWrite(pin, state);
  digitalWrite(10, LOW);
  microshigh2 = micros();

  deltamicros= microshigh2-microshigh1;
  Serial.println(deltamicros);
  microshigh1=  microshigh2;
}

The result is the following received by the serial out:

Measured
   time   Variation
101396   
101376   -20
100352   -1024
101376   1024
101372   -4
100356   -1016
101372   1016
101384   12
100344   -1040
101380   1036
100356   -1024
101372   1016

As you see there is pretty much of a variation although I used and interrupt. is that normal and I should not expect a better result?
43  Using Arduino / Programming Questions / Re: How to time how many minutes an output is on on: July 22, 2012, 01:05:40 am
I agree to James that using the millis() value is the right way to go. I do not know how long the Arduino will run without reset, but please be aware that there is an rollover where the millis() counter is flipping back to "0" after appr. 50 days.

44  Using Arduino / Programming Questions / selecting arrays on: July 22, 2012, 01:00:55 am
Hi,
I may have a simple question but I cannot find it it the forum yet:
I have a bunch of arrays like
Code:
int map1[] = { 210, 200, 190, 180, 170, 160, 150, 140, 130, 120, 110, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0 };
int map2[] = { 210, 200, 190, 180, 170, 160, 150, 140, 130, 120, 110, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 0 };

What is basically want to do is using an algo like
Code:
selected= 120/60
This will give me value 2

I am searching for a possibility to retrieve array values like this
Code:
value = (map(selected))[4]

Does anyone have an idea how to do that?
45  Using Arduino / Project Guidance / Re: Homebrew 2-stroke ignition? on: July 06, 2012, 10:49:32 am
Yes- the sensor respone is slower (see Bosch PSA-C Sensor datasheet), but this is only delay in response. I meant the time to measure an analog voltage from the arduino itself is the downside of it.

Pages: 1 2 [3] 4 5 ... 10