Я только начинаю свой путь освоения ардуино. Возник вопрос, который я пока не могу осилить самостоятельно. Есть тензодатчик с драйвером HX711 и ардуино. Задача получить показания используя прерывания. Т. е. как только значение на датчике изменилось, прервать выполнение основной программы и получить значение и вернуться к выполнению основного цикла.
#include <HX711.h>
#define SENSOR_DT_PIN 2
#define SENSOR_SCK_PIN 3
HX711 sensor;
volatile int weight;
float sensorCalibration = 0.014822222; // Значение подбирается в ручную
void setup() {
Serial.begin(9600);
sensor.begin(SENSOR_DT_PIN, SENSOR_SCK_PIN);
sensor.set_scale();
sensor.tare();
sensor.set_scale(sensorCalibration);
attachInterrupt(0, getWeight, CHANGE);
}
void loop(){
// Какой-то код
}
void getWeight() {
weight = sensor.get_units()*0.035274;
}
Данный код не работает. Может кто знает или подскажет где искать решение?
Надо написать нормальный автомат, который будет включать прерывание когда надо их ждать, и выключать при первом срабатывании, иначе одному богу известно, что за фарш получится тут. И в исходниках библиотеки покопаться, чтобы понять, что там вообще происходит и как оно склеится с таким режимом.
ну да
не я посмотрел что его нет и понял что вы хотите по первому фронту на дата пине инициировать чтение, но что бы дата заколыхалась, надо дергать клоком сначала.
ну это так, навскидку и даташит по диагонали.
Есть моменты когда основной код программы может зайти в бесконечный цикл. Цикл ждёт пока пользователь не нажмёт на кнопку или пока не изменится вес. У меня есть реализация где я тупо вызываю в нескольких местах метод getWeight. Просто подумал что можно дело как-то автоматизировать.
int weight;
void loop(){
weight = getWeight();
if(weight > 0){
//Идут расчёты
flag = true;
while(flag){
//Здесь я жду пока пользователь нажмёт на кнопку или пока не изменится вес
// В этом случае я буду вызывать повторно метод getWeight()
// Вот я подумал если это сделать с помошью прерывания так как меньше вызовов метода будет тем самым и быстрее работать. А таких циклов пока что у меня несколько
}
}
}
int getWeight() {
return sensor.get_units()*0.035274;
}
Т.е. хочу избавиться от лишних проверок и реагировать только на изменения
1). Это не драйвер, а АЦП.
2). Те экземпляры, которые попадались мне сильно шумят, один и тот же груз дает всегда разные результаты даже с усреднением.
3). Дешевые тензодатчики под нагрузкой плывут, чтобы получить более-менее достоверные результаты нужно снять нагрузку, установить 0, и только после этого взвешивать.