ARDUINO Недопонял про прерывания.

kraus

✩✩✩✩✩✩✩
20 Апр 2019
20
1
Есть программа связанная с весами, запускаю, идёт, должна остановиться при выполнении условия. По нажатию кнопки надо опять запустить программу. Как сделать? Ставлю прерывание по 2 пину - останавливается, но как только снимаю груз с весов - опять продолжает.
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Маловато конкретики, скетч бы увидеть.
А так в общем: добавь поднятый флаг "продолжать-работу", постоянно проверяй его в основном цикле: поднят -- продолжаем работу, нет -- стоим. В прерывании только поднимай-опускай этот флаг.
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
В целом как я и сказал, используй флаг. опускай его по достижении нужного веса, и поднимай по кнопке.
 

kraus

✩✩✩✩✩✩✩
20 Апр 2019
20
1
Может что не так? Поставил флаг - не работает. Работает, только все время надо кнопку нажимать чтобы одно показание вылезло.
А надо чтобы весы работали до определённого веса, а после набора нужного веса загорался светодиод и программа останавливалась. После чего ставится на весы тара и снова запускается скетч и т.д..
Может не туда что-нибудь из флажного прописал?
задаём переменную для измерений в граммах

volatile boolean intFlag = false; // флаг


}} }
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Код лучше вставлять так.
Вижу кнопка на прерывании. Тогда, во избежании разных "инцестов" надо делать антидребезг кнопки, программный или аппаратный. Для сенсорных кнопок не нужно.

И что получается. кнопку нажали, выставили intFlag в тру и тут же пошел цикл loop и сразу intFlag стал фальш. Безусловно. Т.е. если intFlag тру, то он фальш.
Занавес.
Если я правильно понял логику, то intFlag в фальш надо ставить там, где пишешь "Interrupt!"

C++:
/ HX711 к Arduino pin 4->CLK 5->DAT 5V->VCC GND->GND
//дИСПЛЕЙ 1602 и oled VCC — 5V GND — GND SDA — A4 SCL — A5
// The HX711 board can be powered from 2.7V to 5V so the Arduino 5V power should be fine.


#include <LiquidCrystal_I2C.h>
#include "HX711.h" /

#define calibration_factor -6600.0 //This value is obtained using the SparkFun_HX711_Calibration sketch
#define LOADCELL_DOUT_PIN 5
#define LOADCELL_SCK_PIN 4

HX711 scale;
LiquidCrystal_I2C lcd(0x27, 16, 2);

int X = 21;
float units; // задаём переменную для измерений в граммах

volatile boolean intFlag = false; // флаг

void setup()
{
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);





pinMode(7, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);

Serial.println("HX711 scale");
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale();
scale.tare(); //Reset the scale to 0//Assuming there is no weight on the scale at start up, reset the scale to 0
scale.set_scale(calibration_factor);//This value is obtained by using the SparkFun_HX711_Calibration sketch
attachInterrupt(0, buttonTick, FALLING);
}
void buttonTick() {
intFlag = true; // подняли флаг прерывания
}
void loop()
{
if (intFlag) {
intFlag = false;
Serial.print("Reading: ");
for (int i = 0; i < 3; i ++)
{
units = + scale.get_units(), 3;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(units);

if ((units * 10) >= X)
{

digitalWrite(7, LOW);
Serial.println("Interrupt!");//КОНЕЦ, СТАВИТСЯ НА ПАУЗУ.Вес с весов убирается. При нажатии кнопки сначала.
}
else
{
digitalWrite(7, HIGH);
}} }