Параллельное выполнение 2-3 задач

igorcds
Offline
Зарегистрирован: 03.12.2013

Доброго времени суток.

пришел наконец ардуино, побаловался  с подлючением led, servo, motor....

хочу попробовать соорудить такую схемку: 2-3 датчика движения и включение света на лестничной клетке, в коридоре квартиры и предположим в ванной по датчикам расположенным в этих помещениях... интересен вопрос- возможно ли одновременное управление коммутацией света в двух(трех) местах, отработка предположим сразу по двум датчикам одновременно. именно одновременно. датчики ultrasonic sr04. Как все это соорудить на одном сонаре понятно, а вот на двух расположенных в разных местах...(если одновременно должны сработать именно два сонара в разных помещениях).помимо таймера можно еще что нибудь придумать?

в какую сторону искать?

заранее спасибо

maksim
Offline
Зарегистрирован: 12.02.2012
igorcds
Offline
Зарегистрирован: 03.12.2013

спасибо

igorcds
Offline
Зарегистрирован: 03.12.2013

пока нет сонаров сделал заготовку на кнопках.. вот такой код:

есть вопрос: миллис делал для LED1, поидее в viod loop шунтировать LED1 не надо, но если делаю без шунтирования, то нажимая КНОПКУ 1 надо ждать не отпуская кнопку время когда закончится миллис и только тогда диод включается и свое отрабатывает...не туда поместил код на включение LED1?

const int ledPin1 =  13;       //пин выхода LED1
const int ledPin2 =  12;       //пин выхода LED2

const int buttonPin1 = 2;      //пин кнопки 1
const int buttonPin2 = 4;      //пин кнопки 2

int ledState1 = LOW;           //этой переменной устанавливаем состояние светодиода1
int ledState2 = LOW;           //этой переменной устанавливаем состояние светодиода2

int buttonState1 = 0;          //состояние кнопки1
int buttonState2 = 0;          //состояние кнопки2

long previousMillis = 0;       //храним время последнего переключения светодиода 
long interval = 10000;         //интервал работы светодиодов (10 секунд)


void setup() {
   //задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin1, OUTPUT);     
  pinMode(ledPin2, OUTPUT);
}
 
void loop()
{
   //код, который работаtn постоянно и который не должен останавливаться на время включения LED1
  
  buttonState2 = digitalRead(buttonPin2); 
  buttonState1 = digitalRead(buttonPin1);
  delay(10);
  
//временно, потом добавить включение по времени
   if (buttonState2 == HIGH)
      ledState2 = HIGH;
    else
      ledState2 = LOW;
  digitalWrite(ledPin2, ledState2);
 
// шунтирование Led1 
   if (buttonState1 == HIGH)
      ledState1 = HIGH;
  digitalWrite(ledPin1, ledState1);
  
  unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) 
    {
      previousMillis = currentMillis; 
    if (buttonState1 == HIGH)
      ledState1 = HIGH;
    else
      ledState1 = LOW;
 
    //устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin1, ledState1);
     }
}

 

igorcds
Offline
Зарегистрирован: 03.12.2013

можно ли добавить в код миллис и для LED2? чтобы миллис был и для LED 1 и LED2.

типа такого:

43	  unsigned long currentMillis2 = millis();
44	    if(currentMillis2 - previousMillis2>  interval)
45	    {
46	      previousMillis2 = currentMillis2;
47	    if (buttonState2 == HIGH)
48	      ledState2 = HIGH;
49	    else
50	      ledState2 = LOW;
51	  
52	    //устанавливаем состояния выхода, чтобы включить или выключить светодиод
53	    digitalWrite(ledPin2, ledState2);
54	     }
55	}

конечно объявив соответствующие переменные..

igorcds
Offline
Зарегистрирован: 03.12.2013

уважаемый Максим помогите пожалуйсто с вопросом в этой ветке
 

ivan_admin
Offline
Зарегистрирован: 09.01.2014

igorcds пишет:

пока нет сонаров сделал заготовку на кнопках.. вот такой код:

есть вопрос: миллис делал для LED1, поидее в viod loop шунтировать LED1 не надо, но если делаю без шунтирования, то нажимая КНОПКУ 1 надо ждать не отпуская кнопку время когда закончится миллис и только тогда диод включается и свое отрабатывает...не туда поместил код на включение LED1?

const int ledPin1 =  13;       //пин выхода LED1
const int ledPin2 =  12;       //пин выхода LED2

const int buttonPin1 = 2;      //пин кнопки 1
const int buttonPin2 = 4;      //пин кнопки 2

int ledState1 = LOW;           //этой переменной устанавливаем состояние светодиода1
int ledState2 = LOW;           //этой переменной устанавливаем состояние светодиода2

int buttonState1 = 0;          //состояние кнопки1
int buttonState2 = 0;          //состояние кнопки2

long previousMillis = 0;       //храним время последнего переключения светодиода 
long interval = 10000;         //интервал работы светодиодов (10 секунд)


void setup() {
   //задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin1, OUTPUT);     
  pinMode(ledPin2, OUTPUT);
}
 
void loop()
{
   //код, который работаtn постоянно и который не должен останавливаться на время включения LED1
  
  buttonState2 = digitalRead(buttonPin2); 
  buttonState1 = digitalRead(buttonPin1);
  delay(10);
  
//временно, потом добавить включение по времени
   if (buttonState2 == HIGH)
      ledState2 = HIGH;
    else
      ledState2 = LOW;
  digitalWrite(ledPin2, ledState2);
 
// шунтирование Led1 
   if (buttonState1 == HIGH)
      ledState1 = HIGH;
  digitalWrite(ledPin1, ledState1);
  
  unsigned long currentMillis = millis();
    if(currentMillis - previousMillis > interval) 
    {
      previousMillis = currentMillis; 
    if (buttonState1 == HIGH)
      ledState1 = HIGH;
    else
      ledState1 = LOW;
 
    //устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin1, ledState1);
     }
}

 

А что собственно нужно сделать то?

Задержку включения или выключения?

А может и то и другое?

igorcds
Offline
Зарегистрирован: 03.12.2013

включение света по показаниям сонара(свет включается на 3 минуты к примеру, т.е задержку отключения), одновременная работа с 2-3 датчиками. Именно одновременная работа по2-3 сонарам, как сделать поочередно понятно более менее, а вот одновременно...

igorcds
Offline
Зарегистрирован: 03.12.2013

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

спасибо

igorcds
Offline
Зарегистрирован: 03.12.2013

не надо весь код. мне бы просто идею подсказать и указать на ошибку в моем коде

ivan_admin
Offline
Зарегистрирован: 09.01.2014
const int ledPin1 =  13;       //пин выхода LED1
const int ledPin2 =  12;       //пин выхода LED2

const int buttonPin1 = 2;      //пин кнопки 1
const int buttonPin2 = 4;      //пин кнопки 2

int ledState1 = LOW;           //этой переменной устанавливаем состояние светодиода1
int ledState2 = LOW;           //этой переменной устанавливаем состояние светодиода2

int buttonState1 = 0;          //состояние кнопки1
int buttonState2 = 0;          //состояние кнопки2

long previousMillis1 = 0;      //храним время последнего Включения светодиода 1
long previousMillis2 = 0;      //храним время последнего Включения светодиода 2
long interval = 10000;         //интервал работы светодиодов (10 секунд)


void setup() {
  //задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin1, OUTPUT);     
  pinMode(ledPin2, OUTPUT);
}

void loop()
{

  buttonState2 = digitalRead(buttonPin2); 
  buttonState1 = digitalRead(buttonPin1);
  delay(10);
  digitalWrite(ledPin1, ledState1);
  digitalWrite(ledPin2, ledState2);
  
  //Нажимаем кнопку 1 - включаеться светодиод 1
  if (buttonState1 == HIGH)
  {
    ledState1 = HIGH;
    previousMillis1 = millis()+interval; // каждый раз при нажатии кнопки отсчёт отсрочки начинаеться сначала...
  }
  // Прошло время выключаем светодиод 1
  if(millis() >= previousMillis1) 
  {
    ledState1 = LOW; 
  }
  //Нажимаем кнопку 2 - включаеться светодиод 2
  if (buttonState2 == HIGH)
  {
    ledState2 = HIGH;
    previousMillis2 = millis()+interval; // каждый раз при нажатии кнопки отсчёт отсрочки начинаеться сначала...
  }
  // Прошло время выключаем светодиод 2
  if(millis() >= previousMillis2) 
  {
    ledState1 = LOW; 
  }
}


Как то так

maksim
Offline
Зарегистрирован: 12.02.2012

Данный вариант работать будет, но не долго... Через ~20 дней так как previousMillis имеет тип long, произойдет ее переполнение и в ней начнут сохраняться отрицательные числа, в результате условия millis()>=previousMillis будет верно постоянно до тех пор пока не переполнится millis() последующие ~20 дней. То есть данный вариант решения будет ~20 дней работать и ~20 дней свет не будет включаться. Если же изменить на тип unsigned long, то картина становится получше, но опять таки через ~40 дней будет переполнение millis() и если это переполнение попадет на момент пока длится тот самый интервал, то свет не выключится до следующего срабатывания датчика.

maksim
Offline
Зарегистрирован: 12.02.2012

Поэтому лучше применять такую конструкцию:

#define ledPin1 13    //пин выхода LED1
#define ledPin2 12    //пин выхода LED2

#define buttonPin1 2  //пин кнопки 1
#define buttonPin2 4  //пин кнопки 2

unsigned long previousMillis1 = 0;      //храним время последнего Включения светодиода 1
unsigned long previousMillis2 = 0;      //храним время последнего Включения светодиода 2
unsigned long interval = 10000;         //интервал работы светодиодов (10 секунд)
unsigned long interva2 = 10000;         //интервал работы светодиодов (10 секунд)


void setup() 
{
  //задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin1, OUTPUT);     
  pinMode(ledPin2, OUTPUT);
}

void loop()
{
  delay(10);

  //Нажимаем кнопку 1 - включаеться светодиод 1
  if (digitalRead(buttonPin1) == HIGH)
  {
    digitalWrite(ledPin1, HIGH);
    previousMillis1 = millis(); // каждый раз при нажатии кнопки отсчёт отсрочки начинаеться сначала...
  }
  // Прошло время выключаем светодиод 1
  if(millis()-previousMillis1 >= interval) 
  {
    digitalWrite(ledPin1, LOW);
  }
  
  //Нажимаем кнопку 2 - включаеться светодиод 2
  if (digitalRead(buttonPin2) == HIGH)
  {
    digitalWrite(ledPin2, HIGH);
    previousMillis2 = millis(); // каждый раз при нажатии кнопки отсчёт отсрочки начинаеться сначала...
  }
  // Прошло время выключаем светодиод 2
  if(millis()-previousMillis2 >= interva2)
  {
    digitalWrite(ledPin2, LOW);
  }
}

Ну а что бы попросту не тыркать digitalWrite'ы, то так:

#define ledPin1 13    //пин выхода LED1
#define ledPin2 12    //пин выхода LED2

#define buttonPin1 2  //пин кнопки 1
#define buttonPin2 4  //пин кнопки 2

unsigned long previousMillis1 = 0;      //храним время последнего Включения светодиода 1
unsigned long previousMillis2 = 0;      //храним время последнего Включения светодиода 2
unsigned long interval = 10000;         //интервал работы светодиодов (10 секунд)
unsigned long interva2 = 10000;         //интервал работы светодиодов (10 секунд)


void setup() 
{
  //задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin1, OUTPUT);     
  pinMode(ledPin2, OUTPUT);
}

void loop()
{
  delay(10);

  //Нажимаем кнопку 1 - включаеться светодиод 1
  if (digitalRead(buttonPin1) == HIGH)
  {
    digitalWrite(ledPin1, HIGH);
    previousMillis1 = millis(); // каждый раз при нажатии кнопки отсчёт отсрочки начинаеться сначала...
  }
  // Прошло время выключаем светодиод 1
  if(previousMillis1 && (millis()-previousMillis1 >= interval)) 
  {
    digitalWrite(ledPin1, LOW);
    previousMillis1 = 0;
  }
  
  //Нажимаем кнопку 2 - включаеться светодиод 2
  if (digitalRead(buttonPin2) == HIGH)
  {
    digitalWrite(ledPin2, HIGH);
    previousMillis2 = millis(); // каждый раз при нажатии кнопки отсчёт отсрочки начинаеться сначала...
  }
  // Прошло время выключаем светодиод 2
  if(previousMillis2 && (millis()-previousMillis2 >= interva2))
  {
    digitalWrite(ledPin2, LOW);
    previousMillis2 = 0;
  }
}

 

ivan_admin
Offline
Зарегистрирован: 09.01.2014
 if(previousMillis1 && (millis()-previousMillis1 >= interval))

а что за конструкция?

maksim
Offline
Зарегистрирован: 12.02.2012

Тоже самое что и 

if((previousMillis1 > 0) && (millis()-previousMillis1 >= interval))

 

ivan_admin
Offline
Зарегистрирован: 09.01.2014

и что это даёт?

maksim
Offline
Зарегистрирован: 12.02.2012

Это позволяет выполняться тому что в фигурных скобках только один раз после выполнеия условия millis()-previousMillis1 >= interval , при этом не задействуя еще каких либо дополнительных переменных:

  if(previousMillis1 && (millis()-previousMillis1 >= interval)) 
  {
    ....
    previousMillis1 = 0;
  }

 

ivan_admin
Offline
Зарегистрирован: 09.01.2014

Всё понял, да этот момент я упустил...

Я пока только Учусь :)

igorcds
Offline
Зарегистрирован: 03.12.2013

огромное спасибо. правда я сам хотел дойти до всего это :)...но все равно спасибо, (даже нашел опечатку в коде у уважаемого ivan_admin-строка 53:)) )...добавил третий LED, все работает изумительно, осталось дождаться посылку и баловаться с датчиками, хочу два включения света делать по сонарам, а третий по датчику звука... и про программирование- я так понял, все что выполняется в миллис, выполняется независимо от основного кода? миллис это и есть таймер МК? если миллис это таймер, то сколько может циклов миллис может быть в работе одновременно? 3?....если циклов миллис в работе может быть три одновременно, то можно ли сделать код к примеру на 4-5 циклов миллис, но работать единовременно только три цикла миллис?

спасибо.

ivan_admin
Offline
Зарегистрирован: 09.01.2014

http://arduino.ru/Reference/Millis

Это таймер(счётчик) как только включили МК он пошёл считать

А сколько раз ты его запоминаешь не имеет значения.

через 50 дней он переполнится и начнёт отсчёт с нуля,

так что об этом нужно позаботиться иначе после его обнуления счет будет гореть около 50 дней :)

Можно например просто перезагружать переодически МК

ivan_admin
Offline
Зарегистрирован: 09.01.2014

А насчёт опечаток, там много чего ещё можно переделать яж так для примера набросал.

Да и сам ещё только учусь...

igorcds
Offline
Зарегистрирован: 03.12.2013

спасибо. да и я тоже учусь...еще раз спасибо.

igorcds
Offline
Зарегистрирован: 03.12.2013

Здравствуйте. подскажите по праздному вопросу. вот к примеру экран TFT

http://www.ebay.com/itm/2-4-TFT-LCD-Touch-Panel-Display-TF-Reader-For-Arduino-UNO-R2-R3-A137-RED-/181301502091?pt=LH_DefaultDomain_2&hash=item2a3669608b

судя по его пинам- все цифровые и аналоговые ножки заняты. Или я может что то не так увидел?.....

т.е если тфт присобачил то ничего больше не подсоеденишь....только вывод информации?

или есть какие нибудь другие тфт экраны которые подойдут под уно, но чтобы можно было что нибудь еще подвесить на цифровые\аналоговые выходы?

спасибо

 

 

 

pastry777
Offline
Зарегистрирован: 16.01.2014

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

maksim
Offline
Зарегистрирован: 12.02.2012
pastry777
Offline
Зарегистрирован: 16.01.2014

ясно=)конкретика:

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

 

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 1, 100 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(100);

const int numPins = 4;
const int pins[] = { 6, 7, 8, 9 };    // Пины для реле
int pinState[] = {0, 0, 0, 0};  // ПЕРЕМЕННАЯ,ТЕКУЩЕЕ Состояние пинов

void setup()
{
  // Изначально выключаем все реле
  for (int i = 0; i < numPins; i++)
  {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], HIGH);
  }
  
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  EthernetClient client = server.available();
  if (client)
  {
    // Проверяем подключен ли клиент к серверу
    while (client.connected())
    {
      // Проверяем идет ли запрос к серверу
      int dataCount = client.available();
      if (dataCount > 0)
      {
        // Считываем данные передаваемые серверу с клиента (броузера)
        for (int i = 0; i < dataCount; i++)
        {
          char ch = client.read();
          // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P'
          if (i == 0 && ch != 'P')
            break;
          if (ch == '\n' && i < dataCount - 1)
          {
             // Находим строку, в которой содержатся передаваемые данные
             char chNext = client.read();
             // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
             if (chNext == 'r')
             {
               // Выключаем все реле
               pinState[0] = LOW;
               pinState[1] = LOW;
               pinState[2] = LOW;
               pinState[3] = LOW;
               
               // Считываем первый номер реле, который нужно включить
               char relayNum = client.read();
               pinState[relayNum-'0'] = HIGH;
               Serial.write(relayNum);
               
               // Считываем вспомогательную информацию (=on&)
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
                
               // Пока есть данные об остальных реле, считываем и заносим в массив pinState
               while (relayNum != -1)
               {
                  relayNum = client.read();
                  relayNum = client.read();
                  pinState[relayNum-'0'] = HIGH;
                  Serial.write(relayNum);
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
               }
             } else
             {
                // Если не было передано данных, то выключаем все реле
                pinState[0] = LOW;
                pinState[1] = LOW;
                pinState[2] = LOW;
                pinState[3] = LOW;
             }
          }
        }
      }
      
      // В соответствие с переданными данными включаем реле
      for (int i = 0; i < 4; i++)
      {
         digitalWrite(pins[i], !pinState[i]);
      }
      
      // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html;charset=UTF-8");
      client.println();
      client.println("<html>");
      client.println("<head>");
      client.println("<title>Удаленное управление</title>");
      client.println("</head>");
      client.println("<body>");
      client.println("<hr>");
      client.println("<h2><b><p align='center'>Удаленное управление</p></b></h2> ");
      client.println("<hr>");
      client.println("<form method='post'>");
      client.print("<div><h2><p align='center'>Свет_ворота <input type='checkbox' ");
      if (pinState[0] == HIGH)
        client.print("checked");
      client.println(" name='r0'></p></h2></div>");
      client.print("<div><h2><p align='center'>Свет_вход <input type='checkbox' ");
      if (pinState[1] == HIGH)
        client.print("checked");
      client.println(" name='r1'></p></h2></div>");
      client.print("<div><h2><p align='center'>Свет_огород <input type='checkbox' ");
      if (pinState[2] == HIGH)
        client.print("checked");
      client.println(" name='r2'></p></h2></div>");
      client.print("<div><h2><p align='center'>Выключить_датчик_движения <input type='checkbox' ");
      if (pinState[3] == HIGH)
        client.print("checked");
      client.println(" name='r3'></p></h2></div>");
      client.println("<p align='center'><input type='submit' value='ПРИМЕНИТЬ'></p>");
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
    }
  }
}

 

 

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

 

// These constants won't change.  They're used to give names
// to the pins used:
const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to
const int ledPin = 13;                 // LED connected to digital pin 13

int sensorValue = 0;        // value read from the sensor




void setup() {
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);            
  // determine alarm status
  if (sensorValue >= 750)
  {
    digitalWrite(ledPin, HIGH);   // sets the LED on
  }
  else
  {
  digitalWrite(ledPin, LOW);    // sets the LED off
  }

 

ну и вот с этого нужно слепить один скетч...

 

inspiritus
Offline
Зарегистрирован: 17.12.2012
pastry777
Offline
Зарегистрирован: 16.01.2014

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

schekalaev
Offline
Зарегистрирован: 22.01.2014

У вас нет библиотек от этого lcd?

igorcds
Offline
Зарегистрирован: 03.12.2013

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

 

ites
Offline
Зарегистрирован: 26.12.2013

pastry777 пишет:

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

Это надо распечатать и в рамочку повешать.

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

ites пишет:

Это надо распечатать и в рамочку повешать.

эпитафия над воротами в кладбище разума "их наипали маркетолохи".

igorcds
Offline
Зарегистрирован: 03.12.2013

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

 #include "Ultrasonic.h"
     unsigned long distance, time_sonar; //Переменные для сонара

       // Trig - 12, Echo - 13
       Ultrasonic ultrasonic1(12, 13);
       
       // Trig - 12, Echo - 9
       Ultrasonic ultrasonic2(10, 9);

        const int RelayChn1 = 11; //Используем цифровой ПОРТ 11 для ПЕРВОГО канала релейного модуля 
        const int RelayChn2 = 8; //Используем цифровой ПОРТ 8 для ВТОРОГО канала релейного модуля      
        
	 
	unsigned long previousMillis1 = 0;      //храним время последнего Включения светодиода 1
	unsigned long previousMillis2 = 0;      //храним время последнего Включения светодиода 2
       
	
        unsigned long interval1 = 10000;         //интервал работы РЕЛЕ1 (10 СЕКУНД)
	unsigned long interval2 = 10000;         //интервал работы РЕЛЕ2 (10 СЕКУНД)
       


void setup()
{
  Serial.begin(9600);                           // start the serial port
  
	 
	  //задаем режим выхода для пин
	  
          pinMode(RelayChn1,OUTPUT);        //ВЫХОД на РЕЛЕ 1
          digitalWrite(RelayChn1,HIGH);     //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень(откл)
          pinMode(RelayChn2,OUTPUT);        //ВЫХОД на РЕЛЕ 2
          digitalWrite(RelayChn2,HIGH);     //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень(откл)
          
	}
	 
	void loop()
	{
 float dist_cm1 = ultrasonic1.Ranging(CM);       // считываем показание 1 сонара
 delay(10);
 float dist_cm2 = ultrasonic2.Ranging(CM);       // считываем показание 2 сонара
 delay(10);
Serial.println(dist_cm1); // дистанция1 и дистанция2
Serial.println(dist_cm2);        
 
	 
//срабатывание 1 сонара при расстоянии до 250 см - вкл реле 1(ЛЕСТНИЧНАЯ КЛЕТКА)

	  if (dist_cm1 < 250) // дистанция до 250 см.
          { 
            digitalWrite(RelayChn1,LOW); // ВКЛ 1 реле 
          
	    previousMillis1 = millis(); // каждый раз при нажатии кнопки отсчёт отсрочки начинаеться сначала...
	  }
	  // Прошло время выключаем реле 1
	  if(previousMillis1 && (millis()-previousMillis1 >= interval1))
	  {
	    digitalWrite(RelayChn1,HIGH); //ОТКЛ 1 реле
	    previousMillis1 = 0;
	  }


//срабатывание 2 сонара при расстоянии до 150см - вкл реле 1(прихожая)
	  if (dist_cm2 < 150) 
          { 
          digitalWrite(RelayChn2,LOW); //ВКЛ 2 реле
	  previousMillis2 = millis(); // каждый раз при нажатии кнопки отсчёт отсрочки начинаеться сначала...
	  }
	  // Прошло время выключаем реле 2
	  if(previousMillis2 && (millis()-previousMillis2 >= interval2))
	  {
	    digitalWrite(RelayChn2,HIGH); //ОТКЛ 2 реле 
	    previousMillis2 = 0;
	  }


Попробовал залить на ардуино про мини демо-код блинк...заливал через уно(есть usb to rs232 pl2303hx, но на нем нет пина ресет, а с кнопкой не охота было эксперементировать...), все работает...

Есть вопросы - замерил ток потребляющий УНО ардуино- когда включены 2 реле, в работе 2 сонара, горит 2 LED- ток потребляет около 200 мА., а еще планирую прицепить еще один сонар и одно реле(и еще может, что подцеплю)...т.е ток должен будет быть около 300 мА(LED понятно, что запитаю и запитано отдельно)...опасаюсь что спалю все...а к мини и вообще боюсь подцеплять. Понятно, что можно через транзисторы, но охота подачей внешнего U на блок реле.Пробовал подавать питание внешнее и на сонары и на реле(GND и +5В.)--увы, не работает...сейчас буду погуглить поискать про внешнее питание, но может кто подскажет что нибудь.

Использую 2-канальный блок реле 5V Two 2 Chanel Relay Modul With optocoupler

http://www.ebay.com/itm/181026509345?ssPageName=STRK:MEWNX:IT&_trksid=p3...

сонары - HC-SR04

в описании указано, что обмотка реле потребляет 15-20мА....т.е получается - 40мА -реле и 160 мА сонары получается, т.е по 80 мА на каждый сонар(сама ардуина почти нечего не ест)...завтра попробую посмотреть сколько кушает одно реле, ну и потои один сонар( измеряю на разьме usb).....про мини потянет такую нагрузку?

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

 

igorcds
Offline
Зарегистрирован: 03.12.2013

в ардуино про мини указано ток нагрузки на пинах входа/выхода 40мА, а на странице продавца max output 150mA...это имеется ввиду суммарная нагрузка по всем i/o которую может потянуть мини?

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

igorcds пишет:

в ардуино про мини указано ток нагрузки на пинах входа/выхода 40мА, а на странице продавца max output 150mA...это имеется ввиду суммарная нагрузка по всем i/o которую может потянуть мини?

это имеется ввиду, что нужно читать даташиты на контроллер, а не надписи на трусах продавца.

igorcds
Offline
Зарегистрирован: 03.12.2013

по даташит - 40мА., но смутило 150мА max output

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

igorcds пишет:

по даташит - 40мА., но смутило 150мА max output

всё, что в даташите - правда.

всё, что на странице продавца - ложь.

*так понятно? чего он про какие-то токи пишет - каким образом он их может гарантировать, если эти параметры зависят исключительно от производителя контроллера?

igorcds
Offline
Зарегистрирован: 03.12.2013

ага. понятно. HC-SR04 15 мА по даташит...по идее все должно пойти...

 

mag155
Offline
Зарегистрирован: 21.12.2017

Народ привет ! Изучил меня некий вопрос так вот как по внешнему прерыванию трех последовательных очень коротких импульсов запустить три независимых таймера и чтоб по окончанию каждого из таймеров выполнить свое действие и сбросить таймер ? Подскажите а то мочи больше нет что я только не пробовал но так чтоб три не зависимо друг от друга не получается .

Green
Offline
Зарегистрирован: 01.10.2015

Только лопухи говорят "очень коротких импульсов".

mag155
Offline
Зарегистрирован: 21.12.2017

А как же говорят гуру местного разлива .?

Green
Offline
Зарегистрирован: 01.10.2015

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

mag155
Offline
Зарегистрирован: 21.12.2017

Еще нормальные не хамят с порога.

Green
Offline
Зарегистрирован: 01.10.2015

А ещё спасибо говорят за то что учат, а не в позу становятся.
Удачи!

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

mag155 пишет:
Еще нормальные не хамят с порога.

да разве это с порога?

МАГ, вы в какую ветку уже влезаете с совершенно посторонними вопросами? Похоже, это у вас прием такой - задавать вопросы как бы между прочим в совершенно левых ветках. Думаю, это затем, чтоб не привлекать лишнего внимания - ведь, как правило, вы ничего не понимаете в том, что спрашиваете и потому все ваши вопросы традиционно очень плохо сформулированы. Если б вы начали новую тему - в нее народ ходил бы глумится... а так может и прокатит :)

mag155
Offline
Зарегистрирован: 21.12.2017

d 707 ве чё то тупите совсем. Тема называется "Параллельное выполнение 2-3 задач ". А вопрос мой "как по внешнему прерыванию трех последовательных очень коротких импульсов запустить три независимых таймера" разве это не есть параллельное выполнение задач?

mag155
Offline
Зарегистрирован: 21.12.2017

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ТАКУЮ задачу тут нихто решыть не в состоянии. И ты.

mag155
Offline
Зарегистрирован: 21.12.2017

Так ответьте по человечески что да как, если ответ знаете .Зачем строить из себя не известно что .?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да ладно, дед! Легко:

Покупаем три таймера, можно будильника "Слава", заказываем запуск на "Союз-Протон", а может и "Зенит" пойдет .. и по короткому импульсу с отсчетом 10-9-8.. "пуск" запускаем все это как и куда оно улетит. Деньга много нада и усё. Впрочем, студенты теперь народ не бедный вовсе. (СТУДЕНТ = Срочно Требуется Уйма Денег Есть Нечего Точка)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

не. не по Сеньке шапка.