Помогите разобраться с кодом

kin

✩✩✩✩✩✩✩
14 Окт 2018
6
1
Привет, меня зовут Илья, я самоучка радиогубитель, фанат AlexGyvera, пришел сюда за помощью. Нашел у одного румынского самодельщика схемку автоматического (по напряжению в борт сети) управления ДХО (дневными ходовыми огнями) это для авто. Так вот, собрал прошил по его коду, но у меня работает не корректно, не реагирует на напряжение... Номиналы как на схеме. С кнопки яркость регулируется. На делителе 10к/2,2к около 3вольт
drl-attiny85_schema_rev2.jpg
C++:
// program scris de Nicu FLORICA (niq_ro)
// DRL testat de Liviu HINOVEANU

int brightnessPin = 1;
int BatPin = A3;
int FscPin = A2;
int ButtonPin = 2;
int UBat = 0;     
int UFsc = 0;
int brightness = 0;
int brightup = 51;
int ButtonState = 1;
unsigned long timp = 0;
unsigned long debounce = 100;       
float KUBat = 4.95/5.;
float KUFsc = 4.95/5.;
int Uprag1 = 417/KUFsc; // U faza scurta 12,0 V
int Uprag2 = 446/KUBat; // U bat 12,8 V FOLOSITA LA FADE
int Uprag3 = 458/KUBat; // U bat 13,1 V

byte motorpornit = 0;
byte fazascurta = 0;

void setup()
{
pinMode(1, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
}

void loop()
{
UBat = analogRead(BatPin);  // citire tensiune baterie
UFsc  = analogRead(FscPin); // citire tensiune faza scurta
//analogWrite(1, brightness);  // aprindere becuri FL la anumit procent (variabila)
ButtonState = digitalRead(ButtonPin);  // citire stare buton

if (UBat > Uprag3)  // daca a pornit motorul si alternatorul incarca
{
  motorpornit = 1;
}

if (UFsc < Uprag1)  // daca faza scurta e stinsa
{
  fazascurta = 0;
}
else fazascurta = 1;

if (fazascurta == 0)
{
if ((ButtonState == 0) && (millis() - timp > debounce) && (UBat > Uprag3)) // daca se apasa butonul si tensiunea bateriei e mai mare de 13,1V si faza scurta e stinsa
{
brightness = brightness + brightup;  // creste variabila
if (brightness  > 254 )  // daca variabila e maxim o face 0
{
brightness = 0;
}
timp = millis(); // se memoreaza timpul apasarii
} // aici se termina partea de modificare variabila

if (motorpornit == 1)   // daca tensiunea pe baterie mai mare de 13,1V si faza scurta stinsa
{
analogWrite(1, brightness);  // se comanda becul prin PWM
}
}

if ((motorpornit == 1) && (fazascurta == 1))  // daca tensiunea pe baterie e mai mare de 13,1V si pozitia aprinsa
{
analogWrite(1, 0);   // stinge luminile comandate pwm           
}

if ((UBat < Uprag2) && (motorpornit == 1))  // daca tensiunea pe baterie scade sub 12,4V si motorul este sau a fost pornit anterior
{ 
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5)   // stinge lent becurile
{

analogWrite(1, fadeValue);
delay(15);
}
motorpornit = 0;  // considera ca motorul e oprit
}

delay(10);  // pauza mica
}
Оригинал статьи
 
Изменено:

dimonSha

✩✩✩✩✩✩✩
25 Окт 2019
64
9
Украина, Харьков.
Привет, меня зовут Илья, я самоучка радиогубитель, фанат AlexGyvera, пришел сюда за помощью. Нашел у одного румынского самодельщика схемку автоматического (по напряжению в борт сети) управления ДХО (дневными ходовыми огнями) это для авто. Так вот, собрал прошил по его коду, но у меня работает не корректно, не реагирует на напряжение... Номиналы как на схеме. С кнопки яркость регулируется. На делителе 10к/2,2к около 3вольт
Посмотреть вложение 6720
C++:
// program scris de Nicu FLORICA (niq_ro)
// DRL testat de Liviu HINOVEANU

int brightnessPin = 1;
int BatPin = A3;
int FscPin = A2;
int ButtonPin = 2;
int UBat = 0;    
int UFsc = 0;
int brightness = 0;
int brightup = 51;
int ButtonState = 1;
unsigned long timp = 0;
unsigned long debounce = 100;      
float KUBat = 4.95/5.;
float KUFsc = 4.95/5.;
int Uprag1 = 417/KUFsc; // U faza scurta 12,0 V
int Uprag2 = 446/KUBat; // U bat 12,8 V FOLOSITA LA FADE
int Uprag3 = 458/KUBat; // U bat 13,1 V

byte motorpornit = 0;
byte fazascurta = 0;

void setup()
{
pinMode(1, OUTPUT);
pinMode(2, INPUT_PULLUP);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
}

void loop()
{
UBat = analogRead(BatPin);  // citire tensiune baterie
UFsc  = analogRead(FscPin); // citire tensiune faza scurta
//analogWrite(1, brightness);  // aprindere becuri FL la anumit procent (variabila)
ButtonState = digitalRead(ButtonPin);  // citire stare buton

if (UBat > Uprag3)  // daca a pornit motorul si alternatorul incarca
{
  motorpornit = 1;
}

if (UFsc < Uprag1)  // daca faza scurta e stinsa
{
  fazascurta = 0;
}
else fazascurta = 1;

if (fazascurta == 0)
{
if ((ButtonState == 0) && (millis() - timp > debounce) && (UBat > Uprag3)) // daca se apasa butonul si tensiunea bateriei e mai mare de 13,1V si faza scurta e stinsa
{
brightness = brightness + brightup;  // creste variabila
if (brightness  > 254 )  // daca variabila e maxim o face 0
{
brightness = 0;
}
timp = millis(); // se memoreaza timpul apasarii
} // aici se termina partea de modificare variabila

if (motorpornit == 1)   // daca tensiunea pe baterie mai mare de 13,1V si faza scurta stinsa
{
analogWrite(1, brightness);  // se comanda becul prin PWM
}
}

if ((motorpornit == 1) && (fazascurta == 1))  // daca tensiunea pe baterie e mai mare de 13,1V si pozitia aprinsa
{
analogWrite(1, 0);   // stinge luminile comandate pwm          
}

if ((UBat < Uprag2) && (motorpornit == 1))  // daca tensiunea pe baterie scade sub 12,4V si motorul este sau a fost pornit anterior
{
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5)   // stinge lent becurile
{

analogWrite(1, fadeValue);
delay(15);
}
motorpornit = 0;  // considera ca motorul e oprit
}

delay(10);  // pauza mica
}
Оригинал статьи
Т.е. 3в приходят на мк? Дело в том что не сложная приблуда, смотри схему не напутал ли вывода?
 

kin

✩✩✩✩✩✩✩
14 Окт 2018
6
1
1576525458349.png
при изменении напряжения с 12 до 15в
мне непонятен кусок кода
C++:
float KUBat = 4.95/5.;
float KUFsc = 4.95/5.;
int Uprag1 = 417/KUFsc; // U faza scurta 12,0 V
int Uprag2 = 446/KUBat; // U bat 12,8 V FOLOSITA LA FADE
int Uprag3 = 458/KUBat; // U bat 13,1 V
обычно в скетче прописывают номиналы делителя, либо коэффициент и напряжение питания мк
вывода вроде не попутал, второй делитель работает как надо - вырубает при подачи на него "+"
попробую поменять местами в скетче вывода
 
Изменено:

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
Все дело в точности самих сопротивлений в делителе, возможно Вы поставили резисторы с допуском 10% и напряжении немного завышено, при указных по схеме номиналах делителя при 12 вольт питания на делителе должно быть примерно 2.1, при 15 В - 2.7 В. Попробуйте подстроечный например много оборотный вместо двух резисторов и замеряйте при каком напряжении схема будет отрабатывать уменьшение питающего напряжения после подберите делитель.
 

kin

✩✩✩✩✩✩✩
14 Окт 2018
6
1
Все дело в точности самих сопротивлений в делителе, возможно Вы поставили резисторы с допуском 10% и напряжении немного завышено, при указных по схеме номиналах делителя при 12 вольт питания на делителе должно быть примерно 2.1, при 15 В - 2.7 В. Попробуйте подстроечный например много оборотный вместо двух резисторов и замеряйте при каком напряжении схема будет отрабатывать уменьшение питающего напряжения после подберите делитель.
в скетче поправить проще же) вот ардуинщика по-опытнее себя ищу)
а и кстати в attiny13 этот код можно залить?
 
Изменено:

Marik

✩✩✩✩✩✩✩
11 Ноя 2019
29
4
int Uprag2 = 446/KUBat; // U bat 12,8 V FOLOSITA LA FADE
int Uprag3 = 458/KUBat; // U bat 13,1 V
Вот в этих двух переменных хранят значения с которым сравнивается АЦП измерения напряжение с батареи и делается вывод заведен ли двигатель или нет (как светить ДХО), так как у тебя завышено напряжение на делители эти переменные должны быть больше, на сколько? зависит от твоего реального делителя, да и у автора мне тоже не понятно в каких "попугаях" он измеряет напряжение и зачем тут так много используется делений, можете выводить в сереал порт значение измерения АЦП переменная UBat и изменять питающее напряжение, и так определиться с этими значениями, математически рассчитать очень сложно тем более там еще в делителе диод стоит ну и эти не понятные "попугаи".
 

kin

✩✩✩✩✩✩✩
14 Окт 2018
6
1
int Uprag2 = 446/KUBat; // U bat 12,8 V FOLOSITA LA FADE
int Uprag3 = 458/KUBat; // U bat 13,1 V
Вот в этих двух переменных хранят значения с которым сравнивается АЦП измерения напряжение с батареи и делается вывод заведен ли двигатель или нет (как светить ДХО), так как у тебя завышено напряжение на делители эти переменные должны быть больше, на сколько? зависит от твоего реального делителя, да и у автора мне тоже не понятно в каких "попугаях" он измеряет напряжение и зачем тут так много используется делений, можете выводить в сереал порт значение измерения АЦП переменная UBat и изменять питающее напряжение, и так определиться с этими значениями, математически рассчитать очень сложно тем более там еще в делителе диод стоит ну и эти не понятные "попугаи".
ну по сути я и сам это понял, ладно попробую многооборотный 10к-50к покрутить, спасибо ребят