#26 2016-03-03 18:39:22

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку пожалуйста !

а в этом варианте   (  if (x == 1) digitalWrite(led11, HIGH); ) что хотите то и пишите )
мы сейчас   http://forum.arduino.ua/viewtopic.php?pid=2404#p2404   этот код обсуждаем

Неактивний

#27 2016-03-03 18:54:00

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

NoName пише:

а в этом варианте   (  if (x == 1) digitalWrite(led11, HIGH); ) что хотите то и пишите )
мы сейчас   http://forum.arduino.ua/viewtopic.php?pid=2404#p2404   этот код обсуждаем

если честно, не въехал, может на примере покажите ?

Неактивний

#28 2016-03-03 18:59:12

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку пожалуйста !

if (x == 1) digitalWrite(led11, HIGH);
  любой текст, hello1, cash1, kill 1, relay1, rele 1
все будет срабатывать как активатор для 1

а в посте    http://forum.arduino.ua/viewtopic.php?pid=2404#p2404 , я его правлю  ( код ) по мере поступления новых замечаний   сделали все по другому

Неактивний

#29 2016-03-03 19:25:47

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

код из change #5 у меня не ругается, но и ничего не делает  sad
и наверное этот код мне не подойдет, так как у меня есть и такие команды как "Watt 1.5", "Watt 2.5" т.е. значения могут быть дробными,
как в таком случае быть ?

Остання редакція ardnew (2016-03-03 19:26:24)

Неактивний

#30 2016-03-03 19:28:55

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

ardnew пише:
NoName пише:

Nefreemen, самое смешное что ardnew уже получил что нужно и тему не читает )

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

и еще, никак не могу сообразить, у меня 8 реле, нужно сделать так что бы по сигналу включалось только одно реле, а остальные выключались,
например, пришел сигнал "Rele 2" включилось реле 2, пришел сигнал "Rele 5" включилось бы реле 5, а реле 2 выключилось,
короче, всегда может быть включено только одно реле из восьми.

Ну это просто, там где включаете реле, допишите выключение остальных.
Примерно так:
if (inputString == "Rele 1"){
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
...............................
digitalWrite(pin8, LOW);
}
Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?

Неактивний

#31 2016-03-03 19:31:46

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

ardnew, а какая у Вас Arduino?

Неактивний

#32 2016-03-03 19:43:53

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:

Ну это просто, там где включаете реле, допишите выключение остальных.
Примерно так:
if (inputString == "Rele 1"){
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
...............................
digitalWrite(pin8, LOW);
}

нет, ну так то я могу, но слишком много строк получается, хотелось бы как то по изящнее smile

Nefreemen пише:

Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?

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

Неактивний

#33 2016-03-03 19:45:28

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:

ardnew, а какая у Вас Arduino?

Arduino у меня Mega 2560

Неактивний

#34 2016-03-03 19:58:23

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

ardnew пише:
Nefreemen пише:

Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?

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

и еще заметил, с не большой задержкой команды проходят, примерно 1.5 секунды, хотелось бы побыстрее  smile

Остання редакція ardnew (2016-03-03 19:59:03)

Неактивний

#35 2016-03-03 20:15:51

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: помогите новичку пожалуйста !

1.5 сек )   no comments )

Неактивний

#36 2016-03-03 20:20:10

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

ardnew пише:

код из change #5 у меня не ругается, но и ничего не делает  sad
и наверное этот код мне не подойдет, так как у меня есть и такие команды как "Watt 1.5", "Watt 2.5" т.е. значения могут быть дробными,
как в таком случае быть ?

Вот в этом и проблема что "не делает" а должен. Вопрос не в том дробные не дробные. Надежный парсинг буфера Serial как бы по своей сути прост. Прост в том случае когда вы точно знаете что получаете ( и красота если вы можете внести изменения в передачу то есть поставить какие то символы для удобства разделения например символьных величин  от числовых). В данном случае как понимать допустим 2.5 символьное или флот. Но поскольку вы указываете в кавычках следовательно мы рассматриваем  строку. Мой код и код NoName читает строку из буфера Serial тут вопросов нет, только по разному происходит чтение у меня байты читаются в другой буфер, массив char[] выглядит примерно это так ['R','e','l','a','y',' ','1'], дальше идет преобразование массива в строковую переменную, ну и потом сравнение. NoName сомневается в надежности такого подхода и предлагает читать сразу в строку добавлением каждого поступившего символа к имеющей уже строке, одновременно проводить контроль по длине строки ( в целесообразности чего я сомневаюсь). Такой способ тоже очень распространен и есть масса примеров. В том коде от NoName есть какая то проблемка, и как я понял в моем, и проблема эта может быть в спецсимволах которые Serial компьютера посылает в конце строки, типа перевод каретки, конец строки. Ни в терминале ардуино ни гипертерминале вы их не увидите. Почему я спросил какая Arduino у Вас. Если допустим Atmega2560, то у нее есть 4 Serial порта тогда можно написать скетч монитор и "пощупать" именно байтики которые приходят с компьютера.

Неактивний

#37 2016-03-03 20:26:44

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

NoName пише:

1.5 сек )   no comments )

понял так что сказал глупость, а какую ? 1.5 сек. это нормально ?

Неактивний

#38 2016-03-03 20:30:57

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: помогите новичку пожалуйста !

ardnew пише:
NoName пише:

1.5 сек )   no comments )

понял так что сказал глупость, а какую ? 1.5 сек. это нормально ?

Что вы хотите сделать

Неактивний

#39 2016-03-03 20:32:12

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:
ardnew пише:

код из change #5 у меня не ругается, но и ничего не делает  sad
и наверное этот код мне не подойдет, так как у меня есть и такие команды как "Watt 1.5", "Watt 2.5" т.е. значения могут быть дробными,
как в таком случае быть ?

Вот в этом и проблема что "не делает" а должен. Вопрос не в том дробные не дробные. Надежный парсинг буфера Serial как бы по своей сути прост. Прост в том случае когда вы точно знаете что получаете ( и красота если вы можете внести изменения в передачу то есть поставить какие то символы для удобства разделения например символьных величин  от числовых). В данном случае как понимать допустим 2.5 символьное или флот. Но поскольку вы указываете в кавычках следовательно мы рассматриваем  строку. Мой код и код NoName читает строку из буфера Serial тут вопросов нет, только по разному происходит чтение у меня байты читаются в другой буфер, массив char[] выглядит примерно это так ['R','e','l','a','y',' ','1'], дальше идет преобразование массива в строковую переменную, ну и потом сравнение. NoName сомневается в надежности такого подхода и предлагает читать сразу в строку добавлением каждого поступившего символа к имеющей уже строке, одновременно проводить контроль по длине строки ( в целесообразности чего я сомневаюсь). Такой способ тоже очень распространен и есть масса примеров. В том коде от NoName есть какая то проблемка, и как я понял в моем, и проблема эта может быть в спецсимволах которые Serial компьютера посылает в конце строки, типа перевод каретки, конец строки. Ни в терминале ардуино ни гипертерминале вы их не увидите. Почему я спросил какая Arduino у Вас. Если допустим Atmega2560, то у нее есть 4 Serial порта тогда можно написать скетч монитор и "пощупать" именно байтики которые приходят с компьютера.

отладку делаю в протеусе, вижу все что передаю и принимаю, этот код меня устраивает полостью:
char input[20];
void loop()
{   
      if (Serial.available() > 0)
  {
    Serial.readBytes( input, 20 );
    String str= (String) input;
    if (str == "Rele 1") digitalWrite(led11, HIGH);
    if (str == "Rele 2"') digitalWrite(led12, HIGH);
    if (str == "Rele 3") digitalWrite(led13, HIGH);
    }
}
но, читаю вас и думал что, что то в нем не так smile

Неактивний

#40 2016-03-03 20:33:08

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

ardnew пише:
ardnew пише:
Nefreemen пише:

Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?

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

и еще заметил, с не большой задержкой команды проходят, примерно 1.5 секунды, хотелось бы побыстрее  smile

Ну...  roll если "задержка" тогда  нужно мониторить  порт компьтера. Предполагаю что 90% это вопрос компьютерной программы и оставляю 10% на тормоз системы. Понятно что могут быть накладки и не четкое срабатывание (именно накладки в порте компьютера). Одна команда не ушла а другая уже записалась а потом вместе улетели. А ардуино получило "Relay 1Relay 2" и впало в ступор с чем сравнивать. В таком случае больше подходит алгоритм NoName  smile .

Неактивний

#41 2016-03-03 20:33:59

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

lkj пише:

Что вы хотите сделать

коммутацию различных устройств.

Неактивний

#42 2016-03-03 20:36:32

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: помогите новичку пожалуйста !

Покажите свою программу

Неактивний

#43 2016-03-03 20:37:06

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

отладку делаю в протеусе, вижу все что передаю и принимаю, этот код меня устраивает полостью:
char input[20];
void loop()
{   
      if (Serial.available() > 0)
  {
    Serial.readBytes( input, 20 );
    String str= (String) input;
    if (str == "Rele 1") digitalWrite(led11, HIGH);
    if (str == "Rele 2"') digitalWrite(led12, HIGH);
    if (str == "Rele 3") digitalWrite(led13, HIGH);
    }
}
но, читаю вас и думал что, что то в нем не так smile


Опоньки, приехали, Протеус. Ноу коммент.

Неактивний

#44 2016-03-03 20:43:27

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:

Ну...  roll если "задержка" тогда  нужно мониторить  порт компьтера. Предполагаю что 90% это вопрос компьютерной программы и оставляю 10% на тормоз системы.

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

Nefreemen пише:

Понятно что могут быть накладки и не четкое срабатывание (именно накладки в порте компьютера). Одна команда не ушла а другая уже записалась а потом вместе улетели. А ардуино получило "Relay 1Relay 2" и впало в ступор с чем сравнивать. В таком случае больше подходит алгоритм NoName  smile .

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

последний момент-просьба smile
как все таки более грамотно написать код для коммутации, у меня две группы, по 6 и 4 реле, и три одиночных реле, всего 13 шт. к каким портам ардуино их лучше подключить ?

Неактивний

#45 2016-03-03 20:49:08

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

lkj пише:

Покажите свою программу

пока так :

#define NUM_SAMPLES 10
#define DIV_1    1.0
#define DIV_2    1.0
#define DIV_3    455
#define DIV_4    11.0718
#define DIV_5    50.0718
#define V_REF    5.000

int sum[5] = {0};                // sums of samples taken
unsigned char sample_count = 0;  // current sample number
float voltage[5] = {0.0};        // calculated voltages
char l_cnt = 0;                  // used in 'for' loops
char input[20];

// Переменные для управления реле
int led11 = 11; 
int led12 = 12; 
int led13 = 13; 

void setup()
{
  Serial.begin(9600);
  pinMode(led11, OUTPUT);  // и режим работы 11-ого цифрового пина в качестве выхода
  pinMode(led12, OUTPUT);  // и режим работы 12-ого цифрового пина в качестве выхода
  pinMode(led13, OUTPUT);  // и режим работы 13-ого цифрового пина в качестве выхода
}

void loop()
{
// take a number of analog samples and add them up
    while (sample_count < NUM_SAMPLES) {
        // sample each channel A0 to A4
        for (l_cnt = 0; l_cnt < 5; l_cnt++) {
            sum[l_cnt] += analogRead(A0 + l_cnt);
        }
        sample_count++;
        delay(10);
    }
    // calculate the voltage for each channel
    for (l_cnt = 0; l_cnt < 5; l_cnt++) {
        voltage[l_cnt] = ((float)sum[l_cnt] / (float)NUM_SAMPLES * V_REF) / 1024;
    }
    
    voltage[0] = voltage[0] * DIV_1;
    voltage[1] = voltage[1] * DIV_2;
    if (voltage[1]<1.0) voltage[1]=1.0;
    voltage[2] = voltage[2] * DIV_3;
    voltage[3] = voltage[3] * DIV_4;
    voltage[4] = voltage[4] * DIV_5;
    
    // voltage 1 - A (pin A0)
    Serial.print("A ");
    Serial.print(voltage[0], 2);
    // voltage 2 - B (pin A1)
    Serial.print("B ");
    Serial.print(voltage[1], 2);
    // voltge 3 - C (pin A2)
    Serial.print("C ");
    Serial.print((int)voltage[2], 1);
    // voltage 4 - D (pin A3)
    Serial.print("D ");
    Serial.print((int)voltage[3], 1);
    // voltage 5 - E (pin A4)
    Serial.print("E ");
    Serial.print((int)voltage[4], 1);
    Serial.println("");
    delay(10);
    // reset count and sums
    sample_count = 0;
    for (l_cnt = 0; l_cnt < 5; l_cnt++) {
        sum[l_cnt] = 0;
    }

// Ввод данных
      if (Serial.available() > 0)
  {
    Serial.readBytes( input, 20 );
    String str= (String) input;
    if (str == "Rele 1") digitalWrite(led11, HIGH);
    if (str == "Rele 2") digitalWrite(led12, HIGH);
    if (str == "Rele 3") digitalWrite(led13, HIGH);
  }
}

Остання редакція ardnew (2016-03-03 20:50:42)

Неактивний

#46 2016-03-03 20:51:58

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

lkj пише:

Хотел подсказать, но вы не хотите. Хуй с Вами

он всегда со мной, но я такой быстрый  smile

Неактивний

#47 2016-03-03 20:53:51

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:

Опоньки, приехали, Протеус. Ноу коммент.

а что не так, каждые 3 минуты шить ардуино лучше ?

Неактивний

#48 2016-03-03 20:54:50

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: помогите новичку пожалуйста !

Погорячился

Неактивний

#49 2016-03-03 21:02:49

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: помогите новичку пожалуйста !

Было...То что работало в Протеусе не работало в железе sad , и наоборот. Поэтому с тех пор у меня своеобразное отношение к нему roll .

Неактивний

#50 2016-03-03 21:08:29

ardnew
Учасник
Зареєстрований: 2016-03-02
Повідомлень: 62

Re: помогите новичку пожалуйста !

Nefreemen пише:

Было...То что работало в Протеусе не работало в железе sad , и наоборот. Поэтому с тех пор у меня своеобразное отношение к нему roll .

понятно, ну не настолько сложная эта программа что нельзя ее симулировать в протеусе, но зато удобно очень smile

Остання редакція ardnew (2016-03-03 21:10:30)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму