Utilizando vários módulos HX711 com a captura em paralelo!
Este código esta em construção, por enquanto somente a captura do canal A esta disponível em cada modulo HX711.
Resolvi atualizar no BLOG, pois acredito que a base para a captura em paralelo já foi construída, e para que não fosse dado um passo muito longo entre as postagens.
A ideia é para X amostras:
1 – Disparar a conversão dos N módulos HX711
2 – Verificar qual já módulo HX711 terminou a conversão
3- Captura o que já terminou a conversão
3.1 – voltar a disparar a captura para este modulo
4 – Voltar a (2) verificar qual módulo HX711 já terminou até atingir X amostras por módulo HX711.
O código abaixo parece estar funcionando a contento para 2 módulos HX 711, ainda não testei com mais módulos.
#define numcelulas 2 // define o mumero de modulos hx711 a serem utilizadas unsigned long tempo = 0; float saida = 0; int DOUT[numcelulas] = A5,A3; // Pinos DT placa HX711 int hxSCK[numcelulas] = A4,A2; // Pino SCK placa HX711 // ALTERAR PARA SUAs CELULAs DE CARGA!!!!! float kconst[numcelulas] = 21097.164, 21097.164; // Fator para Kilograma pequenos pesos //Cria variaveis paras as celulas unsigned long CAPTURAcell[numcelulas]; float pesos[numcelulas]; unsigned long TARA[numcelulas]; unsigned long MEDIAcell[ numcelulas ]; //______________________________________________________________________ // SUBROTINAS //______________________________________________________________________ // Inicia o(s) HX711 void IniciaCAPT( int cell ) digitalWrite(hxSCK[cell], LOW); //______________________________________________________________________ // pega valor HX711 unsigned long Pega( int cell ) CAPTURAcell[cell] = 0; for (int i=0; i<24; i++) // loop 24 pulsos digitalWrite(hxSCK[cell], HIGH); CAPTURAcell[cell] = CAPTURAcell[cell]<<1; digitalWrite(hxSCK[cell], LOW); if(digitalRead(DOUT[cell]) == 1) CAPTURAcell[cell]++; // pulso extra 25 pulsos proxima leitura canal A ganho 128 digitalWrite(hxSCK[cell], HIGH); delayMicroseconds(10); digitalWrite(hxSCK[cell], LOW); //******************************************************** return CAPTURAcell[cell] ^= 0x00800000; //______________________________________________________________________ void CAPTURA(int media) int Pointermedia [numcelulas]; int Pointerblock [numcelulas]; // zera e estarta todas as capturas for (int i = 0; i < numcelulas; i++) CAPTURAcell[i] = 0; MEDIAcell[i] = 0; Pointermedia[i] = 0; Pointerblock [i] = 0; digitalWrite(hxSCK[i], LOW); //****************************** int Aguarda = 0; // Variavel para testar se já capturou todos os canais while (Aguarda < numcelulas ) for (int i = 0; i < (numcelulas); i++) if (digitalRead(DOUT[i])==0 && Pointerblock [i] == 0) MEDIAcell[i] += Pega(i); // Soma o valor capturado ao balde da media //leituras [i][Pointermedia [i]] = MEDIAcell[i]; Pointermedia [i] = Pointermedia [i] + 1; // incrementa a cada vez que acrescenta um valor a media if (Pointermedia [i] == media ) // ja capturou todos os valores do canal i MEDIAcell[i] = (long) MEDIAcell[i]/media; // divide o valor do balde pelo numero de amostras Pointerblock [i] = 1; // Bloqueia canal i pois ja encheu o balde Aguarda++; // incrementa quando terminou a captura no canal i else IniciaCAPT(i); // inicia a proxima captura //______________________________________________________________________ void setTARA() // reseta o conversores HX711 for (int i = 0; i < numcelulas; i++) digitalWrite(hxSCK[i], HIGH); delay (200); for (int i = 0; i < numcelulas; i++) digitalWrite(hxSCK[i], LOW); delay (1); // ------------------------- CAPTURA(50); for (int i = 0; i < numcelulas; i++) TARA[i] = MEDIAcell[i]; //______________________________________________________________________ void Peso() CAPTURA(20); for (int i = 0; i < numcelulas; i++) pesos[i] = (long)(MEDIAcell[i] - TARA[i]); pesos[i] = (float) pesos[i] / kconst[i]; //______________________________________________________________________ // FIM SUBROTINAS //______________________________________________________________________ void setup() Serial.begin(115200); pinMode(hxSCK[0], OUTPUT); pinMode(hxSCK[1], OUTPUT); pinMode(DOUT[0], INPUT); pinMode(DOUT[1], INPUT); Serial.println("Aguarde estou zerando!"); setTARA() ; Serial.println("Estou pronto!"); //______________________________________________________________________ void loop() tempo = millis(); Peso(); tempo = millis()-tempo; for (int i = 0; i < numcelulas ; i++) Serial.print("Celula"); Serial.print(i); Serial.print(" = "); Serial.print(pesos[i],3); Serial.print(" Kg, "); Serial.print("Tempo= "); Serial.print(tempo); Serial.print(" ms"); Serial.print(", SPS= "); Serial.print(float(20000/tempo)); // 125 Amostras Serial.println(" Amostras/segundo p/ todos canais");
O primeiro teste foi feito com um módulo modificado capturando em ~90SPS e um módulo mini HX711 sem alterações com ~11SPS:
O resultado foi conforme o esperado, o módulo HX711 mais lento determinou o valor de amostras por segundos para todo o grupo.
Modifiquei o módulo MiniHx711 (muito fácil de alterar) para que ele passa-se a capturar mais vezes por segundo.
O segundo teste foi feito com um módulo modificado capturando em ~90SPS e um módulo mini HX711 modificado com ~90SPS:
No momento estou usando uma célula de carga de 20Kg e uma célula de carga de 2Kg sem seus fatores K ajustados. Para estes testes iniciais os valores em quilogramas não estarem ajustados não era importante.
Para os próximos passos, vou montar as células de carga em uma bancada mais adequada para realizar a calibração, (ajuste do fator K individual) e depois vou realizar outros testes comum maior rigor.
HX711 – Vários módulos HX711 em paralelo!