Переключение режимов. С программированием очень плохо. Подскажите или поправьте.

b707
Offline
Зарегистрирован: 26.05.2017

rastaman29 пишет:

Забыл еще одно условие: когда маятник отводится до предела, то замыкается на контакт и прибор весело мигает всеми лазерами сигнализируя о том, что маятник превысел предел отклонения. Маятник получается +, замыкается на порт.

я что-то вас перестаю понимать. Сначала были лазеры, потом индикаторные диоды. потом добавился контроль батарейки... теперь еще и маятник?

В итоге я так и не понял - вы код на железе пробовали? Режимы переключаются? Кнопки не залипают? Частота правильная?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это как в анекдоте: дайте водицы испить, а то так кушать хочется, что переночевать негде ))))))

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019
вот правильный loop
[code]
void loop() 
{if(digitalRead(volt_sence))//мигаем если сели батарейки
        {
       digitalWrite(pow_on_led, HIGH);
        }        
  
  if ((micros()-time_r)>=50)
  {
    vibro=!vibro;
    time_r=micros();
    control ();
     if(clk_cnt<=40)
      {
       clk_cnt++;
      }
      else
      {
        clk_cnt=0;
        modul();
        if(indicat<=100)
        {
         indicat++; 
         
           } 
          else{ 
          indicat=0;
          
        if(digitalRead(!volt_sence))
          {
          digitalWrite(pow_on_led,!digitalRead(pow_on_led));        
          }
         }
      
        digitalWrite(modul_on,!modulation);// индицируем модуляцию     
      }
    }
  }
[/code]

 

rastaman29
Offline
Зарегистрирован: 04.04.2021

Конечно попробовал. Кнопки не залипают. Режимы переключаются. Частота ровно 10 кГц со скважностью 50%.
Про лазеры, сигнальные диоды и контроль батарейки- все в шапке писал))). Просто сигнальные диоды у меня как то легко получается добавить самому в код Alexey_rem. А в последнем скетче он сам добавил их.
А про маятник забыл просто. Но это уже ладно. Вы и так помогли круто.

rastaman29
Offline
Зарегистрирован: 04.04.2021

Добавил int indicat=0;

void loop() 
{
  if(digitalRead(volt_sence)) //мигаем если сели батарейки
  {
  digitalWrite(pow_on_led, LOW); // поправил на LOW, диод сигнальный на постоянном +
  }        
  if ((micros()-time_r)>=42) // поменял на 42, так частота 10 кГц, при 50 - частота 8.9 кГц
rastaman29
Offline
Зарегистрирован: 04.04.2021

andriano пишет:

Это как в анекдоте: дайте водицы испить, а то так кушать хочется, что переночевать негде ))))))

Именно так)) Потом руку оторву))

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Отрывать руку дающую себе  дороже

rastaman29
Offline
Зарегистрирован: 04.04.2021

Это поддержать людей, которые так думают, они тоже делают вклад)))

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

 а как лазеры должны включаться? 1->1+2->1+2+3 ?

rastaman29
Offline
Зарегистрирован: 04.04.2021

1>1+2>1+2+3>2+3>1 в идеале

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Попрообуй так:

[code]
void control ()
{
switch (selected)
 {
   case 0:
digitalWrite(lazer_1, vibro||modulation);
  break;
   case 1:
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_1, vibro||modulation);
     break;
       case 2:
digitalWrite(lazer_3, vibro||modulation);
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_1, vibro||modulation);
      break;
     
   case 3:
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_3, vibro||modulation);
  break;
  
 
}
}

[/code]

 

rastaman29
Offline
Зарегистрирован: 04.04.2021

Получилось так 1>1+2>1+2+3>1

rastaman29
Offline
Зарегистрирован: 04.04.2021

Сейчас тестировал sens. Получается при питании 4v, sens начинает мигать при 1.89v. Выставил примерно 2v на sens при пит 4v. А если понижать питание, то видимо смещается и sens, так как даже при питании 3.3v на sens уже почти 1.5v и диод не мигает.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Поставь код который в сообщении была ошибка я ее убрал

rastaman29
Offline
Зарегистрирован: 04.04.2021
int pow_on_led=(3);//св диод питания вставить свою ногу
int volt_sence=(6); //датчик напр  питания вставить свою ногу
int modul_on=(4);//св диод вкл модуляции вставить свою ногу
 
unsigned long time_r;
boolean modulation=true;
boolean vibro=false;
boolean modul_debunc=false;
int modul_cnt=0;
int indicat=0;
boolean select_debunc=false;
boolean sel_pressed=false;
boolean mod_pressed=false;
int select_cnt=0;
int clk_cnt=0;
int selected=0;
int lazer_1=9;
int lazer_2=10;
int lazer_3=11;
int butt_select=2;
int butt_modul=5;
void control ()
{

switch (selected) {
   case 0:
digitalWrite(lazer_1, vibro||modulation);
  break;
   case 1:
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_1, vibro||modulation);
     break;
       case 2:
digitalWrite(lazer_3, vibro||modulation);
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_1, vibro||modulation);
      break;
       case 3:
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_3, vibro||modulation);
      break;
   /*   switch (selected) {
   case 4:
digitalWrite(lazer_1, vibro||modulation);
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_3, vibro||modulation);
 }*/
}
}
 void press_chk()
 {
   if(digitalRead(butt_select))
   {
    sel_pressed=false; 
   }
   if(digitalRead(butt_modul))
   {
    mod_pressed=false; 
   }
 }
 void lazer_selection()
 {
   digitalWrite(lazer_1, LOW);
   digitalWrite(lazer_2, LOW);
   digitalWrite(lazer_3, LOW); 
   if(selected<2)
   {
     selected++;
   }
   else
   {
     selected=0;
   }


 }
void modul()
{
 if(!modul_debunc)
 {
   if(!digitalRead(butt_modul)&&! mod_pressed)
   {
     modul_debunc=true;
      mod_pressed=true;     
     modulation=!modulation;
     }
 } 
 else
 {
   if(modul_cnt<=90)
   {
     modul_cnt++;
   }
   else
   {
     modul_cnt=0;
     modul_debunc=false;
   }
 }
 if(!select_debunc)
 {
   if(!digitalRead(butt_select)&&!sel_pressed)
   {
     select_debunc=true;
     sel_pressed=true;
     lazer_selection();
     
   }
 } 
 else
 {
   if(select_cnt<=90)
   {
     select_cnt++;
   }
   else
   {
     select_cnt=0;
     select_debunc=false;
   }
 }
if(sel_pressed||mod_pressed)
{
 press_chk(); 
}
}

void setup() {
 pinMode(lazer_1,OUTPUT);
 pinMode(lazer_2,OUTPUT);
 pinMode(lazer_3,OUTPUT);
 pinMode(pow_on_led,OUTPUT);
 pinMode(modul_on,OUTPUT);
 pinMode(butt_select,INPUT_PULLUP);
 pinMode(butt_modul,INPUT_PULLUP);
 pinMode(volt_sence,INPUT);
 digitalWrite(pow_on_led, LOW);
 digitalWrite(lazer_1, LOW);
 digitalWrite(lazer_2, LOW);
 digitalWrite(lazer_3, LOW); 



}

void loop() 
{
  if(digitalRead(volt_sence)) //мигаем если сели батарейки
  {
  digitalWrite(pow_on_led, LOW);
  }        
  if ((micros()-time_r)>=42)
  {
    vibro=!vibro;
    time_r=micros();
    control ();
     if(clk_cnt<=40)
      {clk_cnt++;
      }
      else
      {clk_cnt=0;
        modul();
        if(indicat<=100)
        {
         indicat++; 
        } 
          else
        { 
          indicat=0;
          
        if(digitalRead(!volt_sence))
          {
          digitalWrite(pow_on_led,!digitalRead(pow_on_led));        
          }
         }
      
        digitalWrite(modul_on, modulation);// индицируем модуляцию     
      }
    }
  }

 

rastaman29
Offline
Зарегистрирован: 04.04.2021

Со всеми исправлениями.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

 Контроллер питается прямо от батарейки или через какой-то стабилизатор,?Думаю при понижении питания смещается и уровень лог единицы очевидно схема со стабилитроном поможет

rastaman29
Offline
Зарегистрирован: 04.04.2021

Контроллер питается напрямую от батарейки. Стабилитрон найду ща.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

и еще в строке 66:

 if(selected<3)//

вместо



 if(selected<2)//

rastaman29
Offline
Зарегистрирован: 04.04.2021

Все чётко переключается. 

Стабилитрона нет пока. На плате стоит похоже такой делитель: диод и резюк 1кОм, на нем от 4v - 0.650v до 3.3v - 0.640v примерно было. Какой то маленький диапазон для измерения)

b707
Offline
Зарегистрирован: 26.05.2017

rastaman29 пишет:

Сейчас тестировал sens. Получается при питании 4v, sens начинает мигать при 1.89v. Выставил примерно 2v на sens при пит 4v. А если понижать питание, то видимо смещается и sens, так как даже при питании 3.3v на sens уже почти 1.5v и диод не мигает.

rastaman29 - По умолчанию analogRead()  в ардуино измеряет ОТНОСИТЕЛЬНО ПИТАНИЯ, поэтому просто так измерить им VCC той ардуиной, что сама от него питается - нельзя, будет всегда примерно максимум ADC

Для этого используется другая схема - на контроллере есть референсный уровень 1.1в.  С помощью analogRead() измеряют этот референс относительно питания - и зная что он 1.1в - пересчитывают напряжение VCC.

Ищите код поиском по запросу "измерение напряжения питания ардуино"

 

rastaman29
Offline
Зарегистрирован: 04.04.2021

Спасибо. Почитаю.

mifar
Offline
Зарегистрирован: 07.04.2021

b707 пишет:

rastaman29 - По умолчанию analogRead()  в ардуино измеряет ОТНОСИТЕЛЬНО ПИТАНИЯ, поэтому просто так измерить им VCC той ардуиной, что сама от него питается - нельзя, будет всегда примерно максимум ADC

Так а где вы видели в коде analogRead? Они пытаются измерять напряжение с помощью digitalRead

if(digitalRead(volt_sence)) //мигаем если сели батарейки

 

rastaman29
Offline
Зарегистрирован: 04.04.2021

Сегодня не получится поэкспериментировать. Забыл на работе всё.

b707
Offline
Зарегистрирован: 26.05.2017

mifar пишет:

Они пытаются измерять напряжение с помощью digitalRead

Простите, не заметил.

тогда без меня

rastaman29
Offline
Зарегистрирован: 04.04.2021

А как без ошибок)

rastaman29
Offline
Зарегистрирован: 04.04.2021
[code]
#include <MsTimer2.h>

#define MEASURE_PERIOD 500  // время периода измерения
#define R1  1.  // сопротивление резистора R1
#define R2  20. // сопротивление резистора R2

uint16_t raw_bandgap = 0;      // значение внутреннего bandgap
float volt_battery = 0.0;

int pow_on_led=(3);//св диод питания вставить свою ногу
int volt_sence=(A0); //датчик напр  питания вставить свою ногу
int inputCod; //код входного напряжения
float inputVoltage; //входное напряжение в В
int modul_on=(4);//св диод вкл модуляции вставить свою ногу
int timeCount;  // счетчик времени
float u1, u2;   // измеренные напряжения
 
unsigned long time_r;
boolean modulation=true;
boolean vibro=false;
boolean modul_debunc=false;
int modul_cnt=0;
int indicat=0;
boolean select_debunc=false;
boolean sel_pressed=false;
boolean mod_pressed=false;
int select_cnt=0;
int clk_cnt=0;
int selected=0;
int lazer_1=9;
int lazer_2=10;
int lazer_3=11;
int butt_select=2;
int butt_modul=5;
void control ()
{

switch (selected) {
   case 0:
digitalWrite(lazer_1, vibro||modulation);
  break;
   case 1:
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_1, vibro||modulation);
     break;
       case 2:
digitalWrite(lazer_3, vibro||modulation);
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_1, vibro||modulation);
      break;
       case 3:
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_3, vibro||modulation);
      break;
   /*   switch (selected) {
   case 4:
digitalWrite(lazer_1, vibro||modulation);
digitalWrite(lazer_2, vibro||modulation);
digitalWrite(lazer_3, vibro||modulation);
 }*/
}
}
 void press_chk()
 {
   if(digitalRead(butt_select))
   {
    sel_pressed=false; 
   }
   if(digitalRead(butt_modul))
   {
    mod_pressed=false; 
   }
 }
 void lazer_selection()
 {
   digitalWrite(lazer_1, LOW);
   digitalWrite(lazer_2, LOW);
   digitalWrite(lazer_3, LOW); 
   if(selected<3)
   {
     selected++;
   }
   else
   {
     selected=0;
   }


 }
void modul()
{
 if(!modul_debunc)
 {
   if(!digitalRead(butt_modul)&&! mod_pressed)
   {
     modul_debunc=true;
      mod_pressed=true;     
     modulation=!modulation;
     }
 } 
 else
 {
   if(modul_cnt<=90)
   {
     modul_cnt++;
   }
   else
   {
     modul_cnt=0;
     modul_debunc=false;
   }
 }
 if(!select_debunc)
 {
   if(!digitalRead(butt_select)&&!sel_pressed)
   {
     select_debunc=true;
     sel_pressed=true;
     lazer_selection();
     
   }
 } 
 else
 {
   if(select_cnt<=90)
   {
     select_cnt++;
   }
   else
   {
     select_cnt=0;
     select_debunc=false;
   }
 }
if(sel_pressed||mod_pressed)
{
 press_chk(); 
}
}

  void  timerInterupt() {
  timeCount++;
}

void setup() {
 pinMode(lazer_1,OUTPUT);
 pinMode(lazer_2,OUTPUT);
 pinMode(lazer_3,OUTPUT);
 pinMode(pow_on_led,OUTPUT);
 pinMode(modul_on,OUTPUT);
 pinMode(butt_select,INPUT_PULLUP);
 pinMode(butt_modul,INPUT_PULLUP);
 pinMode(volt_sence,INPUT);
 digitalWrite(pow_on_led, LOW);
 digitalWrite(lazer_1, LOW);
 digitalWrite(lazer_2, LOW);
 digitalWrite(lazer_3, LOW); 
 MsTimer2::set(1, timerInterupt); // прерывания по таймеру, период 1 мс
 MsTimer2::start();              // разрешение прерывания
 analogReference(INTERNAL);
 Serial.begin(115200); 



}

void loop() 
{
  if ( timeCount >= MEASURE_PERIOD ) {
    timeCount= 0;
    u1=  ((float)analogRead(volt_sence)) * 1.1 / 1024. / R2 * (R1 + R2);
    Serial.print("U1 = ");     Serial.print(u1, 2);
    Serial.print("   U2 = ");  Serial.println(u2, 2);    
  }
  

  //if(analogRead(volt_sence)) //мигаем если сели батарейки
  if(u1 >= 0.68)
  {
  digitalWrite(pow_on_led, LOW);
  }        
  if ((micros()-time_r)>=42)
  {
    vibro=!vibro;
    time_r=micros();
    control ();
     if(clk_cnt<=40)
      {clk_cnt++;
      }
      else
      {clk_cnt=0;
        modul();
        if(indicat<=100)
        {
         indicat++; 
        } 
          else
        { 
          indicat=0;
         // inputCod= analogRead(volt_sence); // чтение напряжения на входе A0
          //inputVoltage= ( (float)inputCod * 5. / 1024. ); // пересчет кода в напряжение (В)
          
        if(u1 <= 0.68)
          {
          //Serial.print(inputVoltage);
          digitalWrite(pow_on_led,!digitalRead(pow_on_led));        
          }
         }
      
        digitalWrite(modul_on, modulation);// индицируем модуляцию     
      }
    }
  }
[/code]

Вроде получилось заставить мигать диод при падении питания 3.5v и ниже.

rastaman29
Offline
Зарегистрирован: 04.04.2021

Только если включить импульсный режим, сигнальный светодиод разряда начинаем мигать с разным интервалом) и мигает даже при питании 3.6V изредка. И стабильно начинает мигать при снижении питания до 3.2v. Так же снизилась частота имп.режима и стабильно 10 кГц не делается.

rastaman29
Offline
Зарегистрирован: 04.04.2021

Спасибо b707 за наводку.

b707
Offline
Зарегистрирован: 26.05.2017

rastaman29 пишет:

Так же снизилась частота имп.режима и стабильно 10 кГц не делается.

потому что идея генератора за счет быстрых оборотов ЛУП работает только на относительно низких частотах. Чем больше вы наталкиваете в ЛУП дополнительных строчек - тем медленее он у вас крутится

Делайте на таймере, как в моем коде - получите точно 10кГц и от числа строчек в ЛУП зависеть не будет

 

rastaman29
Offline
Зарегистрирован: 04.04.2021

Попробую Ваш код. Но у вас сложнее разобраться.