![]() |
![]() |
#331 | |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]() Цитата:
Вот часть кода с реле: Код HTML:
// Если температура достигает 28,3 (с погрешностью), отключаем кипятильник
if (celsius > 28.3)
{
digitalWrite(40, Relay_Off);
lcd.setCursor(0, 1);
lcd.print("H1-Off");
}
if (celsius < 28.0)
{
digitalWrite(40, Relay_On);
lcd.setCursor(0, 1);
lcd.print("H1-On ");
}[/background][/size][/font][/color]
[color=#141414][font=Georgia, 'Times New Roman', Times, serif][size=4][background=rgb(252, 252, 255)]// Если температура достигает 28,5 (с погрешностью), отключаем кипятильник
if (celsius > 28.5)
{
digitalWrite(41, Relay_Off);
lcd.setCursor(7, 1);
lcd.print("H2-Off");
}
if (celsius < 28.0)
{
digitalWrite(41, Relay_On);
lcd.setCursor(7, 1);
lcd.print("H2-On ");
}
lcd_key = read_LCD_buttons(); // read the buttons
switch (lcd_key) // depending on which button was pus hed, we perform an action
{
case btnRIGHT:
{
digitalWrite(41,!digitalRead(41));
lcd.setCursor(7, 1);
lcd.print("H2-Off");
break;
}
case btnLEFT:
{
digitalWrite(41, Relay_On);
lcd.setCursor(7, 1);
lcd.print("H2-On ");
break;
}
case btnUP:
{
lcd.print("UP ");
break;
}
case btnDOWN:
{
lcd.print("DOWN ");
break;
}
}
}//------------Конец ЦИКЛА-----------------------------
|
|
![]() |
![]() |
![]() |
#332 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Ну во первых я не знаю есть ли в используемой тобой библиотеке подавление дребезга, если есть то можно использовать её. Дальше - 28,5 и 28,3 градуса это принципиально или от балды -если кипятильники вместе включаются, то лучше сделать в одном if. Ну и по существу - реле и должно отключаться по этому коду, так как - ты нажал кнопку -реле исполнило сигнал, потом программа начинается заново и реле опять принимает статус согласно датчику температуры. Вывод - нужно для начала определить алгоритм после нажатия кнопки - кипятильник просто включается и датчики температуры больше не действуют -до какого времени или события? Соответственно при нажатии кнопки присваивать флаг который проверять одновременно с показанием температуры с условием И
Вот здесь еще ошибочка PHP код:
И еще, нуно по этому поводу создать отдельну тему - от Диммера тут не остается и следа -сделай тему своего проекта -опиши его и то что хочешь получить Последний раз редактировалось Bulatovor; 27.03.2014 в 19:51. |
![]() |
![]() |
![]() |
#333 | |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]() Цитата:
Кстати новую тему создал: http://www.cyber-place.ru/showthread...2120#post12120 |
|
![]() |
![]() |
![]() |
#334 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 ![]() |
![]()
День добрый!
Требуется создать диммер, управляющий яркостью лампочки (в последствии - нагревательным элементом из нихромовой проволоки). Яркость задается через com порт через сериал. Окончание числа - пробел (мне так удобнее). Схему собрал согласно статье http://www.instructables.com/id/Ardu...r-The-circuit/Вот сама схемка: http://cdn.instructables.com/FQZ/NYV...G9TK.LARGE.jpg Вот код прошитый в ардуинку (Due): Код:
String Bi = ""; int AC_LOAD = 3; int dimming = 256; void setup() { Serial.begin(9600); pinMode(AC_LOAD, OUTPUT);// Устанавливаем AC Load пин как вывод attachInterrupt(2, ZC, RISING); } void ZC(){ int dimtime = (39*(256-dimming)); // Полное время delayMicroseconds(dimtime); // Ждем digitalWrite(AC_LOAD, HIGH); // Триак посылает сигнал зажечься delayMicroseconds(10); // Триак ждет, для 50 Гц - 10мс digitalWrite(AC_LOAD, LOW); // Триак посылает сигнал потухнуть } void loop() { while (Serial.available() > 0) { char c = Serial.read(); if (c == ' ') { Serial.println(Bi); dimming = Bi.toInt(); Bi = ""; } else { Bi += c; } } } ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#335 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Мне кажется, что что-то не так с типами переменных при чтении с буфера, на 3 страницы этого топика есть код админа про чтение с буфера. А вообще мне кажется что и основной код данной темы тоже подойдет к этой схеме, только надо заменить функции библиотеки Cyber на стандартные Arduino
|
![]() |
![]() |
![]() |
#336 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
1 - у Вас срабатывание прерывания будет только по положительному полупериоду
2 - не понятно что вы пытаетесь здесь получить? PHP код:
|
![]() |
![]() |
![]() |
#337 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 ![]() |
![]()
1. Я понимаю, что срабатывание будет только по положительному пп, это я потом исправлю, в этом нет сложности;
2. Читаю с сериал число посимвольно, т.к. заранее неизвестно количество символов, которое пойдет на ком порт. Если символ пробел, то вывожу в сериал всю строку символов (чтобы следить, как идет запись), говорю, что этот набор символов есть длина прерывания в полупериоде (перевожу из стринг в интеджер), обнуляю строку. Если не пробел, то продолжаю ловить символы в эту переменную. Своего рода программный буфер. С типами переменных все хорошо |
![]() |
![]() |
![]() |
#338 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Похоже я отстал, не знал что в Arduino есть тим string
Ошибок не вижу, если только время полупериода нужно уменьшить Так как прерывание не будет срабатывать точно в нулевой точке Но это актуально только при минимальном свечении По поводу срабатывания только по положительным полупериодам, я был не прав, так как на схеме есть диодный мост |
![]() |
![]() |
![]() |
#339 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 ![]() |
![]() ![]() Код:
while (Serial.available() > 0) { char c = Serial.read();//Читаем символ, загоняем его в переменную "с" if (c == ' ')// Если "с" пробел (символ, который я использую для окончания приёма данных), т.е. передача закончена, то { Serial.println(Bi); //выводим строку "Bi", состоящую из символов "с", т.е. строку символов "с1""с2""с3"... dimming = Bi.toInt();//Получим заданный уровень яркости переведя строку "Bi" в интеджер; Bi = ""; //Саму строку обнуляем до следующего ввода } else { Bi += c; //Если не пробел, то добавляем в строку "Bi" ещё один символ. Это х=х+у, но со строковым типом это будет просто добавление ещё одного символа в конец строки. } } } |
![]() |
![]() |
![]() |
#340 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 ![]() |
![]()
Переправил чуть код. Постарался избавиться от delay... но совсем не работает: лампочка горит постоянно. Подскажите, пожалуйста, в чем ошибка?
Код:
String Bi = ""; const int AC_LOAD = 3; long dimming = 255; unsigned long previousMicros = 0; void setup() { Serial.begin(9600); pinMode(AC_LOAD, OUTPUT);// Устанавливаем AC Load пин как вывод attachInterrupt(2, ZC, RISING); } void ZC() { unsigned long currentMicros = micros(); previousMicros = currentMicros; int dimtime = (39*(255-dimming)); // Полное время while(currentMicros - previousMicros < dimtime) {} previousMicros = currentMicros; digitalWrite(AC_LOAD, HIGH);// Триак посылает сигнал зажечься while(currentMicros - previousMicros < 10)// Триак ждет, для 50 Гц - 10мкс {}// Триак посылает сигнал потухнуть digitalWrite(AC_LOAD, LOW); } void loop() { while (Serial.available() > 0) { char c = Serial.read(); if (c == ' ') { Serial.println(Bi); dimming = Bi.toInt(); Bi = ""; } else { Bi += c; } } } |
![]() |
![]() |
![]() |
Здесь присутствуют: 17 (пользователей: 0 , гостей: 17) | |
|
|