Ви не увійшли.
Здравствуйте!
Помогите мне пожалуйста со скетчем, с апаратной я знаком.
Алгоритм такой:
Ардуинка при включении слушает кнопку на пине №X, и при нажатии, включает реле на пине №Y на 6 секунд 19 милисекунд в это время ардуинка на кнопку не реагирует (то-есть таймер на 6 секунд 19 милисекунд не перезапускает), а по истечению этого времени, не реагирует еще 10 секунд 53 милисекунды и сново уходит в ожидание команды с кнопки.
Неактивний
Ну тут как бы все просто:
#define pinX 1
#define pinY 2
void setup(){
    pinMode(pinX,INPUT_PULLUP);//включаем пин Х на вход с внутр. подтягивающим резистором. Кнопкой замыкаем его на землю
    pinMode(pinY,OUTPUT);//пин реле на выход
}
void loop(){
    if(digitalRead(pinX)==LOW){//ждем нажатия кнопки
        digitalWrite(pinY,HIGH);//включили реле
        delay(6019);//ждем 6 секунд 19 милисекунд
        digitalWrite(pinY,LOW);//выключаем реле
        delay(10053);//ждем еще 10 секунд 53 милисекунды и продолжаем дальше ждать нажатия кнопки
    }
}1 и 2 замените на номера используемых выводов
Неактивний
{ 
   analog=analogRead(14);//считываем сигнал с пина АЦП 
if(analog>0&&analog<1020) //здесь я сравниваю значение входящего сигнала для прихожая
         { 
               if(digitalRead(2)==HIGH&&flag_1==1)//если свет не включен  
                 { 
                   digitalWrite(2,!digitalRead(2)); //меняем состояние вывода на противоположный
                   flag_1=0; 
                   
                 } 
               if(digitalRead(2)==LOW&&flag_1==0)//если свет включен 
                 { 
                 // digitalWrite(2,!digitalRead(2)); //меняем состояние вывода на противоположный
                  flag_1=1;//обнуляем переменную flag 
                 } 
                 Serial.print("flag_1=  ");
                 Serial.print(flag_1);
                 Serial.print("  PIN-2=  ");
                 Serial.println(digitalRead(2));
         } 
други дорогие, помогите наладить код. кнопок 10 на аналог 0, 10 выходов пин2-пин12, 1 нажатие кнопки должно изменять одно состояние пина!
{ 
   analog=analogRead(14);//считываем сигнал с пина АЦП 
if(analog>0&&analog<1020) //здесь я сравниваю значение входящего сигнала для прихожая
         { 
               if(digitalRead(2)==HIGH&&flag_1==1)//если свет не включен  
                 { 
                   digitalWrite(2,!digitalRead(2)); //меняем состояние вывода на противоположный
                   flag_1=0; 
                   
                 } 
               if(digitalRead(2)==LOW&&flag_1==0)//если свет включен 
                 { 
                 // digitalWrite(2,!digitalRead(2)); //меняем состояние вывода на противоположный
                  flag_1=1;//обнуляем переменную flag 
                 } 
                 Serial.print("flag_1=  ");
                 Serial.print(flag_1);
                 Serial.print("  PIN-2=  ");
                 Serial.println(digitalRead(2));
         } 
други дорогие, помогите наладить код. кнопок 10 на аналог 0, 10 выходов пин2-пин12, 1 нажатие кнопки должно изменять одно состояние пина!  то биш будет аналоговый выключатель.
Здравствуйте,
также нужен хелп с задержкой. Алгоритм следующий:
Для управления шаговиком использую (только одно направление):
void clockwise(){
  // 1
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);
  // 2
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);
  // 3
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);
  // 4
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);
  // 5
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);
  // 6
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);
  // 7
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);
  // 8
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);
}
где delayMicroseconds(motorSpeed); меняется в зависимости от скорости. Нужно что бы это все вращалось 5 секунд после нажатия кнопки старт (независимо от значения delayMicroseconds(motorSpeed);) при этом кнопка старт должна не реагировать на нажатие пока идет процес 5 секунд вращения. Время вращения планирую изменять.
заранее благодарю.
Передай motorSpeed как аргумент для функции clockwise(). Тогда можно будет задавать скорость в теле main и считать кол-во оборотов для целевой задержки без неизбежного геморроя:
  unsigned long delay = 5000000;                    // Задержка 5 сек.
  unsigned long motorSpeed = 250;                 // Скорость 250мкс на такт, 1мс на оборот
  unsigned long iterations = delay/(speed * 4);  // кол-во оборотов для 5 сек.
void loop(){
  ...
 // Вращаем 5 сек.
 for(i=0;i<iterations;i++)  clockwise(motorSpeed);
  ...
}Альтернативный вариант - написать прерывания таймера и пина кнопки, переделать код и не забыть до исполнения кода моторчика отключить прерывания, а после - включить их обратно. Таким макаром задержка действительно не будет зависеть от скорости движка или любых других параметров.
+ Зачем в ручную-то крутить? Сейчас простенький H-Bridge стоит дешевле, чем транзисторы которыми драйвить мотор надо.
Спасибо, испытаю.
Ну тут как бы все просто:
#define pinX 1 #define pinY 2 void setup(){ pinMode(pinX,INPUT_PULLUP);//включаем пин Х на вход с внутр. подтягивающим резистором. Кнопкой замыкаем его на землю pinMode(pinY,OUTPUT);//пин реле на выход } void loop(){ if(digitalRead(pinX)==LOW){//ждем нажатия кнопки digitalWrite(pinY,HIGH);//включили реле delay(6019);//ждем 6 секунд 19 милисекунд digitalWrite(pinY,LOW);//выключаем реле delay(10053);//ждем еще 10 секунд 53 милисекунды и продолжаем дальше ждать нажатия кнопки } }1 и 2 замените на номера используемых выводов
А без delay это можно сделать?
Можно, см.в сторону millis()
Стандартный пример мигания светодиодом без delay - http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Неактивний
Здравствуйте
Буду признателен если кто нибудь подскажет с millis() - может кто нибудь уже проходил через такую задачу. Короче нужно ловить входящий дискретный сигнал и измерять его длительность на одном из входов ардуинки и считать их количество (планирую просто смотреть эти данные через Serial Monitor). Как бы лог такой вести. Пробовал организовать это по принципу кнопки с задержкой - no luck.
Спасибо если кто подскажет.
Пробовал организовать это по принципу кнопки с задержкой - no luck.
Сложно представить, как тут задержку использовать.
Напрашивается следующий алгоритм:
1) отслеживаем начало сигнала и как только он появился считываем millis() и сохраняем значение в переменную
2) следим когда сигнал закончится и снова считываем значение millis()
3) от текущего показания вычитаем предыдущее - это и будет длительность сигнала
4) плюсуем единицу в счетчик количества сигналов
Неактивний
Может кому пригодится ловить сигнал без осцила при помощи ардуино. 
 
const int buttonPin = 2;  
const int ledPin =  13;
long startTime;
long endTime;
long signalLength;
int signalNumber = 0;
int buttonState;    
int lastButtonState = 0;
void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT); 
  // initialize the button pin as an input:
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
}
void loop(){
  buttonState = digitalRead(buttonPin);
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH)
    startTime = millis();
    digitalWrite(ledPin, HIGH);
    lastButtonState = buttonState;
  if (buttonState == LOW) {
    endTime = millis();
    signalLength = endTime - startTime;
    Serial.print("Pulse length:  ");
    Serial.println(signalLength);
    ++signalNumber;
    Serial.print("Signal Number:  ");
    Serial.println(signalNumber);
    digitalWrite(ledPin, LOW);
  }
}
}
Такой вопрос можете ли вы найти ошибку в программе . Программа для сигнализации. Тупик в том что когда дверь открываться сигнализация не срабатывает!
//
const int button = 12; //
const int gerkon = 3; //
const int sirena = 2; //
const int led = 13; //
//
int buttonState = 0; //
int gerkonState = 0; //
int N = 0; //
void setup(){
//
pinMode(sirena,OUTPUT);
pinMode(led,OUTPUT); //
pinMode(gerkon, INPUT);
pinMode(button, INPUT);
}
void loop()
{
digitalWrite(led, HIGH);
while(buttonState==0){//
buttonState = digitalRead(button); //
}
digitalWrite(led,LOW);
buttonState = 0; //
while(gerkonState = 0){ //
gerkonState = digitalRead(gerkon);
}
delay (500); //
digitalWrite(sirena, HIGH); //
delay (100); //
digitalWrite(sirena, LOW); //
delay (70); //
digitalWrite(sirena, HIGH); //
delay (100); //
digitalWrite(sirena, LOW); //
while(gerkonState==1){ //
gerkonState = digitalRead(gerkon);
}
for (int i=0; i<=5; i++){ //
buttonState = digitalRead(button); //
if (buttonState == HIGH){ //
N=N+1;
}
delay(1500); //
}
if (N>0){ //
digitalWrite(sirena, LOW); //
}
else {
digitalWrite(sirena, HIGH); //
}
digitalWrite(led, HIGH); //
buttonState = 0;
delay(1500); //
digitalWrite(led, LOW); //
}
Неактивний
nikon, ну чё за сленг?, не Блинский я.
поподробнее?
вот поподробнее
см. код
while(gerkonState = 0){ //
gerkonState = digitalRead(gerkon);
}
gerkonState = 0   переменной gerkonState присваиваем ноль
gerkonState = digitalRead(gerkon); никогда не выполняется 
надеюсь делаете сигналку для холодильника, 
иначе рекомендую реализовать защиту от дребезга.
по хорошему - реализуйте на прерываниях, с запуском таймера в котором контролируете время непрерывного события, ну а дальше в зависимости от настроек вашего обьекта (нормально замкнут или разомкнут) выставляете свой алярм.
итого 
строчку while(gerkonState = 0){ //
заменить на while(gerkonState == 0) { //  check state gerkon
успеха.
Неактивний
Ну ты извени если что не так, это не к тебе относилось.
мне пропад сказал что причина не в этом. 
вот его слова"Это мелочь и она выявляется на этапе компиляции. На логику работы
скетча это не влияет. Надо смотреть логику работы программы,
а именно - последний цикл."
Неактивний
так запустилось или нет ? )
void loop()
{
digitalWrite(led, HIGH);
do { //  ожидаем  постановки на охрану
	buttonState = digitalRead(button); //
} while( buttonState == 0 ) 
//  поставили на охрану
digitalWrite(led,LOW);
buttonState = 0; //
// выключили лампочку 
do { // ожидаем отработки геркона 
	gerkonState = digitalRead(gerkon);
} while( gerkonState == 0) 
// 1 сек  играет звук 
 exe_sirena ();
do { // ожидаем закрытия двери
	gerkonState = digitalRead(gerkon);
} while( gerkonState == 1 ) 
// кнопка нажата? не совсем корректный цикл. 
N = 0;
for (int i=0; i<=5; i++)
{ //
  buttonState = digitalRead(button); //
  if (buttonState == HIGH) N++;
  delay(1500); //
}
if ( N > 0 ) 
	  digitalWrite(sirena, LOW); //
else  digitalWrite(sirena, HIGH); //
digitalWrite(led, HIGH); //
buttonState = 0;
delay(1500); //
digitalWrite(led, LOW); //
}можно и так
gerkonState = 1;  // 
while(gerkonState==1)
{ //
gerkonState = digitalRead(gerkon);
}Неактивний
Здравствуйте, уважаемые ардуиноведы. Помогите, пожалуйста, с кодом:
#include <SD.h>
const int buttonPin = 2; 
File myFile;
unsigned long startTime;
unsigned long endTime;
long signalLength;
int signalNumber = 0;
int buttonState;   
int lastButtonState = 0;
void setup()
{
  Serial.begin(9600);
   while (!Serial) {
}
  pinMode(buttonPin, INPUT); 
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
}
void loop()
{
 buttonState = digitalRead(buttonPin);
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH)
    startTime = millis();   
    lastButtonState = buttonState;
    if (buttonState == LOW) {
    endTime = millis();
    signalLength = endTime - startTime;
    ++signalNumber;
      myFile = SD.open("test.txt", FILE_WRITE);
      if (myFile) {
      myFile.print(signalNumber);
      myFile.print(" - ");
      myFile.println(startTime);
      myFile.close();
      }
  }
 }
}
Программу скопи-пастил с этой же страницы (спасибо SeSу из 12го поста).
Задумка такая - пользователь нажимает на кнопку (пин2), сие событие инициирует запись на SD. Проблема - запись идет постоянно, с 20 мс интервалом. Нажатие кнопки отображаеться как остановка записи в файл с длительностью удержания кнопки. Пробовал с условиями buttonState == LOW/HIGH играть - не то.
Буду благодарен за любую помощь.
attachInterrupt(0, key_interrupt, CHANGE ); 
key_interrupt- function 
https://www.arduino.cc/en/Reference/AttachInterrupt
выбирайте тот пин на который можно прикрутить прерывание
ех хорошая каменюка в сторону атмела ))))
в функции выставляете флаг события, когда начнете запись, снимайте
в файл пишется время 
опишите задачу что нужна,
 почему постоянно открываете файл?  откройте один раз  в setup и пользуйтесь дискриптором  файла.   будет быстрее
Остання редакція NoName (2015-07-21 00:04:34)
Неактивний
Спасибо за ответ. 
Только что пробовал. Пин 2й (согласно спецификации на UNO).
#include <SD.h>
File myFile;
unsigned long time;
void setup()
{
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) {
    return;
  }
  attachInterrupt(0, key_interrupt, CHANGE); 
}
void loop()
{
 time = millis();
}
void key_interrupt()
{
     myFile = SD.open("test.txt", FILE_WRITE);
     myFile.println(time);
     myFile.close();
}Получилось снять данные в виде таблица
Пробовал через переменную-флаг, которая менялась по прерыванию, а в цикле loop() выполнял проверку на состояние флага - но цикличность записи была такая же. А мне нужно, чтобы запись была только по факту нажатия на кнопку, единожды... А тут "простыню" данных, на 1000-50000 значений выводит.
З.Ы.
Только что попробовал: 
#include <SD.h>
File myFile;
unsigned long time;
void setup()
{
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) {
    return;
  }
  attachInterrupt(0, key_interrupt, CHANGE); 
}
void loop()
{
 time = millis();
}
void key_interrupt()
{
zapis();
}
void zapis()
{
       myFile = SD.open("test.txt", FILE_WRITE);
     myFile.println(time);
     myFile.close();
}И тоже, зараза, не пашет. Значения как на листе "вар. 3" в файле.
Спасибо, NoName.
int pin = 13;
volatile int state = LOW;
unsigned long time;
 
void setup()
{
  pinMode(pin, OUTPUT);
  Serial.begin(57600);
  attachInterrupt(0, blink, FALLING);
}
 
void loop()
{
  time=millis();
  digitalWrite(pin, state);
  if(state==HIGH){
    Serial.println(time);
    state = LOW;
  }
    digitalWrite(2,LOW);
}
 
void blink()
{
  state = !state;
}Работает как хотел. Запара в подключении кнопки была - история о «плохих» контактах и моих кривых руках ?
Спасибо.
Здравствуйте! Помогите советом начинающему.
Как реализовать разные режимы нажатия одной кнопки?
Например: 
режим 1 - нажал кнопку около 1 сек. - светодиод загорелся, отпустил кнопку - светодиод потух;
режим 2 - нажал кнопку, удерживая 2 сек. - светодиод загорелся, отпустил кнопку - светодиод горит, нажал повторно кнопку на 2 сек. - светодиод потух.
отдельными скетчами режимы реализованы, но режим 2 реализовал классически, без тайминга (нажал - горит, отпустил - горит, нажал - потух)