Tengo un código donde tengo 2 funciones:
1 - read_loadcell - que lee 5 HX711 (5 celdas de carga)
2 - rpm_read - que se supone que lee rpm usando un sensor inductivo. Básicamente tengo una rueda metálica que tiene 4 agujeros simétricos. Cada vez que un entero está debajo del sensor, obtengo un pin en estado alto.
Ahora mi problema:
- Si ejecuto en loop () solo "read_loadcell" funciona bien.
- Si ejecuto en loop () solo "rpm_read" también funciona bien.
- El problema es que si ejecuto ambos, las rpm ya no funcionan
Entonces la pregunta es ¿cómo puedo hacer que funcionen?
#include "HX711.h"
HX711 scale_GS1(A1, A0);
HX711 scale_GS2(A3, A2);
HX711 scale_GS3(13, 12);
HX711 scale_GS4(11, 10);
HX711 scale_FS(9, 8);
float gs1 = 0, gs2 = 0, gs3 = 0,gs4 = 0, fs = 0;
// read RPM
volatile int rpmcount = 0;
int rpm = 0;
unsigned long lastmillis = 0;
void setup() {
attachInterrupt(0, rpm_fan, RISING);//interrupt cero (0) is on pin two(2).
Serial.begin(9600); //start serial communication
Serial.println(); Serial.println(); Serial.println();
Serial.println("///// WELCOME ///////");
Serial.println();
//set scales
scale_GS1.set_scale(1324);
scale_GS1.tare();
scale_GS2.set_scale(1324);
scale_GS2.tare();
scale_GS3.set_scale(1324);
scale_GS3.tare();
scale_GS4.set_scale(1324);
scale_GS4.tare();
scale_FS.set_scale(1324);
scale_FS.tare();
Serial.println("Readings:");
}
void loop() {
rpm_read();
read_loadcell();
}
void rpm_fan(){ /* this code will be executed every time the interrupt 0 (pin2) gets high.*/
rpmcount++;
}
void rpm_read(){
if (millis() - lastmillis == 1000){ /*Uptade every one second, this will be equal to reading frecuency (Hz).*/
detachInterrupt(0); //Disable interrupt when calculating
rpm = rpmcount * 15; /* Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use rpmcount * 30.*/
Serial.print("RPM =\t"); //print the word "RPM" and tab.
Serial.println(rpm); // print the rpm value.
rpmcount = 0; // Restart the RPM counter
lastmillis = millis(); // Uptade lasmillis
attachInterrupt(0, rpm_fan, RISING); //enable interrupt
}
}
void read_loadcell(){
scale_GS1.power_up();
gs1 = scale_GS1.get_units();
scale_GS1.power_down();
scale_GS2.power_up();
gs2 = scale_GS2.get_units();
scale_GS2.power_down();
scale_GS3.power_up();
gs3 = scale_GS3.get_units();
scale_GS3.power_down();
scale_GS4.power_up();
gs4 = scale_GS4.get_units();
scale_GS4.power_down();
scale_FS.power_up();
fs = scale_FS.get_units();
scale_FS.power_down();
Serial.print("GS1 :\t");
Serial.print(gs1);
Serial.print("\t GS2 :\t");
Serial.print(gs2);
Serial.print("\t GS3 :\t");
Serial.print(gs3);
Serial.print("\t GS4 :\t");
Serial.print(gs4);
Serial.print("\t FS :\t");
Serial.println(fs);
}