Дайте совет новичку

Skyrewir
Offline
Зарегистрирован: 09.10.2017

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

Дайте пожалуйста совет новичку. Вчера стал обладателем платы arduino uno и не знаю с чего начать=) Опыта в схемотехнике и электронике не имею. Вчера узнал что такое закон Ома, что такое резистор и светодиод=)

Подскажите с чего начать изучение arduino и электроники

Спасибо!

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

Skyrewir пишет:

Подскажите с чего начать изучение arduino и электроники

Учебник физики, 8-ой класс.

mobistrike
mobistrike аватар
Offline
Зарегистрирован: 19.08.2016

Skyrewir пишет:

 

Дайте пожалуйста совет новичку. 

Даю 

Skyrewir
Offline
Зарегистрирован: 09.10.2017

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

Skyrewir пишет:

Подскажите с чего начать изучение arduino и электроники

Учебник физики, 8-ой класс.

Спасибо за совет, я обязательно использую мат.часть и подтяну знания в физике

 

Skyrewir
Offline
Зарегистрирован: 09.10.2017

Спасибо, но ссылка битая

sadman41
Offline
Зарегистрирован: 19.10.2016

Skyrewir пишет:

Дайте пожалуйста совет новичку. 

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

Skyrewir
Offline
Зарегистрирован: 09.10.2017

Меня уже зацепило, назад пути нет=)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Совет новичку получившему плату ардуино: перед включением платы Ардуино, не забудьте включить свою голову. Работа без головы ардуинщика вредна для здоровья платы ардуино. Распечатать и повесить на стену.

arduinec
Offline
Зарегистрирован: 01.09.2015

Гололобов В.Н. О проекте Arduino для школьников (и не только) 2011
http://vgololobov.narod.ru/content/arduino/intro.html
Руководство по освоению Arduino 2012
http://robot-kit.ru/manual/Arduino_Sketch_Robot-kit.ru.pdf
 

Skyrewir
Offline
Зарегистрирован: 09.10.2017

Спасибо большое! То что нужно для начала!

inspiritus
Offline
Зарегистрирован: 17.12.2012
Skyrewir
Offline
Зарегистрирован: 09.10.2017

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

Skyrewir
Offline
Зарегистрирован: 09.10.2017

Нашел ещё один сайт с обучением, теория + практика, с описанием shields, экранов и разных датчиков http://wiki.amperka.ru/

 

SLKH
Offline
Зарегистрирован: 17.08.2015

Skyrewir пишет:

Нашел ещё один сайт с обучением, теория + практика, с описанием shields, экранов и разных датчиков http://wiki.amperka.ru/

Самое, пожалуй, лучшее.

Начать с левой колонки и собирать мини-проекты из правой. Обязательно прорабатывать всю задачку - поснения к коду, самопроверку, задания.

Nikita13
Offline
Зарегистрирован: 09.10.2017

Доброго времени суток, прошу помощи. Есть датчик, четырехканальное реле и стм32 на ардуино ИДЕ.

Есть программа, в ней проверяются два условия через IF-ELSE.

В первом условии все просто если оно соответствует то 1 реле включено, остальные 3 реле выключены.

Во втором условии при его соответствии 1 реле отключается, 2 реле должно включаться на 30 секунд потом отключаться, в то же время через 3 секунды после включения 2 реле должно включиться и 3 реле на промежуток времени пока не замкнется цепь от GND с любым цифровым портом настроенным как вход. Так же с момента когда 3 реле выключится должен произойти отсчет 2-ух минут и включить реле 4. Но и это еще не все, если вдруг происходит соответствие первого условия, нам не нужно в первую же секунду идти по сценарию, нам нужно в течении 5-ти минут проанализировать наши 2 условия и если вдруг условие менялось к примеру раз десять за эти 5 минут то мы ожидаем пока условие в течении новых 5-ти минут будет оставаться соответствующим первому условию, а уже потом переходить в этот сценарий. Временные промежутки нужно отсчитать только один раз и только при соответствии второго условия, но если условия будут меняться допустим 2 раза за день то и промежутки нужно отсчитать 2 раза. Пробовал с миллис сделать некоторую многозадачность. Но среди примеров в интернете, это циклическая смена состояний, в моем случае это не подходит. Можно ли как нибудь разбить во втором условии все эти процессы так чтобы они работали параллельно и не мешали друг другу. Не прошу писать мне код. Подтолкните только в нужную сторону. Два дня уже бьюсь( 

Заранее спасибо)

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

Никита, выкладывайте свой код и ЧЕТКО пишите, как должно работать и как работает сейчас. Без кода вникать в ваш вопрос вряд ли кто захочет.

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

Nikita13
Offline
Зарегистрирован: 09.10.2017
int city = PB12; 
int gena = PB13; 
int podsos = PB14;
int starter = PB15; 
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
long interval1 = 30000; 
long interval2 = 120000;
long interval3 = 300000; 
void setup()
{  
  Serial.begin(115200);

  emon1.voltage(4, 510, 1.7);  // Voltage: input pin, calibration, phase_shift
  pinMode(city, OUTPUT); 
  pinMode(gena, OUTPUT); 
  pinMode(podsos, OUTPUT); 
  pinMode(starter, OUTPUT); 
  digitalWrite(city, HIGH); 
  digitalWrite(gena, HIGH); 
  digitalWrite(podsos, HIGH); 
  digitalWrite(starter, HIGH); 
}
void loop()
{
 
   emon1.calcVI(20,100);         // Calculate all. No.of half wavelengths (crossings), time-out
   float supplyVoltage   = emon1.Vrms;             //extract Vrms into Variable


    if (emon1.Vrms > 150) 
    {
      digitalWrite(city, LOW); 
      digitalWrite(gena, HIGH); 
      digitalWrite(podsos, HIGH); 
      digitalWrite(starter, HIGH); 
    }
    else if (emon1.Vrms <150)
    {
     previousMillis1 = millis();
    };
    if (emon1.Vrms < 150) 
    {
      
      digitalWrite(city, HIGH); 
      digitalWrite(podsos, LOW); 
      if(millis() - previousMillis1 > interval1)
      {
        digitalWrite(podsos, HIGH);
        previousMillis1 = 0;
      }
      
    }
   Serial.print(emon1.Vrms);
   Serial.println("");
  
}

Собственно как должно работать копирую из поста выше
Есть программа, в ней проверяются два условия через IF-ELSE.


В первом условии все просто если оно соответствует то 1 реле включено, остальные 3 реле выключены.


Во втором условии при его соответствии 1 реле отключается, 2 реле должно включаться на 30 секунд потом отключаться, в то же время через 3 секунды после включения 2 реле должно включиться и 3 реле на промежуток времени пока не замкнется цепь от GND с любым цифровым портом настроенным как вход. Так же с момента когда 3 реле выключится должен произойти отсчет 2-ух минут и включить реле 4. Но и это еще не все, если вдруг происходит соответствие первого условия, нам не нужно в первую же секунду идти по сценарию, нам нужно в течении 5-ти минут проанализировать наши 2 условия и если вдруг условие менялось к примеру раз десять за эти 5 минут то мы ожидаем пока условие в течении новых 5-ти минут будет оставаться соответствующим первому условию, а уже потом переходить в этот сценарий.

Из железа, стм 32 с ардуино ИДЕ, четырехканальное реле, датчик напряжения.
Собственно на этом миллис и завис, блинк работает, а все остальное не хочет. мне просто нужно при выполнении условия чтобы пошел отсчет времени и по его истечении выполнилось действие. 
Программа не закончена, поскольку проверяю работу шаг за шагом.

Nikita13
Offline
Зарегистрирован: 09.10.2017
int city = PB12; 
int gena = PB13; 
int podsos = PB14;
int starter = PB15; 
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
long interval1 = 30000; 
long interval2 = 120000;
long interval3 = 300000; 
void setup()
{  
  Serial.begin(115200);

  emon1.voltage(4, 510, 1.7);  // Voltage: input pin, calibration, phase_shift
  pinMode(city, OUTPUT); 
  pinMode(gena, OUTPUT); 
  pinMode(podsos, OUTPUT); 
  pinMode(starter, OUTPUT); 
  digitalWrite(city, HIGH); 
  digitalWrite(gena, HIGH); 
  digitalWrite(podsos, HIGH); 
  digitalWrite(starter, HIGH); 
}
void loop()
{
 
   emon1.calcVI(20,100);         // Calculate all. No.of half wavelengths (crossings), time-out
   float supplyVoltage   = emon1.Vrms;             //extract Vrms into Variable


    if (emon1.Vrms > 150) 
    {
      digitalWrite(city, LOW); 
      digitalWrite(gena, HIGH); 
      digitalWrite(podsos, HIGH); 
      digitalWrite(starter, HIGH); 
    }
    else if (emon1.Vrms <150)
    {
     previousMillis1 = millis();
    };
    if (emon1.Vrms < 150) 
    {
      
      digitalWrite(city, HIGH); 
      digitalWrite(podsos, LOW); 
      if(millis() - previousMillis1 > interval1)
      {
        digitalWrite(podsos, HIGH);
        previousMillis1 = 0;
      }
      
    }
   Serial.print(emon1.Vrms);
   Serial.println("");
  
}

Собственно как должно работать копирую из поста выше
Есть программа, в ней проверяются два условия через IF-ELSE.


В первом условии все просто если оно соответствует то 1 реле включено, остальные 3 реле выключены.


Во втором условии при его соответствии 1 реле отключается, 2 реле должно включаться на 30 секунд потом отключаться, в то же время через 3 секунды после включения 2 реле должно включиться и 3 реле на промежуток времени пока не замкнется цепь от GND с любым цифровым портом настроенным как вход. Так же с момента когда 3 реле выключится должен произойти отсчет 2-ух минут и включить реле 4. Но и это еще не все, если вдруг происходит соответствие первого условия, нам не нужно в первую же секунду идти по сценарию, нам нужно в течении 5-ти минут проанализировать наши 2 условия и если вдруг условие менялось к примеру раз десять за эти 5 минут то мы ожидаем пока условие в течении новых 5-ти минут будет оставаться соответствующим первому условию, а уже потом переходить в этот сценарий.

Из железа, стм 32 с ардуино ИДЕ, четырехканальное реле, датчик напряжения.
Собственно на этом миллис и завис, блинк работает, а все остальное не хочет. мне просто нужно при выполнении условия чтобы пошел отсчет времени и по его истечении выполнилось действие. 
Программа не закончена, поскольку проверяю работу шаг за шагом.

kasper007
Offline
Зарегистрирован: 23.05.2016

В таком виде программа работать не будет. Как минимум нужно библиотеку "EmonLib.h"  подключить. Это Вы нас проверяете? Или не понимаете что пишете?

Nikita13
Offline
Зарегистрирован: 09.10.2017

Извините, пропустил строчку с подключением библиотеки.
Копировал на спех, вот и закосячил.
Библиотека работает, очень шустро и из за стм 32 очень точно. У меня не работает именно та часть где условие проверяет не прошло ли нужное количество секунд. Ну и собствено действие не выполняется. Почему "блинк без делэй" работает, а в моей программе даже не пытается(

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

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

У вас элементарная ошибка в логике, это видно сразу. Ответте на вопрос выше, потом продолжим.

Nikita13
Offline
Зарегистрирован: 09.10.2017

Все верно! У меня все застыло на включении второго реле, которое должно отработать 30 секунд и отключиться. Оно попросту не отключается. Подскажите пожалуйста где ошибка(( уже 3тий день интернет мучаю:)

kalapanga
Offline
Зарегистрирован: 23.10.2016

Nikita13 пишет:

Все верно! У меня все застыло на включении второго реле, которое должно отработать 30 секунд и отключиться. Оно попросту не отключается. Подскажите пожалуйста где ошибка(( уже 3тий день интернет мучаю:)

Почитайте вот эту тему. Попробуйте применить рассмотренную там методику для Вашей задачи.

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

Как только условие (emon1.Vrms <150) в строке 39 становится истинным - вы сохраняете текущее время в переменной previousMillis1 .  Это верно.

Ошибка в том, что при каждом следующем проходе через loop вы обновляете значение previousMillis1 снова и снова, поэтому разница между текущим временем и этой переменной никогда не достигает интервала. Вам следует сохранять время в previousMillis1 только один раз, а при каждом следующем обороте только проверять условие в строке 48

Nikita13
Offline
Зарегистрирован: 09.10.2017

Так и у меня такая же мысль в голове что оно каждый раз обновляется. Но как ее сохранить один раз? Точнее, где нужно поставить эту строчку previousMillis1 = millis();
Чтобы она записалась только тогда когда 
 (emon1.Vrms <150)
Я не могу избавиться от проверки  (emon1.Vrms >150) поскольку нужно будет включать отсчет на 5 минут чтобы вернуться в первое условие когда включено реле 1 и все остальные выключены.

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

Nikita13 пишет:

Так и у меня такая же мысль в голове что оно каждый раз обновляется. Но как ее сохранить один раз?

Очевидно, что надо установить какую-то переменную - "флаг" - сигнализирующие о том, что отсчет интервала начался и обновлять previousMillis1 больше не нужно.

Только не хвататйтесь сразу кодировать. Сначало подробно сформулируйте и запишите логику работы вашего условия. Пока только одного - того, что сейчас в коде. Будьте внимательны, учтите все варианты - например, если во время интервала emon1.Vrms станет больше 150 - как должна реагировать программа? Продолжать ждать положенное время или сбросить интервал?

Nikita13
Offline
Зарегистрирован: 09.10.2017

На примере моего условия трудно будет показать работу флага? Просто время немного сэкономит.
При изменении условия на (emon1.Vrms > 150) программа должна делать все что предусмотрено условием (emon1.Vrms < 150). Сбрасывать ничего не нужно, если это конечно реально.
При (emon1.Vrms > 150) запускается отсчет 5ти минут в котором проверяется сколько раз было переходов с (emon1.Vrms > 150) на (emon1.Vrms < 150) и наоборот. И если таких переходов не было то происходит переход на первое условие когда (emon1.Vrms > 150), конечно же дополнительные условия и задержки придется установить чтобы переход был не аварийным. Но это относится к тому что замыкают реле.

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

Nikita, так не пойдет. Я просил сформулировать только те условия, которые уже сейчас есть в коде. В вашем коде есйчас никаких пяти минут и подсчетов переходов между (emon1.Vrms > 150) и (emon1.Vrms < 150)  нет - так давайте не будем усложнять. Я предлагаю разобрать проблему на основе того кода, с которым вы пришли в конфу, а свои сложные условия вы уже потом сами добавите по образцу этого.

 

Nikita13
Offline
Зарегистрирован: 09.10.2017

Извиняюсь, забежал вперед.
С первым условием все понятно и просто.
Во втором условии при (emon1.Vrms < 150) хотелось бы зафиксировать время, чтобы таймер отсчитал интервал, чтобы в последствии выполнить какое нибудь действие, по выполнению действия сбросить это время, чтобы при повторении нашего условия можно было зафиксировать это время еще раз и так дальше циклично.

Nikita13
Offline
Зарегистрирован: 09.10.2017

Спасибо, за напрвление обязательно почитаю.

Nikita13
Offline
Зарегистрирован: 09.10.2017

Прочитал про флаги, если правильно понял это для работы прерываний по таймеру?

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

Это для чего угодно. Записочка на столе для МК. Пока вы пытаетесь описать свои хотелки словами и в таком формате, не только закодировать трудно, но и понять что же хочется. Вариантов два: берем лист бумаги и рисуем алгоритм графически, берем бумагу и расписываем его по пунктам. Оба имеют право на жизнь и зависят от удобства восприятия для индивидуума. ИМХО.

Nikita13
Offline
Зарегистрирован: 09.10.2017

Спасибо за совет) я алгоритм сделал с самого начала)
у меня проблемка, как я понял с установкой флага, я не совсем понимаю как его установить чтобы время в той переменной в которую я хочу записать, собственно записалось и не записывалось вновь при каждом проходе ЛУУП. Чтобы арифметическое действие в итоге исполнилось и мой интервал отсчитался. Как Миллис в примере блинк работает с момента запуска контроллера я понимаю) но у меня момент отсчета должен начаться с выполнения условия if (emon1.Vrms < 150). Вот этого я не могу понять((((

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

Если этого не предусмотрено в алгоритме, значит он неправильный. Я вам в соседней теме дал ссылочку, думаю разберетесь. Выводите отдельные задачи в функции и выполняйте по мере надобности. ИМХО.

Nikita13
Offline
Зарегистрирован: 09.10.2017

за ссылку спасибо, она навела меня на мысль создания функции, но в голове все равно не укладывается, как время запишется и не будет записываться снова. Если я правильно понимаю когда будет вызываться записаннная мною функция, ЛууП не будет крутить основной цикл, а только эту функцию? Если так, тогда вопрос, как будет работать все остальное?

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

Если вы функцию не закольцуете, то работать будет все. Зашли в функцию из лупа, проверили условие, истина - выполнили действия в функции и вернулись в луп, ложь - вернулись в луп. Следующая функция и так по кругу.

P/S я вам рекомендовал там и другие темы посмотреть, там уже есть на несколько таймеров.

Nikita13
Offline
Зарегистрирован: 09.10.2017

Спасибо за информацию, буду пробовать)

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

Nikita13 пишет:

Как Миллис в примере блинк работает с момента запуска контроллера я понимаю) но у меня момент отсчета должен начаться с выполнения условия if (emon1.Vrms < 150). Вот этого я не могу понять((((

Nikita. флаг - это очень просто. Беру ваш код из сообщения #16 и добавляю 3 строчки

int city = PB12; 
int gena = PB13; 
int podsos = PB14;
int starter = PB15; 
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
long interval1 = 30000; 
long interval2 = 120000;
long interval3 = 300000; 

boolean flag = false;
void setup()
{  
  Serial.begin(115200);

  emon1.voltage(4, 510, 1.7);  // Voltage: input pin, calibration, phase_shift
  pinMode(city, OUTPUT); 
  pinMode(gena, OUTPUT); 
  pinMode(podsos, OUTPUT); 
  pinMode(starter, OUTPUT); 
  digitalWrite(city, HIGH); 
  digitalWrite(gena, HIGH); 
  digitalWrite(podsos, HIGH); 
  digitalWrite(starter, HIGH); 
}
void loop()
{
 
   emon1.calcVI(20,100);         // Calculate all. No.of half wavelengths (crossings), time-out
   float supplyVoltage   = emon1.Vrms;             //extract Vrms into Variable


    if (emon1.Vrms > 150) 
    {
      digitalWrite(city, LOW); 
      digitalWrite(gena, HIGH); 
      digitalWrite(podsos, HIGH); 
      digitalWrite(starter, HIGH); 
    }
    else if ((emon1.Vrms <150) && (!(flag)))
    {
     previousMillis1 = millis();
     flag = true;
    };
    if (emon1.Vrms < 150) 
    {
      
      digitalWrite(city, HIGH); 
      digitalWrite(podsos, LOW); 
      if(millis() - previousMillis1 > interval1)
      {
        digitalWrite(podsos, HIGH);
        previousMillis1 = 0;
      }
      
    }
   Serial.print(emon1.Vrms);
   Serial.println("");
  
}

изменения коснулись строк 12. 41 и 44.

Это только пример использования флага. Возможно, надо что-то подправить. Но надеюсь, общий принцип понятен

Гриша
Offline
Зарегистрирован: 27.04.2014

bwn пишет:

 Вариантов два: берем лист бумаги и рисуем алгоритм графически, берем бумагу и расписываем его по пунктам.

пост 33 , и там еще в топике обсуждалось составление алгоритма (а пост для примера...), там же пост 66

 

head2009
Offline
Зарегистрирован: 23.10.2017

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

#include

IRsend irsend;

void setup()
{
}

void loop() {
for (int i = 0; i < 3; i++) {
irsend.sendSony(0xa90, 12);
delay(40);
}
delay(5000); //5 second delay between each signal burst
}
Но отправляет автоматически. А как прописать, что можно было отправлять ИК сигнал с помощью нажатия кнопки?

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