Ви не увійшли.
а в этом варианте ( if (x == 1) digitalWrite(led11, HIGH); ) что хотите то и пишите )
мы сейчас http://forum.arduino.ua/viewtopic.php?pid=2404#p2404 этот код обсуждаем
Неактивний
а в этом варианте ( if (x == 1) digitalWrite(led11, HIGH); ) что хотите то и пишите )
мы сейчас http://forum.arduino.ua/viewtopic.php?pid=2404#p2404 этот код обсуждаем
если честно, не въехал, может на примере покажите ?
Неактивний
if (x == 1) digitalWrite(led11, HIGH);
любой текст, hello1, cash1, kill 1, relay1, rele 1
все будет срабатывать как активатор для 1
а в посте http://forum.arduino.ua/viewtopic.php?pid=2404#p2404 , я его правлю ( код ) по мере поступления новых замечаний сделали все по другому
Неактивний
код из change #5 у меня не ругается, но и ничего не делает
и наверное этот код мне не подойдет, так как у меня есть и такие команды как "Watt 1.5", "Watt 2.5" т.е. значения могут быть дробными,
как в таком случае быть ?
Остання редакція ardnew (2016-03-03 19:26:24)
Неактивний
NoName пише:Nefreemen, самое смешное что ardnew уже получил что нужно и тему не читает )
читаю, и очень внимательно !
и получил как бы не совсем то, вернее то, но реле как то включаются через раз
какую либо статистику не собратьи еще, никак не могу сообразить, у меня 8 реле, нужно сделать так что бы по сигналу включалось только одно реле, а остальные выключались,
например, пришел сигнал "Rele 2" включилось реле 2, пришел сигнал "Rele 5" включилось бы реле 5, а реле 2 выключилось,
короче, всегда может быть включено только одно реле из восьми.
Ну это просто, там где включаете реле, допишите выключение остальных.
Примерно так:
if (inputString == "Rele 1"){
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
...............................
digitalWrite(pin8, LOW);
}
Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?
Неактивний
Ну это просто, там где включаете реле, допишите выключение остальных.
Примерно так:
if (inputString == "Rele 1"){
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
digitalWrite(pin3, LOW);
...............................
digitalWrite(pin8, LOW);
}
нет, ну так то я могу, но слишком много строк получается, хотелось бы как то по изящнее
Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?
да, включается именно то реле которое нужно, но, бывает 2-4 раза включается без проблем, а бывает нужно 2-3 раза дать команду.
Неактивний
Nefreemen пише:Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?
да, включается именно то реле которое нужно, но, бывает 2-4 раза включается без проблем, а бывает нужно 2-3 раза дать команду.
и еще заметил, с не большой задержкой команды проходят, примерно 1.5 секунды, хотелось бы побыстрее
Остання редакція ardnew (2016-03-03 19:59:03)
Неактивний
код из change #5 у меня не ругается, но и ничего не делает
и наверное этот код мне не подойдет, так как у меня есть и такие команды как "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 порта тогда можно написать скетч монитор и "пощупать" именно байтики которые приходят с компьютера.
Неактивний
ardnew пише:код из change #5 у меня не ругается, но и ничего не делает
и наверное этот код мне не подойдет, так как у меня есть и такие команды как "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);
}
}
но, читаю вас и думал что, что то в нем не так
Неактивний
ardnew пише:Nefreemen пише:Странно другое, почему включается "через раз". А включается то которое надо? Или путаются номера?
да, включается именно то реле которое нужно, но, бывает 2-4 раза включается без проблем, а бывает нужно 2-3 раза дать команду.
и еще заметил, с не большой задержкой команды проходят, примерно 1.5 секунды, хотелось бы побыстрее
Ну... если "задержка" тогда нужно мониторить порт компьтера. Предполагаю что 90% это вопрос компьютерной программы и оставляю 10% на тормоз системы. Понятно что могут быть накладки и не четкое срабатывание (именно накладки в порте компьютера). Одна команда не ушла а другая уже записалась а потом вместе улетели. А ардуино получило "Relay 1Relay 2" и впало в ступор с чем сравнивать. В таком случае больше подходит алгоритм NoName .
Неактивний
отладку делаю в протеусе, вижу все что передаю и принимаю, этот код меня устраивает полостью:
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
Опоньки, приехали, Протеус. Ноу коммент.
Неактивний
Ну... если "задержка" тогда нужно мониторить порт компьтера. Предполагаю что 90% это вопрос компьютерной программы и оставляю 10% на тормоз системы.
я понял, это не столь критично, да и возможно эти задержки в самом компьютере, виртуальный порт, протеус, это мелочь.
Понятно что могут быть накладки и не четкое срабатывание (именно накладки в порте компьютера). Одна команда не ушла а другая уже записалась а потом вместе улетели. А ардуино получило "Relay 1Relay 2" и впало в ступор с чем сравнивать. В таком случае больше подходит алгоритм NoName .
остановлюсь на вашем варианте, мне он более понятен, а накладки возможно как и сказал выше от конфигурации компа.
последний момент-просьба
как все таки более грамотно написать код для коммутации, у меня две группы, по 6 и 4 реле, и три одиночных реле, всего 13 шт. к каким портам ардуино их лучше подключить ?
Неактивний
Покажите свою программу
пока так :
#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)
Неактивний
Было...То что работало в Протеусе не работало в железе , и наоборот. Поэтому с тех пор у меня своеобразное отношение к нему .
понятно, ну не настолько сложная эта программа что нельзя ее симулировать в протеусе, но зато удобно очень
Остання редакція ardnew (2016-03-03 21:10:30)
Неактивний