Сообщество - Arduino & Pi
Добавить пост

Arduino & Pi

1 377 постов 20 573 подписчика

Популярные теги в сообществе:

Являются ли Бог или Природа хорошими программистами? Почему любовь - это Баг?

Многим знакомо объектно-ориентрованное программирование (ООП), в котором есть принципы абстракции, инкапсулирования и полиморфизма, например. Более известна аббревиатура SOLID:

Являются ли Бог или Природа хорошими программистами? Почему любовь - это Баг? Эволюция, Секс, Мозг, Solid, Ооп, Программирование, Длиннопост

Давайте с вами представим, что мы - боги, которые хотят следующее поколение каких - то животных изменить. Мы хотим изменить их генетический код, хотим сделать их лучше, жизнь их хотим улучшить, или эффективность их жизни.

Я просто решил изучить SOLID, и мне легче понимать на примерах из биологии. Что-то новое я вряд ли скажу, просто интересны сами аналогии. Новое как раз могут сказать программисты, которые зайдут сюда и расширят данную метафору.


Принципы программирования генетического кода в экологии. SOLID. Первая буква S - выбери единственную обязанность изменения кода в этом поколении животных, о Великий Бог!

Давайте с вами двигаться по аббревиатуре SOLID. Первая буква - это принцип единственной обязанности.

Принцип единственной обязанности (Single Responsibility Principle) можно сформулировать так:

Каждый компонент должен иметь одну и только одну причину для изменения.

В C# в качестве компонента может выступать класс, структура, метод. А под обязанностью здесь понимается набор действий, которые выполняют единую задачу. То есть суть принципа заключается в том, что класс/структура/метод должны выполнять одну единственную задачу.

Вроде бы как мы должны применять данный принцип к отдельным органам животного, по этой логике. Но, с одной стороны, животное есть часть стада, стаи, социума, потому он один может быть носитель некоторой функции, которая работает недостаточно и мы хотим её поменять.

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

Потому в каком то приближении мы можем сказать, что мы можем применить первую букву аббревиатуры Solid к животному, как к целому объекту, а не как к его части. Потому что животное является частью популяции. И, как часть популяции, как носитель кода, оно выполняет главную задачу этого кода, причину существования этой популяции- это размножение.
Каким то образом такой код можно приравнять к компьютерным вирусам. Но насколько принципы SOLID применимы к жизни компьютерных вирусов, особенно тех, кто может менять свой программный код, я не знаю. Если знающие люди есть, расскажите в комментариях. Как происходит эволюция вирусов в компе?


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


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

Вроде бы как общеизвестно, что основных потребностей у животных три: выживание, иерархия, размножение.

И можно рассматривать это как отдельные функции, а можно, как связанные.

Ведь, С одной стороны,мы должны линейно выполнить два предыдущих: выжить и иерархировать. Это говорит о взаимосвязи функций.

С другой стороны, есть животные, которым выживать и иерархию не нужно:

-подёнки, которые вроде как размножаются все, никакой иерархии и выживания нет, ну или есть моногамные

-сообщества коллективные, у которых выживание определяется структурой стада, а иерархия не нужна, потому что любое животное.

Это нам говорит о том, что размножение - это отдельная функция, не затрагивающая остальные в явном виде.

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


Если рассматривать размножение , как то, что идёт после выживания и иерархии, что являет собой главную причину изменения генетического кода, то размножению, как единственной обязанности, надо делегировать иерархию и выживание другим блокам генетического кода или структуры мозга. Хотя, может, это не делегирование, это наследование?

Если рассматривать размножение, как независящие, то ему делегировать ничего не нужно.


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

В программировании это означает, что если этот компонент отвечает только за размножиться, остальные функции, без которых не размножиться, компонент должен делегировать другим компонентам. Фактически базовый класс делегирует выполнение отдельных шагов процесса подклассам
Хотя иногда вроде как делегирование - это наилучший принцип для интерфейсов, а не для любых компонентов, классов, функций? Тут я не очень спец, я больше по естественным наукам, чем по программированию.

С другой стороны, это не только делегирование, но ещё и наследование? Какая то путаница. Если размножение будет свои части: выживание и иерархию - выделять в отдельные классы, они наследуются или это отдельные классы? Мне пока непонятно, если у вас есть ответ, напишите.

Давайте, пока этого ответа нет, вместо теории обратимся к практике.



Являются ли Бог или Природа хорошими программистами? Почему любовь - это Баг? Эволюция, Секс, Мозг, Solid, Ооп, Программирование, Длиннопост

Из практики программирования вроде бы легче вывести различные свойства живых существ. Понятно, что ДНК должно отвечать только за логику хранения данных. Естественный отбор - это валидация того, насколько измененные данные днк улучшают выживание.
При этом днк может уведомлять как организм, в котором оно действует, так и остальных животных вокруг, о том, что данные изменения привели к хорошим результатам. Скажем, данный самец стал альфой и потому у него серебристая спина.

Обработка ошибок - это что -то из разряда не дарвиновского наследования, ламаркизм. Когда изменения если не в коде, но в способах его чтения, могут быть развиты при жизни особи. Про логгирование, парсинг и маппинг знаю мало. Могу только сказать, что логирование это скорее инфа не для самого организма, а для окружающих людей, например. врачей или зоологов. Само животное может не понимать, что происходит.


Так является ли бог хорошим программистом?

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

Однако я должен пока сказать, что природа сделала ровно наоборот, и частенько никакого улучшения размножения при улучшении выживания или иерархии, или при усилении иерархической борьбы не происходит.

Валидация случаев, когда одновременно максимально удовлетворяются все три потребности, не производилась. Механизма уведомления организма, что удовлетворение одной потребности мешает удовлетворению другой, нет. Прижизненная обработка ошибок в ДНК невозможна. Хотя есть некий ламаркизм.

Это приводит, например, к тому, что, чем лучше удовлетворены иерархическая потребность и выживание, тем меньше тебе нужен рядом находящийся половой партнёр для выживания или выпендрежа. Он нужен тебе только для любви. А любовь - это половой отбор. И если ты такой крутой и успешный, то мало кто тебе равен, как особи. А уж если ты самка, то вообще вокруг только каждый десяти тысячный тебе подходит для бесплатного быстрого репродуктивного секса при первой встрече....А на второй тебе уже этот самец не интересен, ушёл огонёк. И вот мы уже оказываемся в мышином рае 25.

В принципе, об этой ошибке Бога у меня целая есть отдельная подробная статья .

В принципе, какое то исправление этого бага есть, у животных половой отбор ускоряется только тогда, когда последующий год в несколько раз более урожайный, чем этот. Это некоторая обработка ошибок, а то и логгирование, когда лог ресурсов из прошлого года сравнивается с этим и происходит изменение в функции размножения. Бывает это редко, и потому полигамия включается редко. И потому мышиного рая 25 не происходит. Но у людей то это встречается часто! Достаточно часто если уж поколение новое живет не в два раза лучше предыдущего, то хотя бы заблуждается, что живет, имеет гордыню, юношенский максимализм, заблуждение, что живет много лучше. И потому включается усиленный половой отбор, а если так делать несколько поколений, то , кроме всего прочего, требования к половому и тем более брачному партнёру растут, как на дрожжах, и вот уже никто тебе не подходит. Популяция вымирает.
И что делать с точки зрения изменения генетического кода? Что нужно менять в особях, что бы не было мышиного рая 25? Чего не хватает? Логгирования? Механизма уведомлений пользователя о том, что он перешёл на другую половую программу, несовместимую в конечном счёте с его размножением?

Кроме того, часто размножение, иерархия и выживание могут мешать друг другу не только через механизм усилиения полигамии при повышении ресурности и защищенности внешней среды...Но и через разные странные пересечения физиологии и генетики.
Например, стимулирование центра боли, а иногда унижения, стимулирует рядом находящийся центр секса. Вроде бы выживание и иерархия не должна приносить боль и унижение! Но садо мазохисты думают иначе...

Показать полностью 2

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

Здравствуйте. Достался по случаю предпусковой подогреватель 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/

Показать полностью 1

Помогите с поиском

На просторах сети попадалось устройство для считывания сигналов от пультов телевизоров, шлагбаумов в общем много функциональное, белый корпус и желтые вставки экранчик монохромный кажется тоже желтый, хотел тестю подарок сделать а нагуглить не могу уже сил нет , уже последняя страница Гугла на горизонте (

Я тут было дело просил помощи в сборе лампы на ардуино

И хотел бы отметить человека, который отозвался помочь. И сделал это не попросив ни копейки. @SergoM спасибо тебе большое!

Я тут было дело  просил помощи в сборе лампы на ардуино Благодарность, Arduino, Лампа, Длиннопост, Скриншот, Комментарии на Пикабу
Я тут было дело  просил помощи в сборе лампы на ардуино Благодарность, Arduino, Лампа, Длиннопост, Скриншот, Комментарии на Пикабу
Я тут было дело  просил помощи в сборе лампы на ардуино Благодарность, Arduino, Лампа, Длиннопост, Скриншот, Комментарии на Пикабу
Показать полностью 3

Продолжение поста про лампу

Тут я писал пост, что хотел сделать лампу по готовому проекту, но все пришло к тому, что плата просто не завелась. перепробовано было многое и кабели и порты и разные версии IDE, CH340, библиотек. Понимаю, что доделывать проект нужно. И у меня пока 2 мысли на этот счет: трудная и мучительная и более халявный подход. Первая, это попробовать заказать плату, но уже другую - NodeMCU. Благо проект поддерживает и ее. Но опять же, как тут угадать в каком состоянии она придет, ибо как я понял, китайцы лепят прошивки в эти платы от балды и там не поймешь как она себя позиционирует. Либо второй вариант, возможно он амбициозный и наглый, но я хотел бы обратиться к вам, пикабушникам-ардуинщикам. Возможно есть из вас кто-то в Кемерово или недалеко от него, и вдруг у вас есть нужная плата. Я бы вас хотел попросить прошить и продать ее мне. Да, я понимаю, это ленивый подход, но если четно у меня после первой попытки руки так и не поднялись. Если же делать по первому варианту, возможно подскажите проверенного продавца на плату Wemos или NodeMCU на ВБ, озоне или в Китае. Спасибо.

Ардуино бред

Кто придумал и реализовал так, чтобы в Ардуино при:


int someInt = 1000;
byte someRandom = random(10,30);
int anotherInt;

anotherInt = floor(someInt * someRandom / 100);


Что в anotherInt может оказаться не что-то из диапазона 100 - 300, а отрицательная величина, тот реально уебан.

Монитор порта для отладки и проверки программного кода

Монитор порта — полезнейший инструмент для отладки и проверки программного кода, а также правильности сборки робота: давайте узнаем подробнее.

Монитор порта для отладки и проверки программного кода Arduino, Электроника, Самоделки, Scratch, Bluetooth, Программирование, Видео, YouTube, Длиннопост

Например, у вас имеется робот Квадропод или Отто, которые содержат ультразвуковой дальномер HC-SR04. С его помощью робот может обнаруживать препятствия перед собой: таким образом датчик расстояния служит аналогом человеческих глаз, причем и внешне тоже очень похож на них.

С помощью монитора порта можно откалибровать обнаружение препятствий на дальномере, если проверить корректность выводимых значений. В программе 1 на прикрепленной картинке показано, как это сделать.

Для открытия монитора порта нужно нажать по иконке (обведена красным цветом сверху на картинке). справа от кнопки загрузки кода в плату.

Аналогично можно проверить работу Bluetooth-модуля (вот несколько видеопримеров с его использованием: Управление квадроподом по Bluetooth через Android (https://www.youtube.com/watch?v=lYFvfYK3s24) и Вывод символов на дисплее, вводимых с телефона (https://www.youtube.com/watch?v=Ubu60nHHPiQ)), чтобы убедиться, что данные с вашего смартфона на контроллер приходят без ошибок (программа 2 на первой картинке).

Показать полностью 1 2

Угадайте звездного капитана юмористической команды «Сборная Красноярска» по описанию одного из участников

Ну что, потренировались? А теперь пора браться за дело всерьез.

Показать полностью

Новогодняя звезда - 180 адресных светодиодов!

Мой долгострой. Проект далек от завершения. Но промежуточные результаты уже не стыдно показать.
Плата моей разработки, заказана у китайцев. 180 диодов ws2812b-mini, wemos d1 mini в качестве контроллера.
Эксперименты с генерацией палитр и нестандартными таблицами мэппинга.

Отличная работа, все прочитано!