Ви не увійшли.
Здравствуйте!
Помогите мне пожалуйста со скетчем, с апаратной я знаком.
Алгоритм такой:
Ардуинка при включении слушает кнопку на пине №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 реализовал классически, без тайминга (нажал - горит, отпустил - горит, нажал - потух)