Uno+прерывания+я новичек

mrLu
Offline
Зарегистрирован: 06.10.2014

Добрый день!

Для управления выключателями света по 433 приобрел Arduion Uno + приемник/передатчик по 433.

Что-то не работает, а что именно не понимаю. Подключают от приемника  gnd->к gnd, vcc->3.3v, data->analog 0

И вот такая програмка: 

#define rfReceivePin A0  //RF Receiver pin = Analog pin 0
 #define ledPin 13        //Onboard LED = digital pin 13
 
 unsigned int data = 0;   // variable used to store received data
 const unsigned int upperThreshold = 70;  //upper threshold value
 const unsigned int lowerThreshold = 50;  //lower threshold value
 
 void setup(){
   pinMode(ledPin, OUTPUT);
   Serial.begin(9600);
 }
 
 void loop(){
   data=analogRead(rfReceivePin);    //listen for data on Analog pin 0
   
    if(data>upperThreshold){
     digitalWrite(ledPin, LOW);   //If a LOW signal is received, turn LED OFF
     Serial.println(data);
   }
   
   if(data<lowerThreshold){
     digitalWrite(ledPin, HIGH);   //If a HIGH signal is received, turn LED ON
     Serial.println(data);
   }
 }
 
Когда нажимаю кнопки на пульте, все работает.
 
Далее, пытаюсь реализовать через прерывания
 
int pin = 13;
volatile int state = LOW;
 
void setup()
{
  Serial.begin(9600);
  pinMode(pin, OUTPUT);
  Serial.println("Hi");
  attachInterrupt(0, blink, CHANGE);
  Serial.println("Hello world");
}
 
void loop()
{
  digitalWrite(pin, state);
}
 
void blink()
{
  Serial.println("1");
  state = !state;
}
 
Подключаю gnd->к gnd, vcc->3.3v, data->digital 2

И ничего не получаю, ни вывода в монитор ни диодморгания. В чем проблема, что не так?

Radjah
Offline
Зарегистрирован: 06.08.2014

http://arduino.ru/Reference/AttachInterrupt

Дык у тебя на D2 сыпится куча импульсов, которые порождают аж по два прерывания каждый (attachInterrupt(0, blink, CHANGE)), и по каждому импульсу происходит state = !state два раза. Что в итоге получается?

std
Offline
Зарегистрирован: 05.01.2012

а в сериал разве можно посылать внутри прерывания?

mrLu
Offline
Зарегистрирован: 06.10.2014

попробовал так

void blink()
{
  state = HIGH;
}
 
все равно тишина
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

attachInterrupt(0, blink, CHANGE); надо или RISING или FALLING вместо CHANGE, смотря что на пине без сигнала

mrLu
Offline
Зарегистрирован: 06.10.2014

jeka_tm пишет:

attachInterrupt(0, blink, CHANGE); надо или RISING или FALLING вместо CHANGE, смотря что на пине без сигнала

попробовал, тишина, ощущение что вообще ничего не поступает? есть даже сомнение что не туда провод подключил или может какие-то настройки надо для этого d2 делать

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вопросы. почему 3.3В а не 5?

ты уверен что на входной пин не нужна подтяжка?

если что нужно подключать на  2 пин а не 0. пишется 0 потому что прерывание 0

attachInterrupt(0, blink, CHANGE);

изза того что нет задержки никакой, delay использовать нельзя. если постоянно будет на входе дергаться сигнал с такой же скоростью будет моргать светодиод. и это просто можешь не заметить

Radjah
Offline
Зарегистрирован: 06.08.2014

Нужно его на ввод в setup переключить.

Вот мои потуги:

#include <CyberLib.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>


// Порты LCD
#define LCD_I2C_ADDR    0x27
#define BACKLIGHT     3
#define LCD_EN  2
#define LCD_RW  1
#define LCD_RS  0
#define LCD_D4  4
#define LCD_D5  5
#define LCD_D6  6
#define LCD_D7  7

LiquidCrystal_I2C       lcd(LCD_I2C_ADDR,LCD_EN,LCD_RW,LCD_RS,LCD_D4,LCD_D5,LCD_D6,LCD_D7);

// Счетчик импульсов
volatile int count = 0;

void setup() {
  // D3 на ввод
  D3_In;
  D3_High;
  // Прерывание на нарастание
  attachInterrupt(1, D3Int, RISING);
  // Запуск дисплея
  lcd.begin(20,4);
  lcd.setBacklightPin(BACKLIGHT,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.clear();
  lcd.home();
}

void loop() {
  // Вывод значения счетчика
  lcd.clear();
  lcd.print(count);
  delay_ms(1000);
}
void D3Int(){
  // Приращение счетчика
  count++;
}

D3 через оптопару соединялся с землей. Оптопара рулилась с другой ардуины.

Раз в секунду выводится на экран количество срабатываний.

Считал задние фронты импульсов, потому и RISING.

mrLu
Offline
Зарегистрирован: 06.10.2014

jeka_tm пишет:

вопросы. почему 3.3В а не 5?

В интернете где то нашел схему с программой там было под 3.3в )

Переключил на 5 и все работает, спасибо!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хорошо)