Помогите пожалуйста написать скетч

Здравствуйте. Достался по случаю предпусковой подогреватель Webasto termo top c, с физически убитой платой контроллера, прям сломана в нескольких местах от удара, восстановлению не подлежит. Так вот на просторах интернета была найдена схема контроллера на Ардуино для этого котла, также есть скетч к этой плате. Но если со схемой я ещё разберусь сам, подберу детали и спаяю. То вот скетч под мои задачи прошу вас помочь переработать, так как я в этом ни в зуб ногой. Задача стоит следующим образом. Исключить из скетча вывод информации на LCD экран, т.к. это не требуется. Так же надо удалить из программы все что связано с датчиком пламени, у меня в котле его нет. Работу котла контролировать по температуре Если это важно то планирую использовать Ардуино нано. Прошу комрады помощи.

Помогите пожалуйста написать скетч Arduino, Скетч, Программирование, Электроника, Длиннопост

#include <glcd.h>
#include <glcd_Buildinfo.h>
#include <glcd_Config.h>


//MEGA
#include <glcd.h>
#include <config/ks0108.h> // library header
#include <fonts/Arial14.h> // font definition for 14 point Arial font.
#include <fonts/SystemFont5x7.h> // system font
#include <bitmaps/ArduinoIcon.h> // bitmap

// Выходы
int Pin_CandelGlow = 3; // Свеча накала
int Pin_WaterPump = 9; // Водяной насос
int Pin_GasPump = 6; //Дозацыя горючего //10,15,20,25,30,35,40,45,50,100// Количество доз топлива, просто дозацыя.
int Pin_AirPump = 10; //Подача воздуха по ШИМ

// Входы
int Pin_StartStop = 12; // Цыфровой вход Включить или выключить установку
int Pin_VoltageMonitoring = 0; // Постоянное наблюдение за напряжением питания
int Pin_FlameMonitoring = 1; // Наблюдение состаяния пламени
int Pin_Temperatura = 2; // Аналоговае измерение температуры котла-жидкости

float VoltAnalog, Voltage, X, T_heater; // измерение напрежение источника питания

long t_1 = 0; // переменная для хранения времении работы программы в милис
long t_2 = 0; // переменная для хранения времении работы программы в милис

String inData; // переменыя читающая данные текста (текстовые команды)

int Flame, air, val, low, i, b, t, g, p, l;

boolean pauzada = false;
boolean stopp = false;
boolean pauzadaOff = false;

void setup()
{
pinMode(Pin_StartStop, INPUT);
pinMode(Pin_CandelGlow, OUTPUT);
pinMode(Pin_GasPump, OUTPUT);
pinMode(Pin_WaterPump, OUTPUT);
pinMode(Pin_AirPump, OUTPUT);

Serial.begin(9600);

delay(500);
//GLCD.Init() ; //инциализовать для рисования зажиганием пикселей (обычный вывод)
GLCD.Init(NON_INVERTED); // тоже самое
//GLCD.Init(INVERTED); // инциализовать для рисования выключением пикселей (инверсный вывод)
GLCD.ClearScreen(); // погасить все пиксели (если режим NORMAL , если INVERTED - зажечь)
GLCD.ClearScreen(WHITE); // тоже самое
//GLCD.ClearScreen( BLACK); // зажечь все пиксели
GLCD.SetFontColor( BLACK); // печатаем "цветом" BLACK

//*****ТЕКСТОВЫЕ*КОМАНДЫ*****
// test
// tempr
// airon
// airoff
// wateron
// wateroff
// gason -> 5,10,15,20,25,30,35,40,45,50
// glowon сам выллючется
// flame
// start
// stop

}

void test() // кластер тестирования всех мехонизмов и сенсоров
{

digitalWrite(Pin_CandelGlow, HIGH);
Serial.println("Pin_CandelGlow: On Off");
delay(5000);
digitalWrite(Pin_CandelGlow, LOW);
delay(1000);

digitalWrite(Pin_WaterPump, HIGH);
Serial.println("Pin_WaterPump: On Off");
delay(5000);
digitalWrite(Pin_WaterPump, LOW);
delay(1000);

digitalWrite(Pin_GasPump, HIGH);
Serial.println("Pin_GasPump: On Off");
delay(500);
digitalWrite(Pin_GasPump, LOW);
delay(1000);

digitalWrite(Pin_AirPump, HIGH);
Serial.println("Pin_AirPump: On Off");
delay(5000);
digitalWrite(Pin_AirPump, LOW);
delay(1000);
Serial.println(" ");

///Voltage///
volt();

///Flame///
flame();

///StartStop///

if (digitalRead(Pin_StartStop) == HIGH)
{
Serial.println("Pin_StartStop: HIGH");
}
if (digitalRead(Pin_StartStop) == LOW)
{
Serial.println("Pin_StartStop: LOW");
}
Serial.println(" ");
delay(1000);

///Temperatura///

Temperatura();
Serial.print("T_heater: ");
Serial.print(T_heater);
Serial.println(" ");
delay(1000);
}

void ReadTextComands() // читает текст
{
inData = "";
if (Serial.available() > 0)
{
int h = Serial.available();
// if you are getting escape -characters try h--; here

for (int i = 0; i < h; i++)
{
inData += (char)Serial.read();
}
// if you are getting escape -characters try Serial.read(); here
}
//print it out
Serial.println(inData);
delay(10);
}

void flame() // состояния пламени
{
Flame = analogRead(Pin_FlameMonitoring);
Flame = map(Flame, 320, 890, 0, 100);

}


// показания температуры с плавающей запятой
float floatMap(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
void Temperatura() // температурa
{
int ValueTempratura = analogRead(Pin_Temperatura); // считывает показания сенсоро
T_heater = floatMap(ValueTempratura, 544, 365, 22, 52); // показания термосенсора переводит в температуру /// коректировка температуры
T_heater = constrain(T_heater, -30, 120); // граничет показания температуры от -30 до +150
/*
Serial.print("ValueTempratura: ");/// коректировка температуры
Serial.print(ValueTempratura); /// коректировка температуры
Serial.print(" T: "); /// коректировка температуры
Serial.println((T_heater), 2);
*/
}

void volt()
{
int Pin0_AnalogValue = analogRead(Pin_VoltageMonitoring);
VoltAnalog = 0.0046 * Pin0_AnalogValue;
int R1 = 29500; //30000 Om 29700
int R2 = 7430; //7500 Om 7470

X = (R2 / ((R1 + R2) * VoltAnalog)) * 100;
Voltage = (123.775 / X) * (-1); //131.25 menjatj ot 100 i vihe 132.25

// Serial.print("Voltage: ");
// Serial.print((float)(Voltage), 2);
}

void pauza() // этап паузы котла
{
delay(50);
Serial.println("Pauza");
GLCD.GotoXY(1,3);
GLCD.Puts("Pauza");

while (1)
{
flame();
delay(50);
Serial.println(Flame);
GLCD.GotoXY(1,13); //Переместить «курсор» в указанные координаты
GLCD.Puts("Flame: ");
GLCD. print(Flame,DEC);

digitalWrite(Pin_WaterPump, HIGH);

digitalWrite(Pin_CandelGlow, LOW);
digitalWrite(Pin_GasPump, LOW);
digitalWrite(Pin_AirPump, 80);
if (Flame <= 15)
{
digitalWrite(Pin_AirPump, LOW);
digitalWrite(Pin_WaterPump, LOW);

Serial.println("Pauza On");
digitalWrite(Pin_AirPump, LOW);
digitalWrite(Pin_WaterPump, HIGH);
digitalWrite(Pin_CandelGlow, LOW);
digitalWrite(Pin_GasPump, LOW);

pauzada = true;
break;
}
}
}

void stopproces() // остановкa котла
{
delay(10);
Serial.println("Stoping");
GLCD.GotoXY(1,3);
GLCD.Puts("Stoping");

while (1)
{
flame();
delay(500);
Serial.println(Flame);
GLCD.GotoXY(1,13); //Переместить «курсор» в указанные координаты
GLCD.Puts("Flame: ");
GLCD. print(Flame,DEC);

digitalWrite(Pin_WaterPump, HIGH);

digitalWrite(Pin_CandelGlow, LOW);
digitalWrite(Pin_GasPump, LOW);
analogWrite(Pin_AirPump, 80);
if (Flame <= 15)
{
digitalWrite(Pin_AirPump, LOW);
digitalWrite(Pin_WaterPump, LOW);

for ( i = 0; i < 3 ; i++ ) // 3 коротких продува, окончательное завершение процеса
{
digitalWrite(Pin_AirPump, HIGH);
delay(1500);
digitalWrite(Pin_AirPump, LOW);
delay(1500);
}

digitalWrite(Pin_AirPump, LOW);
digitalWrite(Pin_WaterPump, LOW);
digitalWrite(Pin_CandelGlow, LOW);
digitalWrite(Pin_GasPump, LOW);
pauzadaOff = false;
pauzada = false;

Serial.println("Proces Off");
GLCD.GotoXY(1,23); //Переместить «курсор» в указанные координаты
GLCD.Puts("Proces Off");
delay(5000);
GLCD.ClearScreen(WHITE);
break;
}
}
}

void loop()
{
GLCD.SelectFont(System5x7,BLACK);

Temperatura();
volt();

GLCD.GotoXY(85,3); //Переместить «курсор» в указанные координаты
GLCD.Puts("T:");
GLCD. print((float)(T_heater)); //печатает вещественное число с двумя знаками после запятой.
GLCD.GotoXY(85,13); //Переместить «курсор» в указанные координаты
GLCD.Puts("V:");
GLCD. println((float)(Voltage));
Serial.print("T: ");
Serial.println(T_heater);
Serial.print("V: ");
Serial.println(Voltage);

/////////////////////////////////////////////
delay(2000);
ReadTextComands();

GLCD.GotoXY(1,23);

GLCD.print(inData);
Serial.print(inData);

/////////////////////////////////////////////

///Test///

if (String(inData) == "test") // начать тестирование систем
{
Serial.println("TestRun");
test();
}

///temperatura///

if (String(inData) == "tempr")
{
Temperatura();
Serial.print("T_heater: ");
Serial.println(T_heater);
}

///Air///

if (String(inData) == "airon") // включить или выключить подачу воздуха (только при полной остоновке котла)
{
Serial.println("AirOn");
digitalWrite(Pin_AirPump, HIGH);

t_1 = millis();
while ((t <= 300) || (String(inData) == "airoff")) // выключить после 5 минут работы или принудительно выключить
{
ReadTextComands();

t_2 = millis();
if (t_2 < 0)
{
(t_2)*(-1);
}
long t = (t_2 - t_1) / 1000;
delay(2000);

if ((String(inData) == "airoff") || (t >= 300))
{
Serial.println("AirOff");
digitalWrite(Pin_AirPump, LOW);
break;
}
}
}

///WaterPump///

if (String(inData) == "wateron") // включить или выключить церкулецыонный насос (только при полной остоновке котла)
{
Serial.println("WaterOn");
digitalWrite(Pin_WaterPump, HIGH);

t_1 = millis();
while ((t <= 600) || (String(inData) == "wateroff")) // выключить после 10 минут работы или принудительно выключить
{
ReadTextComands();

t_2 = millis();
if (t_2 < 0)
{
(t_2)*(-1);
}

long t = (t_2 - t_1) / 1000;
delay(500);

if ((String(inData) == "wateroff") || (t >= 600))
{
Serial.println("WaterOff");
digitalWrite(Pin_WaterPump, LOW);
break;
}
}
}

///GasOn///

if (String(inData) == "gason") // подача топлива (только при полной остоновке котла)
{
Serial.println("Enter the number of Gas doses!?");
Serial.println("5,10,15,20,25,30,35,40,45,50");

t_1 = millis();
while (1) // ждём получения команды на количество доз топлива
{
delay(100);

int val = Serial.parseInt();
if ((val == 5) || (val == 10) || (val == 15) || (val == 20) || (val == 25) || (val == 30) || (val == 35) || (val == 40) || (val == 45) || (val == 50)) //Дозацыя по команде от компютера
{
Serial.println(" ");
Serial.print("GasPumping: ");
Serial.println(val);

for (i = 0; i < val; i++) //энное раз прыскaет топливом
{
digitalWrite(Pin_GasPump, HIGH);
delay(150);
digitalWrite(Pin_GasPump, LOW);
delay(250);
}
break;
}
t_2 = millis();
if (t_2 < 0)
{
(t_2)*(-1);
}

long t = (t_2 - t_1) / 1000;

if (t > 60) // до 1 мин
{
break;
}
// ждём нужную команду до 1 мин..... на левак не реогирует
Serial.println(".");
}
}

///GlowOn///

if (String(inData) == "glowon") //включить свечу накала на 7 секунд
{
digitalWrite(Pin_CandelGlow, HIGH);
Serial.println("Pin_CandelGlow: On");
delay(7500);
digitalWrite(Pin_CandelGlow, LOW);
Serial.println("Pin_CandelGlow: Off");
}

if (String(inData) == "flame")
{
for( i=0; i<50; i++ )
{
flame();
Serial.print("Flame:");
Serial.println(Flame);
Serial.println(i);
delay(1000);
}
i=0;
}

if (T_heater >= 85) //вслучае перегрева опевещает и ждёт пока остынет при этом недаст запустится повторно
{
GLCD.ClearScreen(WHITE);
GLCD.SelectFont(System5x7,BLACK);
delay(1000);
while (1)
{
Temperatura();
delay(500);
Serial.print("DANGEROUUS CONDITION ");
Serial.println("VERY HOT, DONT START");
Serial.print(" Temperatura: ");
Serial.println(T_heater);
GLCD.GotoXY(1,13); //Переместить «курсор» в указанные координаты
GLCD.Puts("VERY HOT");
GLCD.GotoXY(1,23); //Переместить «курсор» в указанные координаты
GLCD.Puts("DANGEROUUS CONDITION");
GLCD.GotoXY(1,33); //Переместить «курсор» в указанные координаты
GLCD.Puts("Temperatura: ");
GLCD. print((float)(T_heater)); //печатает вещественное число с двумя знаками после запятой.

if (T_heater <= 70)
{
GLCD.ClearScreen(WHITE);
GLCD.SelectFont(System5x7,BLACK);
break;
}
}
}
///********ПАУЗА*ЖДЁТ*СВАЕГО*МОМЕНТА*СТAТЬ*НЕ*ПАУЗOЙ*********///
//?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
if (pauzada == true)
{
while (1)
{
Temperatura();
delay(500);
ReadTextComands(); // отослать команду если надо всё выключить
delay(500);

Serial.print("Temperatura: ");
Serial.println(T_heater);
GLCD.GotoXY(1,23); //Переместить «курсор» в указанные координаты
GLCD.Puts("Temperatura: ");
GLCD. print((float)(T_heater)); //печатает вещественное число с двумя знаками после запятой.

if ( T_heater <= 55 )
{
pauzadaOff = true;
break;
}

if ((String(inData) == "stop") || (digitalRead(Pin_StartStop) == HIGH)|| (b == 4))
{
GLCD.ClearScreen(WHITE);
GLCD.SelectFont(System5x7,BLACK);
stopproces();
break;
}
}
}

///****************************** ЗАПУСК УСТАНОВКИ ******************************///

if ((String(inData) == "start") || (digitalRead(Pin_StartStop) == HIGH) || (pauzadaOff == true))
{
if (T_heater >= 70) //вслучае перегрева опевещает и ждёт пока остынет при этом недаст запустится повторно так как тут в цыкле застрянет
{
Temperatura();
Serial.print("DANGEROUUS CONDITION ");
Serial.println("VERY HOT, DONT START");
Serial.print("Temperatura: ");
Serial.println(T_heater);
return;
}

Serial.flush();
Serial.println("StartHeating");

GLCD.ClearScreen(WHITE);
GLCD.SelectFont(System5x7,BLACK); //указать щрифт и ево робочий режим
GLCD.GotoXY(1,3); //Переместить «курсор» в указанные координаты
GLCD.Puts("StartHeating"); //STARTING,WORKING,FINISHED,ERROR

analogWrite(Pin_AirPump, 50); //вkлючон воздушный вентилятор
delay(5000);
digitalWrite(Pin_CandelGlow, HIGH);
delay(7500);
digitalWrite(Pin_CandelGlow, LOW);
delay(7500);

for ( b = 0; b < 4; b++ ) // 4 раза запускает печь
{
lable:
digitalWrite(Pin_CandelGlow, HIGH);
delay(9000);

Serial.println("Gas pumping:");
GLCD.GotoXY(1,13); //Переместить «курсор» в указанные координаты
GLCD.Puts("Gas pumping");

for ( i = 0; i < 10; i++) // 10 раз прыскнет топливом
{
digitalWrite(Pin_GasPump, HIGH);
delay(100);
digitalWrite(Pin_GasPump, LOW);
delay(300);
}
digitalWrite(Pin_CandelGlow, LOW); //выключить свечу накала

flame();
Serial.print("Flame: ");
Serial.println(Flame);
GLCD.GotoXY(1,23); //Переместить «курсор» в указанные координаты
GLCD.Puts("Flame: ");
GLCD. print(Flame,DEC);

///****************************** РАБОТА УСТАНОВКИ ******************************///

if (Flame >= 20 && i == 10 ) //если фото сенсор фиксирует пламя, то программа проходит далее
{
digitalWrite(Pin_CandelGlow, LOW); //выключить свечу накала ewo raz
analogWrite(Pin_AirPump, 50); //вkлючон воздушный вентилятор
digitalWrite(Pin_WaterPump, HIGH); //вклить воденой насос
delay(100);
digitalWrite(Pin_GasPump, HIGH);
delay(100);
digitalWrite(Pin_GasPump, LOW);

for ( l = 50; l > 0; l--) // начало разгона установки в плавном режиме
{
digitalWrite(Pin_GasPump, HIGH);
delay(100);
digitalWrite(Pin_GasPump, LOW);
delay(450);

flame();
Serial.print(l);
Serial.print(" Flame: ");
Serial.println(Flame);

GLCD.GotoXY(1,23); //Переместить «курсор» в указанные координаты
GLCD.Puts("Flame: ");
GLCD. print(Flame,DEC);
GLCD.Puts(" i: ");
GLCD. print(l);

if (Flame <= 20)
{
goto lable;
break;
}
}
GLCD.ClearScreen(WHITE); // Очистить экран
GLCD.SelectFont(System5x7,BLACK); //указать щрифт и ево робочий режим

while ((Flame >= 20) && (T_heater <= 82)) // зайдёт в цыкл если есть плымя и температура ниже 80
{
ReadTextComands();
flame();
Temperatura();
volt();

digitalWrite(Pin_WaterPump, HIGH); //вкюлить воденой насос

///*** режимы работы изменяющиеся от температуры***///

if (T_heater <= 30)
{
air = map(T_heater, 5, 30, 50, 80); //меняем подачу воздуха в зависемости от температуры
air = constrain(air, 50, 80);
t = map(T_heater, 5, 30, 450, 300); //меняем время выключенного состояния топливного дозатора в зависемости от температуры
t = constrain(t, 300, 450);

Serial.print("T<=30 ");
GLCD.GotoXY(1,13); //Переместить «курсор» в указанные координаты
GLCD.EraseTextLine(eraseFULL_LINE);
GLCD.Puts("T<=30");
}
if ((30 <= T_heater) && ( T_heater <= 60))
{
air = map(T_heater, 30, 60, 80, 120);
air = constrain(air, 80, 120);
t = 300;

Serial.print("30<=T<=60 ");
GLCD.GotoXY(1,13); //Переместить «курсор» в указанные координаты
GLCD.EraseTextLine(eraseFULL_LINE);
GLCD.Puts("30<=T<=60");
}
if ( (60 <= T_heater) && (T_heater <= 80) )
{
air = map(T_heater, 60, 80, 120 , 80);
air = constrain(air, 80, 120);
t = map(T_heater, 60, 80, 300, 600);
t = constrain(t, 300, 600);

Serial.print("60<=T<=80 ");
GLCD.GotoXY(1,13); //Переместить «курсор» в указанные координаты
GLCD.EraseTextLine(eraseFULL_LINE);
GLCD.Puts("60<=T<=80");
}
analogWrite(Pin_AirPump, air); //работа подачи воздуха


///*************************************************///

Serial.print("F: ");
Serial.print(Flame);
Serial.print(" T: ");
Serial.print(T_heater);
Serial.print(" A: ");
Serial.print(air);
Serial.print(" Low(t): ");
Serial.print(low);
Serial.print(" V: ");
Serial.println(Voltage);

digitalWrite(Pin_GasPump, HIGH);
delay(100);
digitalWrite(Pin_GasPump, LOW);
low = t;
delay(low);

GLCD.GotoXY(1,3);
GLCD.Puts("Heating");
GLCD.GotoXY(50,3); //Переместить «курсор» в указанные координаты
GLCD.Puts("Volt: ");
GLCD. print((float)(Voltage));
GLCD.GotoXY(1,23); //Переместить «курсор» в указанные координаты
GLCD.Puts("Flame: ");
GLCD. print(Flame,DEC);
GLCD.GotoXY(1,33); //Переместить «курсор» в указанные координаты
GLCD.Puts("Temperatura: ");
GLCD. print((float)(T_heater)); //печатает вещественное число с двумя знаками после запятой.
GLCD.GotoXY(1,43); //Переместить «курсор» в указанные координаты
GLCD.Puts("Air: ");
GLCD. print(air,DEC);
GLCD.GotoXY(1,53); //Переместить «курсор» в указанные координаты
GLCD.Puts("Low(t): ");
GLCD. print(t,DEC);

//****************************** ОСТАНОВКА*ПРИНУДИТЕЛЬНАЯ*ПРОПАЛО_ПЛАМЯ*ПАУЗА ******************************//

if ((String(inData) == "stop") || (digitalRead(Pin_StartStop) == HIGH) || (Flame <= 20)) // Нажата кнопка включить выключить или пропало плямя, то полная остановка.
{
GLCD.ClearScreen(WHITE); // Очистить экран
GLCD.SelectFont(System5x7,BLACK); //указать щрифт и ево робочий режим
stopp = true;
break;
}
if (T_heater >= 80)
{
GLCD.ClearScreen(WHITE); // Очистить экран
GLCD.SelectFont(System5x7,BLACK); //указать щрифт и ево робочий режим
pauzada = true;
break;
}
}
if ( stopp == true )
{
stopp = true;
break;
}
if (pauzada == true)
{
pauzada = true;
break;
}
}
if ( stopp == true )
{
stopp = true;
break;
}
if (pauzada == true)
{
pauzada = true;
break;
}
}
if (( b == 4 ) || (stopp == true)) // Остановка запуска если незапустился с 4 раза, завершить работу котла
{
stopproces();
}
if (pauzada == true)
{
pauza();
}
}
}

Схема и скетч взяты отсюда: https://forum.amperka.ru/threads/Самодельный-блок-управления-webasto.7672/

Arduino & Pi

1.4K постов20.6K подписчиков

Добавить пост

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу