преобразование кода в flprog
преобразование кода в flprog
// Термостат, до пяти датчиков DS18B20.
Здравствуйте помогите преобразовать для чтения в flprog
[spoiler=Спойлер]// Термостат, до пяти датчиков DS18B20.// // v 0.2.1 beta#include <EEPROM.h>#include <OneWire.h>#include <DallasTemperature.h>#include <LiquidCrystal.h>
OneWire oneWire(15); // A1 вход датчиков 18b20DallasTemperature ds(&oneWire);LiquidCrystal lcd(8, 9, 4, 5, 6, 7);const byte OUT[5] = {13, 12, 11, 3, 2}; // номера выходов
byte pos;byte tempOUTon[5]; // массив с температурой включения выходаfloat tempSensor[5]; // массив куда читается температураbyte qty; // количество градусников на шине.// адреса градусников.DeviceAddress sensor1 = {0x28, 0xA8, 0x3E, 0xF9, 0x05, 0x0, 0x0, 0x12};DeviceAddress sensor2 = {0x28, 0xE6, 0xBD, 0x3B, 0x05, 0x0, 0x0, 0xCF};DeviceAddress sensor3 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};DeviceAddress sensor4 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};DeviceAddress sensor5 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};byte gradus[8] = { 0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};
byte on[8] = { 0b00110,
0b01111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11110,
0b01100
};
void readSet(){ for (byte i = 0; i < qty; i++) tempOUTon = EEPROM.read(i);}
void outOff(){ // выключает выходы for (byte i = 0; i < qty; i++) digitalWrite(OUT, LOW);}
void erorr(){ // останавливает работу программы и сигнализирует ошибку outOff(); // выключаем выходы lcd.clear(); lcd.print("sensor error"); while(1){ // крутим бесконечный цикл analogWrite(10, 100); delay(500); analogWrite(10, 255); delay(500); }
}
////byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; }
//// void setMenu(byte pos){ // установка температуры outOff();
lcd.clear();
while(1){ // крутим бесконечный цикл byte KEY = key(); // читаем состояние кнопок
lcd.setCursor(2, 0); // выводим на экран lcd.print("Out:"); lcd.print(pos+1); lcd.setCursor(9, 0); lcd.print("Pin:"); lcd.print(OUT[pos]); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" PinON: "); lcd.print(tempOUTon[pos]); lcd.write(1); lcd.print("C <>");
if (KEY == 2) { // если нажата кнопка tempOUTon[pos]--; // изменяем значение if (tempOUTon [pos]> 125) tempOUTon [pos]= 0; EEPROM.write(pos, tempOUTon[pos]); // сохраняем в еепром }
else if (KEY == 5){ tempOUTon[pos]++;
if (tempOUTon [pos]> 125) tempOUTon [pos]= 0; EEPROM.write(pos, tempOUTon[pos]); }
delay(200); }///// }//void getTemp(){ // читаем температуру и заполняем массив ds.requestTemperatures();
tempSensor[0] = ds.getTempC(sensor1); // немного китайского кода tempSensor[1] = ds.getTempC(sensor2); tempSensor[2] = ds.getTempC(sensor3); tempSensor[3] = ds.getTempC(sensor4); tempSensor[4] = ds.getTempC(sensor5);}
void sensorTest(){ // ищим датчики на шине, если количество изменилось, останавливаем работу ds.begin(); if(ds.getDeviceCount() != qty) erorr();}
void setup() { // Serial.begin(9600); ds.begin(); qty = ds.getDeviceCount(); // при включении, сохраняем количество градусников, // можно и лучше количество указать руками.
for (int i = 0; i < qty; i++) pinMode(OUT, OUTPUT); for (int i = 0; i < qty; i++) digitalWrite(OUT, LOW);
lcd.createChar(1, gradus); lcd.createChar(2, on); lcd.begin(16, 2); lcd.clear();
readSet(); // читаем настройки из еепром }
void loop() { if (key() == 1) setMenu(pos); // если нажата селект, уходим в настройки
else if (key() == 4 && pos < qty-1) pos++; // крутим позицию else if (key() == 3 && pos != 0) pos--;
sensorTest(); // тест наличия градусников на шине getTemp(); // читаем температуру с датчиков
//// сверяем температуру и управляем выходами for (int i = 0; i < qty; i++) { if (tempSensor < tempOUTon) digitalWrite(OUT, HIGH); else digitalWrite(OUT, LOW); }
/////// вывод инфы на экран lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print(". "); lcd.print(tempSensor[pos], 1); // показываем температуру с датчика lcd.write(1); lcd.print("C "); lcd.setCursor(2, 1); lcd.print(tempOUTon[pos]); // показываем установленную температуру lcd.write(1); lcd.print("C ");
lcd.setCursor(11, 0); // рисуем статус выхода for (int i = 0; i < qty; i++){ if (digitalRead(OUT)) lcd.write(2); else lcd.print(" "); }
lcd.setCursor(11, 1); // рисуем номера выходов for (int i = 0; i < qty; i++) lcd.print(i+1); // delay(500); // необязательная задержка}[/spoiler]
Здравствуйте помогите преобразовать для чтения в flprog
[spoiler=Спойлер]// Термостат, до пяти датчиков DS18B20.// // v 0.2.1 beta#include <EEPROM.h>#include <OneWire.h>#include <DallasTemperature.h>#include <LiquidCrystal.h>
OneWire oneWire(15); // A1 вход датчиков 18b20DallasTemperature ds(&oneWire);LiquidCrystal lcd(8, 9, 4, 5, 6, 7);const byte OUT[5] = {13, 12, 11, 3, 2}; // номера выходов
byte pos;byte tempOUTon[5]; // массив с температурой включения выходаfloat tempSensor[5]; // массив куда читается температураbyte qty; // количество градусников на шине.// адреса градусников.DeviceAddress sensor1 = {0x28, 0xA8, 0x3E, 0xF9, 0x05, 0x0, 0x0, 0x12};DeviceAddress sensor2 = {0x28, 0xE6, 0xBD, 0x3B, 0x05, 0x0, 0x0, 0xCF};DeviceAddress sensor3 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};DeviceAddress sensor4 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};DeviceAddress sensor5 = {0x28, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};byte gradus[8] = { 0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};
byte on[8] = { 0b00110,
0b01111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11110,
0b01100
};
void readSet(){ for (byte i = 0; i < qty; i++) tempOUTon = EEPROM.read(i);}
void outOff(){ // выключает выходы for (byte i = 0; i < qty; i++) digitalWrite(OUT, LOW);}
void erorr(){ // останавливает работу программы и сигнализирует ошибку outOff(); // выключаем выходы lcd.clear(); lcd.print("sensor error"); while(1){ // крутим бесконечный цикл analogWrite(10, 100); delay(500); analogWrite(10, 255); delay(500); }
}
////byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; }
//// void setMenu(byte pos){ // установка температуры outOff();
lcd.clear();
while(1){ // крутим бесконечный цикл byte KEY = key(); // читаем состояние кнопок
lcd.setCursor(2, 0); // выводим на экран lcd.print("Out:"); lcd.print(pos+1); lcd.setCursor(9, 0); lcd.print("Pin:"); lcd.print(OUT[pos]); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" PinON: "); lcd.print(tempOUTon[pos]); lcd.write(1); lcd.print("C <>");
if (KEY == 2) { // если нажата кнопка tempOUTon[pos]--; // изменяем значение if (tempOUTon [pos]> 125) tempOUTon [pos]= 0; EEPROM.write(pos, tempOUTon[pos]); // сохраняем в еепром }
else if (KEY == 5){ tempOUTon[pos]++;
if (tempOUTon [pos]> 125) tempOUTon [pos]= 0; EEPROM.write(pos, tempOUTon[pos]); }
delay(200); }///// }//void getTemp(){ // читаем температуру и заполняем массив ds.requestTemperatures();
tempSensor[0] = ds.getTempC(sensor1); // немного китайского кода tempSensor[1] = ds.getTempC(sensor2); tempSensor[2] = ds.getTempC(sensor3); tempSensor[3] = ds.getTempC(sensor4); tempSensor[4] = ds.getTempC(sensor5);}
void sensorTest(){ // ищим датчики на шине, если количество изменилось, останавливаем работу ds.begin(); if(ds.getDeviceCount() != qty) erorr();}
void setup() { // Serial.begin(9600); ds.begin(); qty = ds.getDeviceCount(); // при включении, сохраняем количество градусников, // можно и лучше количество указать руками.
for (int i = 0; i < qty; i++) pinMode(OUT, OUTPUT); for (int i = 0; i < qty; i++) digitalWrite(OUT, LOW);
lcd.createChar(1, gradus); lcd.createChar(2, on); lcd.begin(16, 2); lcd.clear();
readSet(); // читаем настройки из еепром }
void loop() { if (key() == 1) setMenu(pos); // если нажата селект, уходим в настройки
else if (key() == 4 && pos < qty-1) pos++; // крутим позицию else if (key() == 3 && pos != 0) pos--;
sensorTest(); // тест наличия градусников на шине getTemp(); // читаем температуру с датчиков
//// сверяем температуру и управляем выходами for (int i = 0; i < qty; i++) { if (tempSensor < tempOUTon) digitalWrite(OUT, HIGH); else digitalWrite(OUT, LOW); }
/////// вывод инфы на экран lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print(". "); lcd.print(tempSensor[pos], 1); // показываем температуру с датчика lcd.write(1); lcd.print("C "); lcd.setCursor(2, 1); lcd.print(tempOUTon[pos]); // показываем установленную температуру lcd.write(1); lcd.print("C ");
lcd.setCursor(11, 0); // рисуем статус выхода for (int i = 0; i < qty; i++){ if (digitalRead(OUT)) lcd.write(2); else lcd.print(" "); }
lcd.setCursor(11, 1); // рисуем номера выходов for (int i = 0; i < qty; i++) lcd.print(i+1); // delay(500); // необязательная задержка}[/spoiler]
Последний раз редактировалось yura174 11 апр 2017, 22:30, всего редактировалось 1 раз.
преобразование кода в flprog
Зачем? Если хотите использовать этот код запихайте его в пользовательский блок.
преобразование кода в flprog
Так не проблема, что доработать? Порты поменять?
Добавлено (11.04.2017, 23:47)
---------------------------------------------
Редко такое написание кода увидишь.
Добавлено (11.04.2017, 23:47)
---------------------------------------------
Редко такое написание кода увидишь.
преобразование кода в flprog
Проще новую написать , чем дорабатывать. Я пользовался этим скетчем , тоже хотел доработать.Потом наткнулся в инете на flprog посидел немного , поразбирался и написал то что удовлетворит моим желания.Кстати люди здесь на форуме очень отзывчивые.Вы начните а вам помогут.yura174 писал(а):Здравствуйте помогите преобразовать для чтения в flprog
-
- Лейтенант
- Сообщения: 674
- Зарегистрирован: 10 сен 2015, 21:51
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
преобразование кода в flprog
Здравствуйте.
Решил не создавать новую тему и не мусорить. Нужна ваша помощь. В переносе С кода в Flprog. Тема автоматика для ТТ котла. Есть скетч в С работает не плохо. Но хочу редактировать его под себя. Есть очень много лишнего. По этому. Разбираю алгоритм работы автоматики и небольшими кусками создаю в Flprog. В коде С разбираюсь на уровне лузера. Практически все нужное перенес. Осталась одна нерешаемая проблема для меня. ПИД управление и режим работы заслонки серводвигателя относительно заданных значений ПИД регулятора.
В коде есть описание как должно работать ПИД регулирование и сервопривод. Но я немогу сообразить как это отобразить блоками в Flprog. Можете даже не рисовать блоки а только описать логику кода. А я уже сам попробую собрать в блоки.
************* Пид регулятор*********************
// Настройка пид
Input=temp1-2;
Setpoint=setTmp7;
//работа пид регулятора
myPID.Compute();
z=map(Output,0,255,z4,z5); //0-закрыто, 90- открыто.
if(pusk==HIGH&&pauza==LOW){
if(temp2>=setTmp8&&(temp2<=setTmp9)){z6=z;}
if(temp2<setTmp8){z3=setTmp8-temp2; z6=z+z3; }
if(temp2>setTmp9){z3=temp2-setTmp9; z6=z-z3; }
if(z1>=z5){z6=z5;}
if(z1<=z4){z6=z4;}
z1=((z6-z1)/5)+z1;
}
else{z1=0;}
if(avaria1==HIGH){z1=0;} //закрываем заслонку по аварии датчика теплоносителя
if(avaria==HIGH){z1=0;} //закрываем заслонку по общей аварии
***** Управление сервоприводом заслонки************
// управляем работой заслонки
if(pusk==HIGH){if(z2!=z1){if(currentTime>=(time3+5000)){time3=currentTime; myOS.restartScheduler();z2=z1;
stepe=map(z1,0,180,544,2400);delay_ms(500); myOS.haltScheduler();
Решил не создавать новую тему и не мусорить. Нужна ваша помощь. В переносе С кода в Flprog. Тема автоматика для ТТ котла. Есть скетч в С работает не плохо. Но хочу редактировать его под себя. Есть очень много лишнего. По этому. Разбираю алгоритм работы автоматики и небольшими кусками создаю в Flprog. В коде С разбираюсь на уровне лузера. Практически все нужное перенес. Осталась одна нерешаемая проблема для меня. ПИД управление и режим работы заслонки серводвигателя относительно заданных значений ПИД регулятора.
В коде есть описание как должно работать ПИД регулирование и сервопривод. Но я немогу сообразить как это отобразить блоками в Flprog. Можете даже не рисовать блоки а только описать логику кода. А я уже сам попробую собрать в блоки.
************* Пид регулятор*********************
// Настройка пид
Input=temp1-2;
Setpoint=setTmp7;
//работа пид регулятора
myPID.Compute();
z=map(Output,0,255,z4,z5); //0-закрыто, 90- открыто.
if(pusk==HIGH&&pauza==LOW){
if(temp2>=setTmp8&&(temp2<=setTmp9)){z6=z;}
if(temp2<setTmp8){z3=setTmp8-temp2; z6=z+z3; }
if(temp2>setTmp9){z3=temp2-setTmp9; z6=z-z3; }
if(z1>=z5){z6=z5;}
if(z1<=z4){z6=z4;}
z1=((z6-z1)/5)+z1;
}
else{z1=0;}
if(avaria1==HIGH){z1=0;} //закрываем заслонку по аварии датчика теплоносителя
if(avaria==HIGH){z1=0;} //закрываем заслонку по общей аварии
***** Управление сервоприводом заслонки************
// управляем работой заслонки
if(pusk==HIGH){if(z2!=z1){if(currentTime>=(time3+5000)){time3=currentTime; myOS.restartScheduler();z2=z1;
stepe=map(z1,0,180,544,2400);delay_ms(500); myOS.haltScheduler();
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось CraCk 09 окт 2017, 00:32, всего редактировалось 1 раз.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
преобразование кода в flprog
Примерно так, дальше сам.
Надеюсь, функции myPID.Compute(); myOS.restartScheduler(); myOS.haltScheduler(); реализовал пользовательскими блоками.
Надеюсь, функции myPID.Compute(); myOS.restartScheduler(); myOS.haltScheduler(); реализовал пользовательскими блоками.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Лейтенант
- Сообщения: 674
- Зарегистрирован: 10 сен 2015, 21:51
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
преобразование кода в flprog
А зачем? myPID.Compute() уже есть в версии 2,5,3. myOS можно заменит библиотекой servo? Не очень понимаю функции.Sancho писал(а):Надеюсь, функции myPID.Compute(); myOS.restartScheduler(); myOS.haltScheduler();
Последний раз редактировалось CraCk 09 окт 2017, 23:14, всего редактировалось 1 раз.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
преобразование кода в flprog
Это, по сути своей, маленькие подпрограммы(блоки). Они бывают пользовательские и библиотечные.CraCk писал(а):Не очень понимаю функции
Пользовательские - в теле программы создаётся блок, void ИМЯ ФУНКЦИИ(блока)(аргументы) { алгоритм функции}. Затем, любом месте программы указываем ИМЯ ФУНКЦИИ(могут быть аргументы) и здесь произойдёт выполнение её алгоритма.
Библиотечные - объявляется сама библиотека(#include <LiquidCrystal_I2C.h>>), а затем её функциям присваиваются конкретные имена для самой программы - LiquidCrystal_I2C lcd(0x3f,20,4);.
Зная функции библ., даём команды
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
Всё остальное аналогично.
Что-бы воспользоваться сторонней библиотекой в FLProg, необходимо создать блок с включённой библиотекой и в его теле вызывать необходимые функции.
Пытался объяснить как понимаю сам. Не программист.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Лейтенант
- Сообщения: 674
- Зарегистрирован: 10 сен 2015, 21:51
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
преобразование кода в flprog
С частю кода, расчет значение для управления заслонкой разобрался.
Но с управлением сервоприводом не идет. Там используется библиотека много многозадачности, и еще какой то stepe=map(z1,0,180,544,2400). Не могу понять что здесь происходит и зачем еще время прилепили? Может рассчитанную переменную z1 просто напрямую подавать на вход сервопривода минуя этот кусок кода ?
***** Управление сервоприводом заслонки************
// управляем работой заслонки
if(pusk==HIGH){if(z2!=z1){if(currentTime>=(time3+5000)){time3=currentTime; myOS.restartScheduler();z2=z1;
stepe=map(z1,0,180,544,2400);delay_ms(500); myOS.haltScheduler();
Но с управлением сервоприводом не идет. Там используется библиотека много многозадачности, и еще какой то stepe=map(z1,0,180,544,2400). Не могу понять что здесь происходит и зачем еще время прилепили? Может рассчитанную переменную z1 просто напрямую подавать на вход сервопривода минуя этот кусок кода ?
***** Управление сервоприводом заслонки************
// управляем работой заслонки
if(pusk==HIGH){if(z2!=z1){if(currentTime>=(time3+5000)){time3=currentTime; myOS.restartScheduler();z2=z1;
stepe=map(z1,0,180,544,2400);delay_ms(500); myOS.haltScheduler();
Последний раз редактировалось CraCk 13 окт 2017, 23:08, всего редактировалось 1 раз.
- Dev1
- Майор
- Сообщения: 1045
- Зарегистрирован: 12 июл 2016, 18:04
- Откуда: Гондурас
- Поблагодарили: 3 раза
преобразование кода в flprog
Цитата CraCk () какой то stepe=map(z1,0,180,544,2400). Не могу понять что здесь происходит
Пересчитывается угол поворота z1 из диапазона от 0 до 180 градусов, в длину импульса stepe от 544 до 2400. У разных серво длина импуса разная.
Вам будет проще взять стандартный блок PID и блок SERVO. Пид настроить на выход 0-180 и получите угол. Как то так.
Пересчитывается угол поворота z1 из диапазона от 0 до 180 градусов, в длину импульса stepe от 544 до 2400. У разных серво длина импуса разная.
Вам будет проще взять стандартный блок PID и блок SERVO. Пид настроить на выход 0-180 и получите угол. Как то так.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Win10-64 FLProg v8.2.3 Portable IDE 1.8.19, 2,x,x 

- Alias
- Лейтенант
- Сообщения: 481
- Зарегистрирован: 27 ноя 2017, 13:15
- Откуда: Rus44
- Имя: Michael
- Контактная информация:
преобразование кода в flprog
То есть, если я правильно понял, плата по управлению сервоприводом может быть вот прямо настолько простой? См. вложение.
Задача - управлять температурой охлаждаемой жидкости регулировкой расхода воды в рубашке проточного теплообменника. Параметры ПИД пока не рассматриваем.
[spoiler] [/spoiler]
Задача - управлять температурой охлаждаемой жидкости регулировкой расхода воды в рубашке проточного теплообменника. Параметры ПИД пока не рассматриваем.
[spoiler] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
преобразование кода в flprog
Да.Alias писал(а): 20 апр 2018, 13:53 плата по управлению сервоприводом может быть вот прямо настолько простой?
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
преобразование кода в flprog
А почему бы и нет. Главное ПИД правильно настроить.Alias писал(а): 20 апр 2018, 13:53плата по управлению сервоприводом может быть вот прямо настолько простой?
1. Сначала Ки, Кд обнуляем и подбираем Кп. Температура должна отрегулироваться на 10..20% ниже уставки.
2. Начинаем подбирать Ки. Чем он меньше, тем быстрее набирается мощность и в какой-то может начаться качание температуры, отодвигаем коэфф немного назад.
3. Далее добавляем Кд, для увеличения скорости реакции системы, также доводим до качания и откатываем коэфф немного назад.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 11 гостей