помогите новичку

nikolas51
Offline
Зарегистрирован: 27.08.2015

Всем доброй ночи. Помогите пожалуйста с написание скетча. У меня в машине стоят электростеклоподъемники, хочу с помощью ардуинки реализовать доводчики стекл. Для этого приобрел вот такие  датчики : http://www.ebay.com/itm/1pcs-30A-range-Current-Sensor-Module-ACS712-Modu... . Немного поэксперементировал, вроде работают. Я очень не силен в програмировании и надеюсь на Вашу помощь. Программа должна выглядеть так: при длительном нажатии кнопки- нечего не происходит, при кратковременном нажатии(менее 500мсек) поступает команда - пауза(500мсек для старта двигателя) и за тем команда на поднятие стекла и не прерывается пока датчик тока не превысит заданное значение. Интересует строчка с продолжительностью нажатия кнопки и как заставить ардуинку не выполнять следущую строку, пока не "поднимет стекло". Зарание спасибо!

nikolas51
Offline
Зарегистрирован: 27.08.2015

Немнего неправильно написал: поступает команда на поднятие стекла, затем пауза и после этого проверка на превышение силы тока

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Заводите переменную состояния. Каждому из последовательных действий приписываете номер, который будет храниться в этой переменной. При каждом состоянии производите только те действия, которые соответствуют именно этому состоянию или переходу в следующее состояние.

nikolas51
Offline
Зарегистрирован: 27.08.2015

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Примерно так:

- исходное состояние 0 - ждем нажатия на кнопку,

- дождались нажатия на кнопку, запоминаем время, переходим в состояние 1,

- состояние 1 - ждем отпускания кнопки,

- когда дождались, выясняем, коротким бьыло нажатие или длинным. Если длинным, по условию - ничего не делаем, переходим в состояние 0, если коротким - запоминаем время ипереходим в состояние 2,

- состояние 2 - пауза, ждем 500 мс по окорнчании переходим в состояние 3, для чего запускаем двигатель,

- состояние 3 - подъем стекла, ждем срабатывание концевика,

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

mcboris
Offline
Зарегистрирован: 12.09.2015

Народ не пинайте если обсуждалось. Как сделать термостат на ардуино нано?  Нужен скетч. Перерыл весь интернет, но так и не нашёл. Хочу сделать на DHT11+LCD1602+arduino nano+реле.

Имею вот такой скетч:

#include "DHT.h"
#include <LiquidCrystal.h>
#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
  // красивая "загрузка" программы при старте :)
  lcd.begin(16, 2);
  lcd.print("Loading");
  delay(500);                // ждем 0.5 секунды
  lcd.print(".");
  delay(500);                // ждем 0.5 секунды
  lcd.print(".");
  delay(500);                // ждем 0.5 секунды
  lcd.print(".");
  delay(1000);               // ждем 1 секунду
  lcd.clear();               //очистка экрана
}
void loop() {
delay(1000);        //wait a sec (recommended for DHT11)
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
}
else {
lcd.setCursor(0,0);
lcd.print("Temp     ");
lcd.print(t);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Humidity ");
lcd.print(h);
lcd.print("% ");
delay(2000);
}
}

надо чтоб реле срабатывало при определённой температуре.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вариантов всего 2:

1. Делаете сами.

2. Размещаете тему в "Ищу исполнителя", где Вам все сделают за соответствующую оплату.

mcboris
Offline
Зарегистрирован: 12.09.2015

andriano пишет:

Вариантов всего 2:

1. Делаете сами.

2. Размещаете тему в "Ищу исполнителя", где Вам все сделают за соответствующую оплату.

1. Сам не могу, знаний маловато.

2. За соответствующую плату можно купить готовый прибор и париться. Но я хотел сам разобраться, но подсказать и обьяснить  не кому.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

mcboris пишет:

andriano пишет:

Вариантов всего 2:

1. Делаете сами.

2. Размещаете тему в "Ищу исполнителя", где Вам все сделают за соответствующую оплату.

1. Сам не могу, знаний маловато.

2. За соответствующую плату можно купить готовый прибор и париться. Но я хотел сам разобраться, но подсказать и обьяснить  не кому.

А в чем проблема-то? У вас есть переменая t. Вам нужно выполнить некоторое действие, в зависимости от диапазона, в котором находится переменная в данный момент.

Что именно у вас не получается?

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

Gippopotam пишет:

mcboris пишет:

andriano пишет:

Вариантов всего 2:

1. Делаете сами.

2. Размещаете тему в "Ищу исполнителя", где Вам все сделают за соответствующую оплату.

1. Сам не могу, знаний маловато.

2. За соответствующую плату можно купить готовый прибор и париться. Но я хотел сам разобраться, но подсказать и обьяснить  не кому.

А в чем проблема-то? У вас есть переменая t. Вам нужно выполнить некоторое действие, в зависимости от диапазона, в котором находится переменная в данный момент.

Что именно у вас не получается?

читай п.1.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mcboris пишет:

1. Сам не могу, знаний маловато.

2. За соответствующую плату можно купить готовый прибор и париться. Но я хотел сам разобраться, но подсказать и обьяснить  не кому.

А купить готовый прибор по-любому выйдет дешевле.

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

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

Но если Вы пришли просить помощи, то имейте в виду, помогаю НАУЧИТЬСЯ что-то сделать, но никак не СЭКОНОМИТЬ на чем-то.

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

mcboris
Offline
Зарегистрирован: 12.09.2015

andriano пишет:

 

А купить готовый прибор по-любому выйдет дешевле.

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

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

Но если Вы пришли просить помощи, то имейте в виду, помогаю НАУЧИТЬСЯ что-то сделать, но никак не СЭКОНОМИТЬ на чем-то.

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

Готовый термостат для гроубокса стоит куда дороже чем я купил ардуино. У меня вышло (нано+LCD+DHT+реле) 480р. Навыки у меня есть, но только не в праграмировании. Я инженер-электроник, то есть шарю в железе, а не в си.

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

Если есть возможность сикономить (сделать самому) то почему бы и нет. 

Короче всё понятно. Закрываю тему.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Видите ли, mcboris, если адекватно оценивать трудозатраты (если мы не говорим о хобби, для которого понятие "трудозатраты" неприменимо), то скетч стоит намного дороже аппаратной части Ардуино+датчики.

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

Так что в своих расчетах Вы учитываете лишь часть стоимости, притом часть совершенно незначительную.

nikolas51
Offline
Зарегистрирован: 27.08.2015

Извените за глупый вопрос, но не могу понять. Начал писать скетч, первые строки выглядят так:

int butVH = 3;   // кнопка вод. вверх
int butVL = 5;   // кнопка вод. вниз
int X = 0;      // состояние вод.
int V = 0;       // вых. на доводчик
 почему верхние две строчки ардуино понимает как номер выхода(входа), а нижние две строки как значение переменной?
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это не Ардуино, это - Си.

Все, что написано - переменные. А каков физический смысл конкретной переменной - определяет программа. В одну переменную записан номер пина, подключенный к кнопке, а в другую - "состояние вод".

НИкто не запрещает для номера пина использовать не переменную, а константу, но выглядеть это будет по-другому:

#define butVH 3

nikolas51
Offline
Зарегистрирован: 27.08.2015

а если я там напишу х=1 или х=2 как программа это поймет( посчитает что это значение или номер контакта)?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Запись x=1 будет означать, что переменной х присвоено значение 1. Всё, других вариантов нет. Дальше вы сами подставляете эту переменную в нужно место. Сама по себе переменная ничего не делает, она только хранит значение. 

P.S. Не существует такой самостоятельной сущности как "номер контакта". Значение номера контакта (или имя переменной, которая содержит это значение) указывается в какой-либо функции, например pinMode(), digitalWrite().

nikolas51
Offline
Зарегистрирован: 27.08.2015

Понятно. Спасибо

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

mcboris пишет:

Народ не пинайте если обсуждалось. Как сделать термостат на ардуино нано?  Нужен скетч. Перерыл весь интернет, но так и не нашёл. Хочу сделать на DHT11+LCD1602+arduino nano+реле.

надо чтоб реле срабатывало при определённой температуре.

Не хватайтесь за все сразу, рук не хватит.
Чтобы в общих чертах понять, что к чему, скачиваем Уилли Соммер "Программирование......." и играемся с примерами. Попробовав все примеры и набрав их своими ручками, уже примерно представляем синтаксис языка. Дальше все проще.
Берем нану, берем дисплей. Соединяем согласно схеме. Берем библиотеку для дисплея (надеюсь IDE уже установлено), открываем пример и учимся выводить данные в т.ч. переменные на дисплей. Постигнув истину, подключаем DHT и "Берем библиотеку для DHT.....  Только в итоге, уже зная как выводить переменные на дисплей, модифицируем пример DHT для вывода на LCD.
Ура, мы умеем получать данные с датчика и выводить их значение на дисплей. Теперь изучаем оператор IF и вспоминает как включали диод. Если реле твердотельное, то этого достаточно, если обычное, ищем схему подключения реле к Ардуино.
Термостат в колхозном исполнении готов.
Только начните писать сами, а не рыскать по просторам интернета за вашим скетчем. Будет что то не получаться, обращайтесь с конкретикой. Как то так.
 

nikolas51
Offline
Зарегистрирован: 27.08.2015

Немного упростил скетч. Будет ли работать? или что то надо править?

int butVH = 3;   // кнопка вод. вверх
int butVL = 5;   // кнопка вод. вниз
int X = 0;       // состояние вод.
int V = 3;       // выход доводчик
int AV = 2;      // датчик тока вод.
unsigned long Time1; // фиксированное время нажатия 
unsigned long Time2; // фиксированное время отпуск.
 
void setup()
{
}
 
void loop() 
{
if (X==0&&(digitalRead(butVH)== HIGH )){ // кнопка нажата
      Time1= millis();
      X=1;
      }
if (X==1&&(digitalRead(butVH)== LOW)){// кнопка отпущена
    Time2= millis(); 
    if (Time2-Time1<=300){
       analogWrite(V,255);}     // поднятие стекла
       else X=0;}
if (analogRead(AV)>=700){       // превышение силы тока
   V=0;
   X=0;
}
}
Sindbad
Offline
Зарегистрирован: 08.12.2015

nikolas51 пишет:

Будет ли работать?

 
Залейте в Ардуино, увидите, работает или нет.
 
Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

nikolas51 пишет:

Немного упростил скетч. Будет ли работать? или что то надо править?

Не забывайте инициализировать пины на вход/выход.

nikolas51
Offline
Зарегистрирован: 27.08.2015

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

Sindbad
Offline
Зарегистрирован: 08.12.2015

nikolas51 пишет:

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

А чуда не будет. Залить в Ардуино скетч придется не один раз. Подумать, исправить и еще раз залить. И так не менее сотни раз. См. ответ 18, другого пути нет.

Не торопитесь ничего в машину запихивать. Пусть "на столе" сначала заработает.

nikolas51
Offline
Зарегистрирован: 27.08.2015

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вариант один - собрать из подручных средств "эмулятор машины", в котором присутствовали бы важные для Вас элементы. А когда программа будет отлажена - только после этого переходить к испытаниям на натуре (и.е. машине). И то, вероятнее всего, одной перепрошивкой Вы не обойдетесь, просто на реальном устройстве сократите количество перепрошивок с 100 до 5-10.

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

nikolas51 пишет:

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

Вспомнил первый опыт прикладного программирования. Конец 80-х, СССР еще жив, институт молодых специалистов существует (для тех кто из тамошнего времени) а я работаю на стал.плав. печи и начал изучать Фортран. Терминал от ЕС-ки на столе стоит, но программ нет, только х.а. передается. Расчет нержавеющих марок стали ведется логарифмической линейкой, методом простых иттераций, достает жутко, а счет идет на минуты.
И вот два молодых специалиста с начатками программирования решают себе задачу упростить. Каждый пишет программу сам, алгоритмы железные, а печь уже работает и попробовать результат жутко хочется. Напарник написал раньше, успели протестить, не верно((((. Я чуть запоздал, но на первом тесте показал верный результат, УРА, используем!!!!
Получаем анализ, рассчитываем, отдаем ферросплавы, ждем. Жопас. 16 тонн в переплавку, ОГМЕТ по полу катается от причины, а я вывод делаю: Какой бы алгоритм не казался супержелезным, его всегда можно испоганить в процессе программирования, и пока не отладишь, дальше стола не пускать. От, на лирику потянуло.

Araris
Offline
Зарегистрирован: 09.11.2012

Спасибо за лирику (*смахнул скупую слезу). Я вдруг понял, что напрочь позабыл Фортран... (да и хрен с ним, мва-ха-ха)

Sindbad
Offline
Зарегистрирован: 08.12.2015

nikolas51 пишет:

 просто правильно ли я написал алгоритм?

Какая команда в вашем алгоритме выключает стеклоподъемник?

nikolas51
Offline
Зарегистрирован: 27.08.2015

  analogWrite(V,255);}     // поднятие стекла

Sindbad
Offline
Зарегистрирован: 08.12.2015

Sindbad пишет:

 выключает стеклоподъемник?

nikolas51 пишет:

  analogWrite(V,255);}     // поднятие стекла

Ок.

А какая включает ?

nikolas51
Offline
Зарегистрирован: 27.08.2015

на 3 выход ардуинки подается напряжение и дальше на транзистор.  я же выше написал строчку, или что то не так?

Sindbad
Offline
Зарегистрирован: 08.12.2015

nikolas51 пишет:

на 3 выход ардуинки подается напряжение и дальше на транзистор.  я же выше написал строчку, или что то не так?

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

После выполнения команды

analogWrite(3,255);

на третьем выходе Ардуины появиться +5V и будет оставаться, пока какая-нибудь другая команда не изменит это состояние. Повторное выполнение этой команды состояние выхода не изменит.

 

nikolas51
Offline
Зарегистрирован: 27.08.2015
if (analogRead(AV)>=700){       // превышение силы тока
   V=0;
   X=0;
}
при выполнении этого условия переменная V приобретет значение 0 и транзистор закроется. Или этого не произойдет, надо как то по другому написать?
Sindbad
Offline
Зарегистрирован: 08.12.2015

nikolas51 пишет:

if (analogRead(AV)>=700){       // превышение силы тока
   V=0;
   X=0;
}
при выполнении этого условия переменная V приобретет значение 0 и транзистор закроется.
Да. При выполнении условия переменная V приобретает значение 0. Утверждение "переменная V приобретает значение 0" эквивалентно утверждению "В два байта оперативной памяти микроконтроллера записывается значение 0". Естественно, "снаружи" от этого ничего не изменится.
 
В другом месте программы есть команда
analogWrite(V,255);

Которая при V равном нулю эквивалентна

analogWrite(0,255);

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

После выполнения этой команды на нулевом выходе Ардуино появится напряжение +5V. Состояние других выходов не изменится. Т.е. если на третьем выходе было +5V, то так и останется +5V.

Вы уверены, что появление напряжения на нулевом выходе приведет к закрытию транзистора и выключению стеклоподъемника?

 

nikolas51
Offline
Зарегистрирован: 27.08.2015

большое спасибо за разъеснения!!! именно такая помощь мне и нужна была, чуть позже исправлю

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Araris пишет:

Спасибо за лирику (*смахнул скупую слезу). Я вдруг понял, что напрочь позабыл Фортран... (да и хрен с ним, мва-ха-ха)

Ну, что Вы?!? Ну. как можно!

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

Впрочем верно и то, что: "настоящий  программист может написать фортрановскую программу на любом языке".

Например, слабо С++ шную константу изменить? На фортране-то констаны меняются легко, а вот здесь ... но для настоящего программиста это не проблема! :)

http://www.lib.ru/ANEKDOTY/non_pas.txt

 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

Например, слабо С++ шную константу изменить? На фортране-то констаны меняются легко, а вот здесь ... но для настоящего программиста это не проблема! :)

http://www.lib.ru/ANEKDOTY/non_pas.txt

Покажите, как Вы меняете фортрановские константы:

integer, parameter :: n = 5

Как сделать n равной 3?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В фортране можно поменять константу (например, 2 - чтобы была равна 10). На каком именно компиляторе Вам это показать?

Общий принцип там такой - в честном фортране: 

1) числовая константа заводится в памяти один раз и везде, где она нужна, она берётся из того места по адресу.
2) параметры функции передаются всегда по ссылке
3) это значит, что если функции передать в качестве параметра константу 2, а в теле функции параметру присвоить 10 - поменяется сама константа. И впредь, везде, где я пишу 2 - будет реально 10.

Так было в IBM/370. Потом я испытывал это на каком-то компиляторе для IBM PC - тоже работало. 

Если Вы знаете интересующий Вас компилятор - дайте ссылку, где скачать, я попробую.

-------------

Гораздо труднее поменять значение константы в С++. Поменять прямо значение 2 на 10 (как в фортране) не получится. Но изменить значение константы описанной как

const int a = <значение>;

это как два пальца - никаких проблем. Я имею в виду поменять значение уже после описания. Т.е.
 
const int a = <значение>;
Serial.prinln(a); // печатается <значение>
... некие действия на С++ ...
Serial.prinln(a); // печатается новое значение
 
Так вот, такое сделать нетрудно. Могу показать как это делается на любимом IDE'шном GNU C++
 

 

nikolas51
Offline
Зарегистрирован: 27.08.2015

Я смотрю тема все глубже и глубже))) Может быть тогда мне подскажите в еще одной моей затее: есть такая штука StarLine М32, это что то вроде gsm приставки для сигнализации, у неё есть выход(sl-data) по которому она может давать команды полноценной сигнализации (у меня установлена другая, а нужная стоит не очень гуманно). Вопрос: как можно прочитать эти команды. На выходе хочу получить gsm сигнализацию(М32) + ардуино (сигналка управляется с телефона, а ардуинка управляется сигналкой). Может какая библиотека поможет?

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

В фортране можно поменять константу (например, 2 - чтобы была равна 10). На каком именно компиляторе Вам это показать?

Известный эффект FORTRAN IV для IBM-360/370.

1. В современном фортране можно передавать параметры не только по ссылке, но и по значению.

2. Лично я при передаче константы по ссылке создал бы копию константы в стеке и ее адрес передал в подпрограмму. Другими словами, проблема не фундаментальная, а связанная с сомнительным способом экономии памяти, применанном в одном конкретном (хотя и широко распространенном) компиляторе.

Лично я пользуюсь Digital Visual Fortran, которому уже больше 10 лет (главная заповедь программиста - ксли работает, ничего не  трогай!). Собственно, уже из синтаксиса описания константы в моем предыдущем посту было понятно, что на FORTRAN IV это не заработает.

Цитата:

Так вот, такое сделать нетрудно. Могу показать как это делается на любимом IDE'шном GNU C++
Вероятно, у меня наблюдается полная атрофия любопытства, но мне это не интересно. Впрочем, можете проказать, если это доставит Вам удовольствие.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano]</p> <p>[quote=ЕвгенийП пишет:

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

Нет, не доставит. Без ажиотажа публики, холивара и срача - какое ж нафиг удовольствие? :))))))))))