Прерывания по изменению состояния pin

lipkiy
Offline
Зарегистрирован: 26.01.2016

Приветствую, есть UNO клон. Необходимо чтобы при поступлении на датчик тока "HIGH" - выполнялось некое действие, при этом датчик тока выдаёт аналоговое значение и для придания ему LOW или HIGH использую код:

int valb0 = (analogRead(vdat2)); // берём значение с датчика тока vdat2
    valb0 = constrain(valb0, 440, 510); // ограничиваем значения
int valb1 = map (valb0, 440, 510, LOW, HIGH) // передаём в valb1 1 или 0

Ибо значение самопроизвольно меняется в диапазоне +-20 независимо от того есть нагрузка или нет.

Как понимаю, прерывания работают только от внешнего фактора (кнопки) и не могут постоянно опрашивать программно изменился ли "valb1"?

И в довесок: возможно поступление сразу 2х сигналов, то есть от двух датчиков сразу и это должно выводить третье действие.. Возможно ли и это? При том что датчиков тока всего 3, но одновременно могут работать только 2 линии тока (не зависит от ардуино), например 1+2 или 1+3.

Чего-то я почитал о прерываниях и кажется вообще не в ту сторону копаю..

Подскажите как это всё реализовать не дожидаясь пока выполнится loop.. Скорость в миллисекундах не требуется, но тормоза в 2-3 сек. уже существенны (=

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

lipkiy пишет:

всё реализовать не дожидаясь пока выполнится loop.. Скорость в миллисекундах не требуется, но тормоза в 2-3 сек. уже существенны (=

это почему у тебя loop выполняется 2-3 секунды?

ты представляешь, какая общая производительность твоей балалайки, в таком случае?

ты надеешься, что она(производительность) кардинально возрастёт, если ты будешь использовать прерывания?

lipkiy
Offline
Зарегистрирован: 26.01.2016

Я не говорил о производительности в целом, loop воспроизводит у меня бегущую строку и со всеми delay выполняется около 2 мин..

Говорилось о том чтобы выполнялось условие при достижении значения на датчике и что бы это значение НЕ считывать вручную в loop, а оно было завязано на прерывании и вообще если это возможно. И как написал выше, возможно мне нужно не прерывание, а что-то иное..

В общем текущая задача, как писал выше: Необходимо чтобы при поступлении на датчик тока "HIGH" - выполнялось некое действие.

Именно к этой фразе я отнёс то, что неприемлимо дожидаться в loop считываний с датчика. При этом есть 3 датчика, которые необходимо мониторить, при включении каждого из которых наступает определённое действие, в дополнении может наступить одновременно 2 действия.                        

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

lipkiy пишет:

loop воспроизводит у меня бегущую строку и со всеми delay выполняется около 2 мин..

это глупо.

lipkiy пишет:

как написал выше, возможно мне нужно не прерывание, а что-то иное..

http://arduino.ru/tutorials/BlinkWithoutDelay

lipkiy пишет:

неприемлимо дожидаться в loop считываний с датчика.

кем неприемлимо?

lipkiy пишет:

 

в дополнении может наступить одновременно 2 действия.                        

рассчитываете заюзать два прерывания одновременно?

lipkiy
Offline
Зарегистрирован: 26.01.2016

Про loop и delay вроде понял по статье..

Считываний неприемлимо дожидаться раз в 2 мин. Неприемлимо задачей, ибо выполняться в текущей конфигурации она будет редко и пропустит появление на датчике HIGH.

Именно про прерывания одновременно я и спрашивал, возможно или нет..

Видимо, да что-то я неправильно понял из уроков... Сейчас попробую перекроить скетч.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

lipkiy пишет:

Именно про прерывания одновременно я и спрашивал, возможно или нет..

в принципе - возможно, но когда ты избавишься от delay - может оказаться ненужным.

закоментируй в своём скетче все delay и проверь время исполнеия кода по методике http://arduino.ru/forum/obshchii/vremya-na-ispolnenie-raznykh-funktsii - ты получишь реальное время одного цикла своей программы, так как бы она была написана без delay.

lipkiy
Offline
Зарегистрирован: 26.01.2016

В общем с delay это я на свотодиодах баловался, убрал, там всё как надо..

Но во теперь столкнулся с тем, что в коде бегущей строки пример по вашей ссылке выполняется только после полного прохождения строки..

Сам скетч найденый в интернете:


#include "DHT.h"
#include <MaxMatrix.h>
#include <avr/pgmspace.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;



#define DHTPIN 2    // DHT-11 out
#define DHTTYPE DHT11  // тип DHT-11
DHT dht(DHTPIN, DHTTYPE);

PROGMEM const unsigned char CH[] = {
  3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
  1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
  3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
  5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
  4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
  5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
  5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
  1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
  3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
  3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
  5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
  5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
  2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
  4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
  2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
  4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
  3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
  4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
  4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
  4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
  4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
  4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
  4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
  4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
  4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
  2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
  2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
  3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
  3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
  3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
  4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
  5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
  4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
  4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
  4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
  5, 8, B01100000, B00111111, B00100001, B00111111, B01100000, // Д   
  4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
  4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
  4, 8, B01111111, B00000001, B00000001, B00000001, B00000000, // Г   
  4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
  5, 8, B01111111, B00010000, B00001000, B00000100, B01111111, // И   
  5, 8, B01100011, B00010100, B01111111, B00010100, B01100011, // Ж
 
  4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
  4, 8, B01111110, B00000001, B00000001, B01111111, B00000000, // Л   
  5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
  5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
  4, 8, B01111111, B00000001, B00000001, B01111111, B00000000, // П   
  4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
  4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P   
  4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
  5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
  4, 8, B01000111, B01001000, B01001000, B00111111, B00000000, // У   
  4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B   
  5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
  5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
  5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
  4, 8, B01000110, B00101001, B00011001, B01111111, B00000000, // Я   
  2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
  4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
  2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
  3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
  4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
  2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
  4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
  4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
  4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
  4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
  4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
  3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
  4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
  4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
  3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
  4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
  4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
  3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
  5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
  4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
  4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
  4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
  4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
  4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
  4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
  3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
  4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
  5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
  5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
  5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
  4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
  3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
  3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
  1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
  3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
  4, 8, B00000010, B00000101, B00000010, B00000000, B00000000, // ~ градус
};

int data = 8;    // DIN pin of MAX7219 module
int load = 9;    // CS pin of MAX7219 module
int clock = 10;  // CLK pin of MAX7219 module

int maxInUse = 4;    //change this variable to set how many MAX7219's you'll use (5)
//===========================
const int ledPin =  13;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения светодиода
long interval = 1000;       
//===========================
MaxMatrix m(data, load, clock, maxInUse); // define module

byte buffer[10];

void setup(){
  m.init(); // module initialize
  m.setIntensity(0); // dot matix intensity 0-15
  Serial.begin(9600); // serial communication initialize

  Wire.begin();  // RTC_DS1307
  RTC.begin();

  dht.begin(); // DHT-11

  // ====================================
  pinMode(ledPin, OUTPUT);
}

void loop(){

  int Temp = dht.readTemperature();
  int Hum = dht.readHumidity();

  m.shiftLeft(false, true);

  char string1[] = " Hello, my name is Vadim ...        ";
  sprintf(string1, "TEMP. %d~C VLAJH. %i%%     ", Temp, Hum);
  Serial.println(string1);

printStringWithShift(string1, 30);
//===========================
  unsigned long currentMillis = millis();  
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis; 
 
    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
       
  }
  
}

void printCharWithShift(char c, int shift_speed){
  if (c < 32) return;
  c -= 32;
  memcpy_P(buffer, CH + 7*c, 7);
  m.writeSprite(maxInUse*8, 0, buffer);
  m.setColumn(maxInUse*8 + buffer[0], 0);

  for (int i=0; i<buffer[0]+1; i++)
  {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

void printStringWithShift(char* s, int shift_speed){
  while (*s != 0){
    printCharWithShift(*s, shift_speed);
    s++;
  }
}

void printString(char* s)
{
  int col = 0;
  while (*s != 0)
  {
    if (*s < 32) continue;
    char c = *s - 32;
    memcpy_P(buffer, CH + 7*c, 7);
    m.writeSprite(col, 0, buffer);
    m.setColumn(col + buffer[0], 0);
    col += buffer[0] + 1;
    s++;
  }
 }

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

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

lipkiy пишет:

В общем с delay это я на свотодиодах баловался, убрал, там всё как надо..

Но во теперь столкнулся с тем, что в коде бегущей строки пример по вашей ссылке выполняется только после полного прохождения строки..

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

обрати внимание, что в коде есть while (*s != 0)

читаем описалово: While будет вычислять в цикле непрерывно и бесконечно до тех пор

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

 

lipkiy
Offline
Зарегистрирован: 26.01.2016

Спасибо, сейчас поковыряю этот while..

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

lipkiy пишет:

...при этом датчик тока выдаёт аналоговое значение и для придания ему LOW или HIGH использую код:

.....

Попробуйте опрашивать пин с датчиком как цыфровой через digitelRead(14), на входе МК стоит компаратор и он сам отсечет все что ниже 1.8В как LOW все что выше как HIG.

А то что скетч выполняется 2минуты, плохо нужно переделывать.((