Больше дискретных выходов

seval
Offline
Зарегистрирован: 31.03.2013

Здравствуйте Уважаемые! Я хочу организовать свой АВР. Мне нужно 2 аналоговых входа, 6 дискретных входов и 14 дискретных выходов. Это возможно подключить к одной Arduino UNO? Может нужны какие то модули расширения?

paf
Offline
Зарегистрирован: 25.01.2013

Вот кстати, можно тут приглядеть.

maksim
Offline
Зарегистрирован: 12.02.2012
seval
Offline
Зарегистрирован: 31.03.2013
demon969
Offline
Зарегистрирован: 24.04.2012

Добрый день!

Подскажите пожалуйста, я хочу подключить сдвиговый регистр 74HC595, по ссылке выше, но у меня пины там заняты sd модулем

http://www.dfrobot.com/wiki/index.php/SD_Module_%28SKU:_DFR0071%29

Можно ли сдвиговый регистр 74HC595 подключать на произвольные пины к UNO?

И вообще в инете встречаются примеры когда подключение происходит на pin 8-10

Пример http://bildr.org/2011/02/74hc595/

 

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

Можно.

seval
Offline
Зарегистрирован: 31.03.2013

Дабы не делать новую тему, есди ни кто не против, продолжу здесь. Как смог написал скетч. 

int refrig = 11;                // холодильник
int offpower = 12;              // реленапряжения
int kotel = 13;                 // котел
int val=0;

void setup()                     
{
  pinMode(kotel, OUTPUT);      // это выход - котел
  pinMode(refrig, OUTPUT);      // это выход - холодильник
  pinMode(offpower, INPUT);    // а это вход - реле напряжения  
}
void loop()                      
{
  val = digitalRead(offpower);    // узнаём состояние питания
  if(val==HIGH)                 // питание пропало
  {
    digitalWrite(kotel, LOW); // выключаем котел
    digitalWrite(refrig, LOW);  //выключаем холодильник
    delay(1000);                // задержка 1 сек
    digitalWrite(kotel, HIGH); // включаем котел
    delay(5400000);                //время работы котла 90 мин
    digitalWrite(kotel, LOW); // выключаем котел
    delay(1000);              // задержка 1 сек
    digitalWrite(refrig, HIGH);  //включаем холодильник
    delay(1800000);              // время работы холодильника 30 мин
  }
  else                          // питание есть
  {
    digitalWrite(kotel, HIGH);  // включаем котел
    digitalWrite(refrig, HIGH);  //включаем холодильник
  }
  delay(100);
}

Подскажите пожалуйста! Как можно заставить Ардуино при появлении питании сразу закончить программу, а не ждать ее завершения

step962
Offline
Зарегистрирован: 23.05.2011

seval пишет:

Подскажите пожалуйста! Как можно заставить Ардуино при появлении питании сразу закончить программу, а не ждать ее завершения

Так и хочется ответить: не включать Ардуину.

Ибо непонятно, что же там должно завершаться "при появлении питания", если без питания вообще-то ничего не может начаться?

Попробуйте более корректно сформулировать свой вопрос...

seval
Offline
Зарегистрирован: 31.03.2013

Пытаюсь сделать АВР. У меня есть ИБП, который обеспечит питанием нагрузку 500 ВТ  в течении 10 часов.

Задача.

1. При выключении питания (вырубили свет) АВР должен запитывать поочередно то котел то холодильник. 

2. Одновременно с первой задачей, обеспечить освещением 4 помещения. При наличии движения в этих помещениях.

3. После появления питания все должно вернутся в обычный режим.

Про питание я имел ввиду не питание Ардуинки. В моем случае если offpower будет LOW, значит появилось питание (сетевое)

step962
Offline
Зарегистрирован: 23.05.2011

Исполнение программы на микроконтроллере завершить нельзя. Либо вы организуете в ней бесконечный цикл, либо раз за разом будет происходить переполнение программного счетчика и передача управления на адрес 0, что равноценно старту программы.

Так что придется вам смириться с тем, что микропрограмма исполняется постоянно. Хотите добиться того, чтобы

"3. После появления питания все должно вернутся в обычный режим."

поставьте соответствующее условие. Это делается примерно так же, как исполнение пунктов 1 и 2 в случае исчезновения питания. С этим вам, видимо, уже удалось справиться?

seval
Offline
Зарегистрирован: 31.03.2013

step962 пишет:
 С этим вам, видимо, уже удалось справиться?

Пока нет.

Соответствующее условие? Знать бы как.

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

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

seval пишет:

Соответствующее условие? Знать бы как.

Для реализации подобного не требуется ардуино - достаточно двух реле:

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

второе отключает котёл при включении холодильника.

seval
Offline
Зарегистрирован: 31.03.2013

Клапауций пишет:

seval пишет:

Соответствующее условие? Знать бы как.

Для реализации подобного не требуется ардуино - достаточно двух реле:

Это только начало. Хочется дальше увеличивать потенциал своего дома.

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

seval пишет:

Это только начало. Хочется дальше увеличивать потенциал своего дома.

Какой был потенциал - такой и останется.

холодильник сутки можно не включать, котёл вообще не отключать, освещение не включать лишнее.

seval
Offline
Зарегистрирован: 31.03.2013

Клапауций пишет:

seval пишет:

Это только начало. Хочется дальше увеличивать потенциал своего дома.

Какой был потенциал - такой и останется.

холодильник сутки можно не включать, котёл вообще не отключать, освещение не включать лишнее.

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

demon969
Offline
Зарегистрирован: 24.04.2012

Помогите разобраться. К Uno подключен сдвиговый регистр 74HC595.

К ножке Q2 сдвигового регистра 74HC595 подключен светодиод, хочу понять как заставить его к примеру моргать. В приведенном коде, он не моргает.

#define DS   11 //Пин подключен к DS входу 74HC595
#define SHCP 12 //Пин подключен к SH_CP входу 74HC595
#define STCP 10 //Пин подключен к ST_CP входу 74HC595

void setup() {
  pinMode(DS,OUTPUT);
  pinMode(SHCP,OUTPUT);
  pinMode(STCP,OUTPUT);
  //digitalWrite(SHCP,LOW);  
  //digitalWrite(STCP,LOW);  
}

void loop() {
  //for (int k=0;k<256;k++) {
   // shiftOut(DS,SHCP,LSBFIRST,k);
   // digitalWrite(STCP,HIGH);
   // delay(1);
  //  digitalWrite(STCP,LOW); 
   // delay(100);
 // }
  
shiftOut(DS,SHCP,LSBFIRST, 01000000);
digitalWrite(STCP,HIGH);
delay(1000);
digitalWrite(STCP,LOW);

shiftOut(DS,SHCP,LSBFIRST,0);
digitalWrite(STCP,HIGH);
delay(1000);
digitalWrite(STCP,LOW);
delay(1000);
}

Разобрался сам

maksim
Offline
Зарегистрирован: 12.02.2012
#define DS   11 //Пин подключен к DS входу 74HC595
#define SHCP 12 //Пин подключен к SH_CP входу 74HC595
#define STCP 10 //Пин подключен к ST_CP входу 74HC595

void setup() 
{
  pinMode(DS, OUTPUT);
  pinMode(SHCP, OUTPUT);
  pinMode(STCP, OUTPUT); 
}

void loop() 
{
  digitalWrite(STCP, LOW);
  shiftOut(DS, SHCP, LSBFIRST, 0b01000000);
  digitalWrite(STCP, HIGH);
  delay(1000);
  
  digitalWrite(STCP, LOW);
  shiftOut(DS, SHCP, LSBFIRST, 0);
  digitalWrite(STCP, HIGH);
  delay(1000);
}

 

olegab
Offline
Зарегистрирован: 09.04.2013

 

seval пишет:

Пытаюсь сделать АВР. У меня есть ИБП, который обеспечит питанием нагрузку 500 ВТ  в течении 10 часов.

Задача.

1. При выключении питания (вырубили свет) АВР должен запитывать поочередно то котел то холодильник. 

2. Одновременно с первой задачей, обеспечить освещением 4 помещения. При наличии движения в этих помещениях.

3. После появления питания все должно вернутся в обычный режим.

Про питание я имел ввиду не питание Ардуинки. В моем случае если offpower будет LOW, значит появилось питание (сетевое)

в основном цикле управлять осещением и отслеживать появление и пропадание питания.

если питание пропало - установка прерывания по таймеру на 30 мин и переключение нагрузки в обработчике. При появлении питания сбрасыватиь обработчик прерывания в основном цикле 

olegab
Offline
Зарегистрирован: 09.04.2013

 

прерывание по таймеру в Arduino не тривиальная задача http://www.arduino.ru/Tutorial/Arduino_Interrupts_part2 .

Без него примерно так.


bool refrON=false;
bool powerState=HIGH;
unsigned long time;

void powerLost(){
refrON=false;
time = millis();
changeCurrent();
} 

void powerOn(){ 
digitalWrite(kotel, LOW); // выключаем котел 
digitalWrite(refrig, LOW); //выключаем холод 
} 
changeCurrent(){ 
if(refrON){ digitalWrite(kotel, HIGH); // включаем котел 
digitalWrite(refrig, LOW); //выключаем холодильник 
} else{ digitalWrite(kotel, LOW); // выключаем котел 
digitalWrite(refrig, HIGH); //включаем холодильник 
} refrON=!refrON; } 

void setup(){ } 
void loop() { 
if(digitalRead(offpower) !=powerState){ // state changed 
{powerState=!powerState; 
if(powerState==HIGH)//power lost 
powerOff(); 
else powerOn();} 
else if (powerState==HIGH && millis()-time>30*60000) changeCurrent(); 

//здесь управление освещением 
}

у меня устройства нет, так что код "ориентировочный"

 

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

olegab пишет:

//здесь управление освещением

//включаем свет в туалете.

//выключаем холодильник.

зы

цирк и кони.

 

seval
Offline
Зарегистрирован: 31.03.2013

olegab пишет:

 

прерывание по таймеру в Arduino не тривиальная задача http://www.arduino.ru/Tutorial/Arduino_Interrupts_part2 .

Без него примерно так.

у меня устройства нет, так что код ориентировочный

Спасибо! На днях попробую и напишу здесь.

select2
Offline
Зарегистрирован: 31.10.2012

Используйте библиотеку SimpeTimer для асинхронных событий: ОЧЕНЬ просто и очень функцинально.

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