1

Тема: Вкл\Выкл подсветки LCD1602 методом прерывания.

Всем Добрейшего! Выручайте, Нужно прерыванием Вкл\Выкл подсветку у LCD1602. Моя реализация с помощью одного человека не работает, выдает ошибку:

Arduino: 1.8.1 (Windows 10), Плата:"Arduino/Genuino Uno"

Meteo_RX_1:51: error: expected constructor, destructor, or type conversion before ';' token

prerivanie()

              ^

C:\Users\Efendis\AppData\Local\Temp\arduino_modified_sketch_641307\Meteo_RX_1.ino: In function 'void setup()':

Meteo_RX_1:48: error: 'prerivanie' was not declared in this scope

   attachInterrupt(0, prerivanie, CHANGE);

                      ^

C:\Users\Efendis\AppData\Local\Temp\arduino_modified_sketch_641307\Meteo_RX_1.ino: In function 'int prerivanie()':

Meteo_RX_1:53: error: expected ')' before 'lcd'

   if (digitalRead(2) lcd.backlight();

                      ^

C:\Users\Efendis\AppData\Local\Temp\arduino_modified_sketch_641307\Meteo_RX_1.ino: At global scope:

Meteo_RX_1:56: error: expected unqualified-id before '{' token

{

^

exit status 1
expected constructor, destructor, or type conversion before ';' token

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"


#include <SPI.h>                                                                      // Библиотека для работы с шиной SPI
#include "nRF24L01.h"                                                                 // Библиотека радиомодуля
#include "RF24.h"                                                                     // Ещё библиотека радиомодуля
#include <Wire.h>                                                                     // Подключаем библиотеку для работы с I2C-устройствами
#include <LiquidCrystal_I2C.h>                                                        // Подключаем библиотеку для работы с модулем LCD1602_I2C
#include <BMP085.h>

//************************************************************************************************************************************************
// Битовая маска символа
byte temp_cel[8] =
{
  0b00000,
  0b01000,
  0b10100,
  0b01000,
  0b00011,
  0b00010,
  0b00011,
};

byte mmHg[8] =
{
  B00000,
  B00100,
  B00110,
  B00100,
  B00100,
  B01110,
  B01110,
};
//***********************************************************************************************************************************************

BMP085 dps = BMP085();                                                                // Устанавливаем датчик давления
LiquidCrystal_I2C lcd(0x27, 16, 2);                                                   // Устанавливаем дисплей

long Temperature = 0, Pressure = 0;                                                   // Создаем переменные для хранения температуры и давления из BMP185

float temp0, temp1;                                                                   // Создаем переменные для хранения температуры
float data[2];                                                                        // Создаем колическо ячеек хранения данных

RF24 radio(9, 10);                                                                    // Создаем модуль на пинах 9 и 10 Для Уно

byte wachdog = 0;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};           // Возможные номера труб

void setup()
{
  attachInterrupt(0, prerivanie, CHANGE);
}

prerivanie()
{
  if (digitalRead(2) lcd.backlight();
      else lcd.noBacklight();
  }
{
Wire.begin();                                                                       // Включаем работу с I2C-устройствами
  dps.init();                                                                         // Инициализируем датчик давления
  lcd.init();                                                                         // Инициализируем дисплей
  lcd.clear();
  lcd.createChar(1, temp_cel);                                                        // Создаем символ под номером 1 температуры
  lcd.createChar(2, mmHg);                                                            // Создаем символ под номером 2 давление
  radio.begin();                                                                      // Активируем nRF24L01 модуль
  radio.setAutoAck(1);                                                                // Режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);                                                            // Время между попыткой достучаться, число попыток
  radio.enableAckPayload();                                                           // Разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);                                                           // Размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);                                               // Хотим слушать трубу 0
  radio.setChannel(0x60);                                                             // Выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX);                                                     // Уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS);                                                   // Скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp();                                                                    // Включаем (начинаем) nRF24L01 работу
  radio.startListening();                                                             // Начинаем слушать эфир, мы приёмный модуль
}

void loop()
{
  byte pipeNo;
  while ( radio.available(&pipeNo))                                                     // Слушаем эфир со всех труб
  {
    wachdog = 0;
    radio.read( &data, sizeof(data) );                                                    // Чиатем входящий сигнал
  }
  {
    temp0 = data[0];
    temp1 = data[1];
  }
  wachdog++;
  dps.getPressure(&Pressure);
  dps.getTemperature(&Temperature);

  lcd.setCursor(0, 0);
  lcd.print(Temperature * 0.1, 1);
  lcd.print("\1");
  lcd.print(" ");

  lcd.setCursor(10, 0);
  lcd.print(Pressure / 133.3, 1);
  lcd.print("\2");

  lcd.setCursor(0, 1);
  lcd.print(temp0, 1);
  lcd.print("\1");
  lcd.print(" ");

  lcd.setCursor(11, 1);
  lcd.print(temp1, 1);
  lcd.print("\1");
  lcd.print(" ");

  if (wachdog >= 4)
  {
    lcd.setCursor(0, 1);
    lcd.print("                ");
  }
  delay(15000);
}

2

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

#include <SPI.h>                                                                      // Библиотека для работы с шиной SPI
#include "nRF24L01.h"                                                                 // Библиотека радиомодуля
#include "RF24.h"                                                                     // Ещё библиотека радиомодуля
#include <Wire.h>                                                                     // Подключаем библиотеку для работы с I2C-устройствами
#include <LiquidCrystal_I2C.h>                                                        // Подключаем библиотеку для работы с модулем LCD1602_I2C
#include <BMP085.h>

//************************************************************************************************************************************************
// Битовая маска символа
byte temp_cel[8] =
{
  0b00000,
  0b01000,
  0b10100,
  0b01000,
  0b00011,
  0b00010,
  0b00011,
};

byte mmHg[8] =
{
  B00000,
  B00100,
  B00110,
  B00100,
  B00100,
  B01110,
  B01110,
};
//***********************************************************************************************************************************************

BMP085 dps = BMP085();                                                                // Устанавливаем датчик давления
LiquidCrystal_I2C lcd(0x27, 16, 2);                                                   // Устанавливаем дисплей

long Temperature = 0, Pressure = 0;                                                   // Создаем переменные для хранения температуры и давления из BMP185

float temp0, temp1;                                                                   // Создаем переменные для хранения температуры
float data[2];                                                                        // Создаем колическо ячеек хранения данных

RF24 radio(9, 10);                                                                    // Создаем модуль на пинах 9 и 10 Для Уно

byte wachdog = 0;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};           // Возможные номера труб

void setup()
{
  attachInterrupt(0, prerivanie, CHANGE);
  Wire.begin();                                                                       // Включаем работу с I2C-устройствами
  dps.init();                                                                         // Инициализируем датчик давления
  lcd.init();                                                                         // Инициализируем дисплей
  lcd.clear();
  lcd.createChar(1, temp_cel);                                                        // Создаем символ под номером 1 температуры
  lcd.createChar(2, mmHg);                                                            // Создаем символ под номером 2 давление
  radio.begin();                                                                      // Активируем nRF24L01 модуль
  radio.setAutoAck(1);                                                                // Режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);                                                            // Время между попыткой достучаться, число попыток
  radio.enableAckPayload();                                                           // Разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);                                                           // Размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);                                               // Хотим слушать трубу 0
  radio.setChannel(0x60);                                                             // Выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX);                                                     // Уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS);                                                   // Скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp();                                                                    // Включаем (начинаем) nRF24L01 работу
  radio.startListening();                                                             // Начинаем слушать эфир, мы приёмный модуль
}

void prerivanie()
{
  if (digitalRead(2)) lcd.backlight(); else lcd.noBacklight();
}

void loop()
{
  byte pipeNo;
  while ( radio.available(&pipeNo))                                                     // Слушаем эфир со всех труб
  {
    wachdog = 0;
    radio.read( &data, sizeof(data) );                                                    // Чиатем входящий сигнал
  }
  {
    temp0 = data[0];
    temp1 = data[1];
  }
  wachdog++;
  dps.getPressure(&Pressure);
  dps.getTemperature(&Temperature);

  lcd.setCursor(0, 0);
  lcd.print(Temperature * 0.1, 1);
  lcd.print("\1");
  lcd.print(" ");

  lcd.setCursor(10, 0);
  lcd.print(Pressure / 133.3, 1);
  lcd.print("\2");

  lcd.setCursor(0, 1);
  lcd.print(temp0, 1);
  lcd.print("\1");
  lcd.print(" ");

  lcd.setCursor(11, 1);
  lcd.print(temp1, 1);
  lcd.print("\1");
  lcd.print(" ");

  if (wachdog >= 4)
  {
    lcd.setCursor(0, 1);
    lcd.print("                ");
  }
  delay(15000);
}

Компилятор четко и ясно указал в чем была проблема. Будьте внимательны.

И прочтите это http://arduino.on.kg/attachInterrupt

3 (изменено: Darps, 04-02-2017 18:50:43)

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

Читал, не могу сопоставить что к чему.
Не знающиму с++ не понять

4

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

Скетч что был выше - исправленный.

А компилятор сказал что проблема в неправильно обьявленой функции prerivanie и то что в if (digitalRead(2) не хватает скобки.

5

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

Со скобкой не работает тоже.

6

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

#include <SPI.h>                                                                      // Библиотека для работы с шиной SPI
#include "nRF24L01.h"                                                                 // Библиотека радиомодуля
#include "RF24.h"                                                                     // Ещё библиотека радиомодуля
#include <Wire.h>                                                                     // Подключаем библиотеку для работы с I2C-устройствами
#include <LiquidCrystal_I2C.h>                                                        // Подключаем библиотеку для работы с модулем LCD1602_I2C
#include <BMP085.h>

//************************************************************************************************************************************************
// Битовая маска символа
byte temp_cel[8] =
{
  0b00000,
  0b01000,
  0b10100,
  0b01000,
  0b00011,
  0b00010,
  0b00011,
};

byte mmHg[8] =
{
  B00000,
  B00100,
  B00110,
  B00100,
  B00100,
  B01110,
  B01110,
};
//***********************************************************************************************************************************************

BMP085 dps = BMP085();                                                                // Устанавливаем датчик давления
LiquidCrystal_I2C lcd(0x27, 16, 2);                                                   // Устанавливаем дисплей

long Temperature = 0, Pressure = 0;                                                   // Создаем переменные для хранения температуры и давления из BMP185

float temp0, temp1;                                                                   // Создаем переменные для хранения температуры
float data[2];                                                                        // Создаем колическо ячеек хранения данных

RF24 radio(9, 10);                                                                    // Создаем модуль на пинах 9 и 10 Для Уно

byte wachdog = 0;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};           // Возможные номера труб

void setup()
{
  attachInterrupt(0, prerivanie, CHANGE);
  Wire.begin();                                                                       // Включаем работу с I2C-устройствами
  dps.init();                                                                         // Инициализируем датчик давления
  lcd.init();                                                                         // Инициализируем дисплей
  lcd.clear();
  lcd.createChar(1, temp_cel);                                                        // Создаем символ под номером 1 температуры
  lcd.createChar(2, mmHg);                                                            // Создаем символ под номером 2 давление
  radio.begin();                                                                      // Активируем nRF24L01 модуль
  radio.setAutoAck(1);                                                                // Режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);                                                            // Время между попыткой достучаться, число попыток
  radio.enableAckPayload();                                                           // Разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);                                                           // Размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);                                               // Хотим слушать трубу 0
  radio.setChannel(0x60);                                                             // Выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX);                                                     // Уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS);                                                   // Скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp();                                                                    // Включаем (начинаем) nRF24L01 работу
  radio.startListening();                                                             // Начинаем слушать эфир, мы приёмный модуль
}

void prerivanie()
{
  if (digitalRead(2)) lcd.backlight(); else lcd.noBacklight();
}

void loop()
{
  byte pipeNo;
  while ( radio.available(&pipeNo))                                                     // Слушаем эфир со всех труб
  {
    wachdog = 0;
    radio.read( &data, sizeof(data) );                                                    // Чиатем входящий сигнал
  }
  {
    temp0 = data[0];
    temp1 = data[1];
  }
  wachdog++;
  dps.getPressure(&Pressure);
  dps.getTemperature(&Temperature);

  lcd.setCursor(0, 0);
  lcd.print(Temperature * 0.1, 1);
  lcd.print("\1");
  lcd.print(" ");

  lcd.setCursor(10, 0);
  lcd.print(Pressure / 133.3, 1);
  lcd.print("\2");

  lcd.setCursor(0, 1);
  lcd.print(temp0, 1);
  lcd.print("\1");
  lcd.print(" ");

  lcd.setCursor(11, 1);
  lcd.print(temp1, 1);
  lcd.print("\1");
  lcd.print(" ");

  if (wachdog >= 4)
  {
    lcd.setCursor(0, 1);
    lcd.print("                ");
  }
  delay(15000);
}

7

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

Проверил, реакции на движение нет. Подсветка не включается(((

8

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

Я так понял реализация прерыванием отпадает? не работает фактически?

9

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

Тогда просто поместите это в тело функции loop

if (digitalRead(2)) lcd.backlight(); else lcd.noBacklight();

10 (изменено: Darps, 06-02-2017 14:51:38)

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

Ну оно будет работать по времене заданому в DELAY у LOOPа. и уже attachInterrupt(0, prerivanie, CHANGE); получается бессмысленным. Вот у вас есть дисплей по моему. Вот попробуйте с эмитировать сигнал прерывания на 2й цифровой ноге.

11

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

А требуется включение подсветки вне зависимости LOOP

12

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

Ни кто не поможет?

13

Re: Вкл\Выкл подсветки LCD1602 методом прерывания.

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), interrupt, CHANGE);
}

void loop()
{
  digitalWrite(ledPin, state);
}

void interrupt()
{
  state = !state;
}

Дисплея такого у меня - нет, но вот скетч, который включает/выключает светодиод при помощи датчика движения и прерываний.