Прерывания по изменению состояния pin
- Войдите на сайт для отправки комментариев
Приветствую, есть 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 сек. уже существенны (=
всё реализовать не дожидаясь пока выполнится loop.. Скорость в миллисекундах не требуется, но тормоза в 2-3 сек. уже существенны (=
это почему у тебя loop выполняется 2-3 секунды?
ты представляешь, какая общая производительность твоей балалайки, в таком случае?
ты надеешься, что она(производительность) кардинально возрастёт, если ты будешь использовать прерывания?
Я не говорил о производительности в целом, loop воспроизводит у меня бегущую строку и со всеми delay выполняется около 2 мин..
Говорилось о том чтобы выполнялось условие при достижении значения на датчике и что бы это значение НЕ считывать вручную в loop, а оно было завязано на прерывании и вообще если это возможно. И как написал выше, возможно мне нужно не прерывание, а что-то иное..
В общем текущая задача, как писал выше: Необходимо чтобы при поступлении на датчик тока "HIGH" - выполнялось некое действие.
Именно к этой фразе я отнёс то, что неприемлимо дожидаться в loop считываний с датчика. При этом есть 3 датчика, которые необходимо мониторить, при включении каждого из которых наступает определённое действие, в дополнении может наступить одновременно 2 действия.
loop воспроизводит у меня бегущую строку и со всеми delay выполняется около 2 мин..
это глупо.
как написал выше, возможно мне нужно не прерывание, а что-то иное..
http://arduino.ru/tutorials/BlinkWithoutDelay
неприемлимо дожидаться в loop считываний с датчика.
кем неприемлимо?
в дополнении может наступить одновременно 2 действия.
рассчитываете заюзать два прерывания одновременно?
Про loop и delay вроде понял по статье..
Считываний неприемлимо дожидаться раз в 2 мин. Неприемлимо задачей, ибо выполняться в текущей конфигурации она будет редко и пропустит появление на датчике HIGH.
Именно про прерывания одновременно я и спрашивал, возможно или нет..
Видимо, да что-то я неправильно понял из уроков... Сейчас попробую перекроить скетч.
Именно про прерывания одновременно я и спрашивал, возможно или нет..
в принципе - возможно, но когда ты избавишься от delay - может оказаться ненужным.
закоментируй в своём скетче все delay и проверь время исполнеия кода по методике http://arduino.ru/forum/obshchii/vremya-na-ispolnenie-raznykh-funktsii - ты получишь реальное время одного цикла своей программы, так как бы она была написана без delay.
В общем с 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++; } }В данном примере светодиод загорается только после полного прохождения бегущей строки, а потом тухнет после второго прохода этой же строки..
В общем с delay это я на свотодиодах баловался, убрал, там всё как надо..
Но во теперь столкнулся с тем, что в коде бегущей строки пример по вашей ссылке выполняется только после полного прохождения строки..
В данном примере светодиод загорается только после полного прохождения бегущей строки, а потом тухнет после второго прохода этой же строки..
обрати внимание, что в коде есть
while(*s != 0)читаем описалово: While будет вычислять в цикле непрерывно и бесконечно до тех пор
т.е. ты настойчиво желаешь наступать на грабли, вместо написания кода, где что-то будет исполняться без задержек.
Спасибо, сейчас поковыряю этот while..
...при этом датчик тока выдаёт аналоговое значение и для придания ему LOW или HIGH использую код:
.....
Попробуйте опрашивать пин с датчиком как цыфровой через digitelRead(14), на входе МК стоит компаратор и он сам отсечет все что ниже 1.8В как LOW все что выше как HIG.
А то что скетч выполняется 2минуты, плохо нужно переделывать.((