Прерывания

Igor835
Offline
Зарегистрирован: 16.08.2018

Здравствуйте. У меня есть bluetooth модуль, лента и ардуино. Как сделать прерывания для модуля блютуз

void rainbow(uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}



void loop() {
  if (Serial.available()) // проверяем, поступают ли какие-то команды
  {
    val = Serial.read(); // переменная val равна полученной команде

    if (val == 't'){    rainbow(50);  }
    
  }
}

Вот кусок скетча, мне надо чтоб ардуино прерывалось на модуль во время произведения "rainbow"

 

Igor835
Offline
Зарегистрирован: 16.08.2018

Я поискал в интернете как пользоваться прерываниями, но на ардуино нано есть только 2 порта для прерываний это 2 и 3. Но модуль подключен к RX и TX

b707
Offline
Зарегистрирован: 26.05.2017

переписать эффект - выкинуть задержку из 8-й строки и прерывание не понадобится

Igor835
Offline
Зарегистрирован: 16.08.2018
BOARD DIGITAL PINS USABLE FOR INTERRUPTS

Uno, Nano, Mini, other 328-based

2, 3

 

bwn
Offline
Зарегистрирован: 25.08.2014

Igor835 пишет:

Я поискал в интернете как пользоваться прерываниями, но на ардуино нано есть только 2 порта для прерываний это 2 и 3. 

Наглая ложь.))))

Igor835
Offline
Зарегистрирован: 16.08.2018

Мне не совсем это нужно, я знаю что очень грубую ошибку сделал, но я не знал как я еще сделать. Я взял и скопировал этот эффект много раз чтобы он не прерывался. Ну и чтоб его выключить надо либо выключить питание, либо перезагрузить. Я поставил транзистор на перезагрузку и когда подаю сигнал с телефона он должен перезагрузиться. Но я не учел одного то-что ардуино не прерывается на сигнал с телефона пока не закончится этот эффект

Igor835
Offline
Зарегистрирован: 16.08.2018

Кхммм.... Может я не правильно понял, Но я отправил выше таблицу

b707
Offline
Зарегистрирован: 26.05.2017

Igor835 пишет:

Мне не совсем это нужно, я знаю что очень грубую ошибку сделал, но я не знал как я еще сделать. Я взял и скопировал этот эффект много раз чтобы он не прерывался.

ну так теперь, когда вы знаете, что это "грубая ошибка" - возьмите и перепишите. Там всего-то 20 строк.

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

Igor835
Offline
Зарегистрирован: 16.08.2018

Извините за тупость, прочитал в интернете что и 0,1 тоже могу прерываться. Я не знаю почему в оф. сайте не написали

Igor835
Offline
Зарегистрирован: 16.08.2018

Я не знаю как сделать так чтоб эффект не прерывался, Только так смог сделать

b707
Offline
Зарегистрирован: 26.05.2017

Igor835 пишет:

Я не знаю как сделать так чтоб эффект не прерывался, Только так смог сделать

а с чего вы тогда взяли. что у вас с прерываниями получится?

Еще раз повторюсь - в вашем случае прерывания не нужны. Для работы с блютуз используются прерывания не на пинах, а прерывания по УАРТ - а они и так всегда включены. Проблема в другом - пришедшую по блютуз команду  нужно обработать в программе - и тут без переписывания жффекта никак не обойтись.

 

Igor835
Offline
Зарегистрирован: 16.08.2018

 Честно но я не знаю как пользоваться прерываниями по УАРТ

Igor835
Offline
Зарегистрирован: 16.08.2018

Можно пример?

b707
Offline
Зарегистрирован: 26.05.2017

Igor835 пишет:

 Честно но я не знаю как пользоваться прерываниями по УАРТ

повторяю, вы не с того конца заходите. Предположим, вы разобрались с прерываниями по УАРТ и смогли передать по блютуз команду остановить эффект. Но что вы дальше будете делать? У вас в программе даже некуда эту команду вставить - эффект работает, пока не закончится. Вам в любом случае надо добавлять в эффект проверку на команду останова.

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

Igor835
Offline
Зарегистрирован: 16.08.2018

Сейчас попробую

sadman41
Offline
Зарегистрирован: 19.10.2016

Игорь, прерывания микроконтроллера и прерывание хода программы - это разные понятия на данном этапе Вашего  погружения в Ардуино.  Первое практически ничего Вам не даст для осуществления второго.

Igor835
Offline
Зарегистрирован: 16.08.2018

И что мне делать

Igor835
Offline
Зарегистрирован: 16.08.2018

Моя идея поставить ИК приемник и постоянно его опрашивать, поставить условие. и если датчик примит сигнал что прервать эффект

sadman41
Offline
Зарегистрирован: 19.10.2016

А что бы Вы в обычной жизни сделали, если Вам пришла бы в голову идея заиметь дома паркетные полы? Варианта я вижу четыре: если умеешь, то класть самому, либо учиться как класть самому, или нанять паркетчика, ждать Деда Мороза. Программирование от паркета ничем не отличается.

b707
Offline
Зарегистрирован: 26.05.2017

Igor835 пишет:

Моя идея поставить ИК приемник и постоянно его опрашивать, поставить условие. и если датчик примит сигнал что прервать эффект

О, кое-что новенькое... уже ИК приемник. А раньше, помню, был блютус :)

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

В прошлый раз после совета переписать эффект вы написали "Сейчас попробую" и пропали на неделю. Ну и как успехи? переписали?

 

Igor835
Offline
Зарегистрирован: 16.08.2018

delay заменил на millis xD

Igor835
Offline
Зарегистрирован: 16.08.2018

и ел витаминки)

b707
Offline
Зарегистрирован: 26.05.2017

Igor835 пишет:

delay заменил на millis xD

показывайте код.

Только показывайте код целиком - то, что исполняется "часов 10". а не одну только процедуру.

Igor835
Offline
Зарегистрирован: 16.08.2018

он 234 строки, зачем весб

Igor835
Offline
Зарегистрирован: 16.08.2018
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,21);
EthernetServer server(80);
String relay1State = "Off";
const int relay = 9;
char linebuf[80];
int charcount=0;
int bill = 92;
int val;
long previousMillis = 0;   
String rgbState = "Off";
 #include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN A4
Adafruit_NeoPixel strip = Adafruit_NeoPixel(bill , PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  pinMode(relay, OUTPUT);
    Serial.begin(9600);
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  pinMode(2, OUTPUT);
  strip.begin();
  strip.show();
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");  
  Serial.println(Ethernet.localIP());
}


 
void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client"); 
    memset(linebuf,0,sizeof(linebuf));
    charcount=0;
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
       char c = client.read();
        linebuf[charcount]=c;
        if (charcount<sizeof(linebuf)-1) charcount++;
        if (c == '\n' && currentLineIsBlank) {
          dashboardPage(client);
          break;
        }
        if (c == '\n') {
 // --------------------------------------------------- // 

          if (strstr(linebuf,"GET /relay1off") > 0){
            digitalWrite(relay, LOW);
            relay1State = "Off";
          }
          else if (strstr(linebuf,"GET /relay1on") > 0){
            digitalWrite(relay, HIGH);
            relay1State = "On";
          }
          
 // --------------------------------------------------- //      --------------------------------------------------------   

          if (strstr(linebuf,"GET /rainbowoff") > 0){
            End(50);
            relay1State = "Off";

          else if (strstr(linebuf,"GET /rainbowon") > 0){
            rainbow(50);
            relay1State = "On";
          }               

 // --------------------------------------------------- // -----------------------------------------------------------
          
          currentLineIsBlank = true;
          memset(linebuf,0,sizeof(linebuf));
          charcount=0;          
        }
        else if (c != '\r') {

          currentLineIsBlank = false;
        }
      }
    }

    delay(1);
    client.stop();
    Serial.println("client disonnected"); 
  }
}
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void rainbow(uint8_t wait) {
  unsigned long currentMillis = millis();
  uint16_t i, j;
  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
      if(currentMillis - previousMillis > wait) {
    previousMillis = currentMillis; 
    continue;
}}}
void dashboardPage(EthernetClient &client) {
 // -------------------------------------------------------------------------------------------------------- // 
      client.println("<!DOCTYPE HTML><html>");
      client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head><body>"); 
 
 // -------------------------------------------------------------------------------------------------------- //  
                                                          
      client.println("<h3>Arduino Smart House - <a href=\"/\">Refresh</a>");
      client.println("<h4> _________________________________________ </h4>");
 
 // ---------------------------------------- ЛАМПА ---------------------------------------------------------------- //       
 
      client.println("<h4>Light over table: " + relay1State + "</h4>");     
  if(relay1State == "Off"){
      client.print("<a href=\"/relay1on\"><button>ON</button></a>");
  }
  else if(relay1State == "On"){
      client.print("<a href=\"/relay1off\"><button>OFF</button></a>");                                                                    
  }
      client.println("<h4> _________________________________________ </h4>");
 
 // --------------------------------------- РАДУГА ----------------------------------------------------------------- //
  
      client.println("<h4>RGBillumination: " + rgbState + "</h4>");   
    if(rgbState == "Off"){
      client.print("<a href=\"/rainbowon\"><button>ON</button></a>");  
  }
    else if(relay1State == "On"){
      client.print("<a href=\"/rainbowoff\"><button>OFF</button></a>");                                                                    
  }
      client.println("<h4> _________________________________________ </h4>");
  
   // -------------------------------------------------------------------------------------------------------- //

   

   // -------------------------------------------------------------------------------------------------------- // 
 
      client.println("</body></html>");
      
   // -------------------------------------------------------------------------------------------------------- // 
}

 

Igor835
Offline
Зарегистрирован: 16.08.2018

И еще вопрос.

Я создал 3 страницы. 1 для циклов(loop, setup); 2 для эффектов; 3 для html странички, раньше все компилировалось хорошо но потом надо все 3 странички соединять

sadman41
Offline
Зарегистрирован: 19.10.2016

Если у Вас есть Wemos, NodeMCU или подобная хренотень, то я могу вам дать ссылку на гитхаб с прожектом иллюминации, управляемой через вифи. Там все эти "прерывания" уже реализованы.

Igor835
Offline
Зарегистрирован: 16.08.2018

Хмм давайте

b707
Offline
Зарегистрирован: 26.05.2017

Простите, а где вы эффект-то на миллис переписали? Это где строчки 116-118 ? - там хрень полная написана.

Смысл переписывания кода на миллис в том,, чтобы вместо delay() программа выходила из вашего rainbow и проверяла сигнал на отключение эффекта. А в вашем коде этого и близко нет

 

Кроме того, по-моему, вы выложили не тот код, на который жалуетесь. Вы на амперке пишете, что вы Радугу зациклили и она у вас 10 часов играет - а тут в коде ничего такого нет, продолжительность эффекта всего порядка 10 секунд

Update - а ну да, точно - обещали 234 строки, а выложили всего 160.

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

Igor835
Offline
Зарегистрирован: 16.08.2018

Знал бы как это сделать, давно б сделал

Igor835
Offline
Зарегистрирован: 16.08.2018

Помогайте тогда.

Igor835
Offline
Зарегистрирован: 16.08.2018

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

Igor835
Offline
Зарегистрирован: 16.08.2018

Вот эффект, помогайте


void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
Igor835
Offline
Зарегистрирован: 16.08.2018

sadman41 пишет:

А что бы Вы в обычной жизни сделали, если Вам пришла бы в голову идея заиметь дома паркетные полы? Варианта я вижу четыре: если умеешь, то класть самому, либо учиться как класть самому, или нанять паркетчика, ждать Деда Мороза. Программирование от паркета ничем не отличается.

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

Komandir
Offline
Зарегистрирован: 18.08.2018

В скетче из первого сообщения между 7 и 8 строками вставь:

if (Serial.available()) return;

И будет выходить по приходу данных от BT

Igor835
Offline
Зарегистрирован: 16.08.2018

Спасибо, но одно но, надо будет подловить момент и отправить сигнал от BT

Igor835
Offline
Зарегистрирован: 16.08.2018

Igor835 пишет:

Спасибо, но одно но, надо будет подловить момент и отправить сигнал от BT

Или я не прав?

 

Komandir
Offline
Зарегистрирован: 18.08.2018

Прав что не прав !

Главное "t" не посылать, а то опять стартанет сразу же ...

Igor835
Offline
Зарегистрирован: 16.08.2018

Komandir пишет:

Прав что не прав !

Главное "t" не посылать, а то опять стартанет сразу же ...

Верно, что ж делать

Komandir
Offline
Зарегистрирован: 18.08.2018

Igor835 пишет:

Верно, что ж делать

Это о чем тоска ? Если про "t", то надо просто очистить буфер ...

Догадаешься как и где ???

Igor835
Offline
Зарегистрирован: 16.08.2018

Простите, но не догадываюсь, причем тут "t" где вы его взяли

Komandir
Offline
Зарегистрирован: 18.08.2018

Строка 32

b707
Offline
Зарегистрирован: 26.05.2017

Igor835 пишет:

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

ты издеваешься или как? Ты не понимаешь, что если ты собираешься запускать тот код, что на 10 часов - то и исправлять надо ТОТ КОД, а не этот обрывок.

 

b707
Offline
Зарегистрирован: 26.05.2017

Komandir пишет:

В скетче из первого сообщения между 7 и 8 строками вставь:

if (Serial.available()) return;

И будет выходить по приходу данных от BT

Командир, у него на самом деле код совсем другой, в нем этот кусок, подозреваю, скопирован многократно, поэтому никакие правки по выложенному коду делу не помогут. Кроме того, товарищ в этом "своем коде" просто ни в зуб ногой - он его где в инете нашел, в меру знаний (нулевых) поправил и теперь просит решить проблему, не показывая никому то, что получилось после его правок.

Человек просто морочит всем голову.

sadman41
Offline
Зарегистрирован: 19.10.2016

Igor835 пишет:

Хмм давайте

https://github.com/jasoncoon/esp8266-fastled-webserver

Igor835
Offline
Зарегистрирован: 16.08.2018

Спасибо, сейчав посмотрю

Igor835
Offline
Зарегистрирован: 16.08.2018

Спасибо, и эффектов много переделаю под ethernet и всё

b707
Offline
Зарегистрирован: 26.05.2017

Igor835 пишет:

переделаю под ethernet и всё

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

И упаси вас бог снова зацикливать эффекты для более долгой работы.

Igor835
Offline
Зарегистрирован: 16.08.2018

Ну веб сайт создал включение лампы создал, ну тогда лучше вообще убрать долгие эффекты, обойдусь без них

Igor835
Offline
Зарегистрирован: 16.08.2018
void rainbow()
{
  // FastLED's built-in rainbow generator
  fill_rainbow( leds, NUM_LEDS, gHue, 255 / NUM_LEDS);
}

Что это за "leds"? 

b707
Offline
Зарегистрирован: 26.05.2017

Igor835 пишет:

Что это за "leds"? 

это у вас надо спросить.

выдернули непонятно откуда 2 строки и спрашиваете...