Hola que tal, soy nuevo con el tema de arduino y tengo un problema con las lectura continuas de mi potenciometro cuando estoy usando la funcion de interrupciones.
Necesito adquirir los datos sin alteraciones de mi potenciometro que funciona como acelerador, y que tambien lea los pulsos del sensor hall para hacer el calculo de rpm.
Ya lee tranquilamente los rpm, pero altera los datos del potenciometro que me imagino que es por la funcion de interrupcion.
Mi codigo esta adjuntado abajo.
Por favor si alguien me pudiera ayudar, estaría muy agradecido.
rpmpotenciometro.ino (2.6 KB)
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{
B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000
}
;
#define SSD1306_LCDHEIGHT 64
#if (SSD1306_LCDHEIGHT != 64)
#error(“Height incorrect, please fix Adafruit_SSD1306.h!”);
#endif
//——code for RPM—————-
int encoder_pin = 2;
bool x1=false;
int out1 = 0;
// The pin the encoder is connected
unsigned int rpm;
// rpm reading
volatile byte pulses;
// number of pulses
unsigned long timeold;
// The number of pulses per revolution
// depends on your index disc!!
unsigned int pulsesperturn = 1;
float vel;
void counter()
{
//Update count
pulses++;
out1=analogRead(A0);
x1=true;
}
//———————————–
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(encoder_pin, INPUT);
attachInterrupt(0, counter, FALLING);
// Initialize
pulses = 0;
rpm = 0;
timeold = 0;
}
void loop()
{
delay(1000);
//Don’t process interrupts during calculations
detachInterrupt(0);
//out1=analogRead(A0);
rpm= (60*1000/pulsesperturn)/(millis()-timeold)*pulses;
timeold = millis();
pulses = 0;
//Write it out to serial port
//Serial.print("RPM = ");
Serial.print(rpm,DEC);
Serial.print(",");
updateDisplay(rpm);
if(x1){
Serial.println(out1);
x1=false;
}
//Serial.println(out1);
//Restart the interrupt processing
attachInterrupt(0, counter, FALLING);
}
int valLen;
int displayWidth = 128;
int letterWidth = 18;
void updateDisplay(int rpm){
if(rpm > 9999)
valLen = 5;
else if(rpm > 999)
valLen = 4;
else if(rpm > 99)
valLen = 3;
else if(rpm > 9)
valLen = 2;
else
valLen = 1;
//————-update display————
display.clearDisplay();
// text display tests
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(5,0);
display.println("KM/h");
display.setTextColor(BLACK, WHITE);
// ‘inverted’ text
//display.println(3.141592);
display.setTextSize(1.8);
display.setTextColor(WHITE);
display.setCursor((displayWidth/2)-(letterWidth/valLen)+20,7);
display.println(rpm);
// display.println(0xDEADBEEF, HEX);
display.display();
//———————-
}
Te falto mencionar el tipo de Arduino que estas usando.
Estas usando un método no recomendado.
int encoder_pin = 2;
attachInterrupt(0, counter, FALLING);
Usa este método mejor.
const byte encoder_pin = 2;
attachInterrupt(digitalPinToInterrupt(encoder_pin), counter, FALLING);
Luego hablas de un potenciometro pero no nos dice donde/como esta conectado o que quieres que haga dicho potenciometro.
Identica pregunta para el sensor de sala.
Si perdón. Estoy usando un arduino Nano, lo que pasa es que estoy adaptando un motor de 2000w con su controlador para mi proyecto. La senal de acelerador la separe para adaptar un potenciómetro.
La relación motor-controlador no la estoy tocando, sino el acelerador.
Cole un imán en el disco caliper y un sensor hall simétrico donde garcias al mismo arduino nano logro ver los rpm.
Necesito encontrar la relación de rpm(motor) -voltaje acelerador (potenciómetro ).
Para procesar los datos.
El programa me da los rpm, pero no me da los valores del potenciómetro en la entrada analogica, ya que me entrega valores incuerentes
Andropp:
Cole un imán en el disco caliper y un sensor hall simétrico donde garcias al mismo arduino nano logro ver los rpm.
Hablas español o es una traduccion con Google ? Yo no te entiendo.
Otra forma de poner lo que indicó Kike sería saber cuales son las interrupciones disponibles en tu Arduino, para el UNO son INT0 en pin2 cosa de la que hablamos, e INT1 en pin3.
Esto resume lo que necesitas.
attachInterrupt(INT0, counter, FALLING);