I’m working on a project using Arduino to control a test machine for compression/tension. The displacement is calculated based on pulses from a sensor connected to a digital input. The logic for calculating the displacement works perfectly when the test is not active, but as soon as the test starts, the displacement value freezes at 0 and does not update.
Here is the simplified loop code:
cpp
Copy code
<code>void loop() {
// Verifica comandos recebidos via Serial
if (Serial.available() > 0) {
String command = Serial.readStringUntil('n');
command.trim();
if (command == "C") {
calibrateScale();
} else if (command == "N") {
resetCalibration();
} else if (command == "IC") {
contagemRegressiva();
x = 0; // Reseta o contador
displacement = 0; // Reseta o deslocamento
ensaioAtivo = true; // Inicia o ensaio
TEnsaio = "COMPRESSAO...";
} else if (command == "IT") {
contagemRegressiva();
x = 0; // Reseta o contador
displacement = 0; // Reseta o deslocamento
ensaioAtivo = true; // Inicia o ensaio
TEnsaio = "TRACAO...";
} else if (command == "P") {
pararMotor();
ensaioAtivo = false;
lcd.setCursor(0, 0);
lcd.print("STOP S.O.S");
}
}
// Atualiza deslocamento independentemente do ensaio
if (digitalRead(input) == HIGH && state == 0) {
state = 1; // Define o estado para 1
x = x + 1; // Incrementa o contador de pulsos
displacement = x * 2; // Calcula o deslocamento
}
if (digitalRead(input) == LOW) {
state = 0; // Redefine o estado
}
// Lógica do ensaio ativo
if (ensaioAtivo) {
float cargaAtual = abs(scale.get_units());
if (cargaAtual >= MAX_LOAD) {
ensaioAtivo = false;
pararMotor();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CARGA MAX");
lcd.setCursor(0, 1);
lcd.print("P:");
lcd.print(cargaAtual, 2);
lcd.print("N");
} else if (ultimaCarga > 2 && (ultimaCarga - cargaAtual) / ultimaCarga >= LOAD_DROP_THRESHOLD) {
ensaioAtivo = false;
pararMotor();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RUPTURA OK!");
lcd.setCursor(0, 1);
lcd.print("P:");
lcd.print(ultimaCarga, 2);
lcd.print("N");
} else {
// Exibe informações do ensaio durante a execução
lcd.setCursor(0, 0);
lcd.print(TEnsaio);
lcd.setCursor(0, 1);
lcd.print("d:");
lcd.print(displacement, 0); // Exibe deslocamento
lcd.print("mm ");
lcd.print("P:");
lcd.print(cargaAtual, 2);
lcd.print("N");
}
ultimaCarga = cargaAtual;
delay(200);
}
// Exibe deslocamento no monitor Serial
Serial.print("Deslocamento: ");
Serial.print(displacement);
Serial.println(" mm");
}
</code>
<code>void loop() {
// Verifica comandos recebidos via Serial
if (Serial.available() > 0) {
String command = Serial.readStringUntil('n');
command.trim();
if (command == "C") {
calibrateScale();
} else if (command == "N") {
resetCalibration();
} else if (command == "IC") {
contagemRegressiva();
x = 0; // Reseta o contador
displacement = 0; // Reseta o deslocamento
ensaioAtivo = true; // Inicia o ensaio
TEnsaio = "COMPRESSAO...";
} else if (command == "IT") {
contagemRegressiva();
x = 0; // Reseta o contador
displacement = 0; // Reseta o deslocamento
ensaioAtivo = true; // Inicia o ensaio
TEnsaio = "TRACAO...";
} else if (command == "P") {
pararMotor();
ensaioAtivo = false;
lcd.setCursor(0, 0);
lcd.print("STOP S.O.S");
}
}
// Atualiza deslocamento independentemente do ensaio
if (digitalRead(input) == HIGH && state == 0) {
state = 1; // Define o estado para 1
x = x + 1; // Incrementa o contador de pulsos
displacement = x * 2; // Calcula o deslocamento
}
if (digitalRead(input) == LOW) {
state = 0; // Redefine o estado
}
// Lógica do ensaio ativo
if (ensaioAtivo) {
float cargaAtual = abs(scale.get_units());
if (cargaAtual >= MAX_LOAD) {
ensaioAtivo = false;
pararMotor();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CARGA MAX");
lcd.setCursor(0, 1);
lcd.print("P:");
lcd.print(cargaAtual, 2);
lcd.print("N");
} else if (ultimaCarga > 2 && (ultimaCarga - cargaAtual) / ultimaCarga >= LOAD_DROP_THRESHOLD) {
ensaioAtivo = false;
pararMotor();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RUPTURA OK!");
lcd.setCursor(0, 1);
lcd.print("P:");
lcd.print(ultimaCarga, 2);
lcd.print("N");
} else {
// Exibe informações do ensaio durante a execução
lcd.setCursor(0, 0);
lcd.print(TEnsaio);
lcd.setCursor(0, 1);
lcd.print("d:");
lcd.print(displacement, 0); // Exibe deslocamento
lcd.print("mm ");
lcd.print("P:");
lcd.print(cargaAtual, 2);
lcd.print("N");
}
ultimaCarga = cargaAtual;
delay(200);
}
// Exibe deslocamento no monitor Serial
Serial.print("Deslocamento: ");
Serial.print(displacement);
Serial.println(" mm");
}
</code>
void loop() {
// Verifica comandos recebidos via Serial
if (Serial.available() > 0) {
String command = Serial.readStringUntil('n');
command.trim();
if (command == "C") {
calibrateScale();
} else if (command == "N") {
resetCalibration();
} else if (command == "IC") {
contagemRegressiva();
x = 0; // Reseta o contador
displacement = 0; // Reseta o deslocamento
ensaioAtivo = true; // Inicia o ensaio
TEnsaio = "COMPRESSAO...";
} else if (command == "IT") {
contagemRegressiva();
x = 0; // Reseta o contador
displacement = 0; // Reseta o deslocamento
ensaioAtivo = true; // Inicia o ensaio
TEnsaio = "TRACAO...";
} else if (command == "P") {
pararMotor();
ensaioAtivo = false;
lcd.setCursor(0, 0);
lcd.print("STOP S.O.S");
}
}
// Atualiza deslocamento independentemente do ensaio
if (digitalRead(input) == HIGH && state == 0) {
state = 1; // Define o estado para 1
x = x + 1; // Incrementa o contador de pulsos
displacement = x * 2; // Calcula o deslocamento
}
if (digitalRead(input) == LOW) {
state = 0; // Redefine o estado
}
// Lógica do ensaio ativo
if (ensaioAtivo) {
float cargaAtual = abs(scale.get_units());
if (cargaAtual >= MAX_LOAD) {
ensaioAtivo = false;
pararMotor();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CARGA MAX");
lcd.setCursor(0, 1);
lcd.print("P:");
lcd.print(cargaAtual, 2);
lcd.print("N");
} else if (ultimaCarga > 2 && (ultimaCarga - cargaAtual) / ultimaCarga >= LOAD_DROP_THRESHOLD) {
ensaioAtivo = false;
pararMotor();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RUPTURA OK!");
lcd.setCursor(0, 1);
lcd.print("P:");
lcd.print(ultimaCarga, 2);
lcd.print("N");
} else {
// Exibe informações do ensaio durante a execução
lcd.setCursor(0, 0);
lcd.print(TEnsaio);
lcd.setCursor(0, 1);
lcd.print("d:");
lcd.print(displacement, 0); // Exibe deslocamento
lcd.print("mm ");
lcd.print("P:");
lcd.print(cargaAtual, 2);
lcd.print("N");
}
ultimaCarga = cargaAtual;
delay(200);
}
// Exibe deslocamento no monitor Serial
Serial.print("Deslocamento: ");
Serial.print(displacement);
Serial.println(" mm");
}
New contributor
Lewys Len is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.