помогите дописать скетч

murash20
Offline
Зарегистрирован: 21.03.2016

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

#define FIRST_LED 4
#define TOTAL_LEDS 10
 
int ledPin = FIRST_LED;
 
void setup() 
{
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(12, OUTPUT);
    pinMode(13, OUTPUT);
    
}
 
void loop() 
{
   digitalWrite(ledPin, HIGH);
   delay(100);
   
   ledPin = (ledPin - FIRST_LED +1) % TOTAL_LEDS + FIRST_LED;
   
   digitalWrite(ledPin, LOW);// поочередно включаем светодиоды, а когда шкала заполнилась вся - гасим:
 
}
Sindbad
Offline
Зарегистрирован: 08.12.2015

murash20 пишет:
пока есть сигнал на шим входе.

Про ШИМ ведь где-то прочитали? Либо читайте еще раз, пока не разберетесь. Либо предъявите всем источник в котором говорится о сигнале ШИМ на входе. Пока не понятно, что именно Вы хотите сделать.

И с этим материалом ознакомьтесть http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

kulon
Offline
Зарегистрирован: 02.03.2016

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

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

выдернул часть из найденых скетчей, считает нормально, не могу понять cnt++ когда значение меняет? по переднему фронту импульса или когда он закончен?

  static long cnt1 = 0;
  static int in1_last = HIGH;
  static long time_last = 0;
  int in1 = digitalRead(IN1);
  long ct = micros();
  if (in1 == HIGH && in1_last ==LOW) {
   cnt1++;
   time_last = ct;

 

SiMuS
Offline
Зарегистрирован: 31.10.2011

После выполнения условия in1 == HIGH && in1_last ==LOW

kulon
Offline
Зарегистрирован: 02.03.2016

а на человеческом языке?

просто in1 вижу считывает состояние IN1, а in_last когда Low? (т.е. я понимаю перевод слова last, но думаю ничего неизменится если написать next)

okta
Offline
Зарегистрирован: 10.01.2015

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

SiMuS
Offline
Зарегистрирован: 31.10.2011

в данном куске кода in_last у вас не меняется тк прописан константой static int in1_last = HIGH;

kulon
Offline
Зарегистрирован: 02.03.2016

там вроде больше ничего относящегося к изменению cnt нету

#define IN1 2
#define IN2 5

void setup()
{
  pinMode(IN1, INPUT_PULLUP);
  pinMode(IN2, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Hello!");
}

void loop()
{
  static long cnt1 = 0;
  static long cnt2 = 0;
  static int in1_last = HIGH;
  static int in2_last = HIGH;
  static long time_last = 0;

  int in1 = digitalRead(IN1);
  int in2 = digitalRead(IN2);

  long ct = micros();

  if (in1 == HIGH && in1_last ==LOW) {
    cnt1++;
    time_last = ct;
  }

  if (in2 == HIGH && in2_last ==LOW) {
    cnt2++;
    time_last = ct;
  }

  if (ct - time_last > 500000 && (cnt1 || cnt2)) {
    Serial.println(" --- ");
    Serial.println(cnt1);
    Serial.println(cnt2);
    cnt1 = 0;
    cnt2 = 0;
  }

  in1_last = in1;
  in2_last = in2;
}

 

kulon
Offline
Зарегистрирован: 02.03.2016

все, понял, в конце заметил, т.е. передний фронт импульса

SiMuS
Offline
Зарегистрирован: 31.10.2011

а цель то какая? поочередно лампочками мигать?

kulon
Offline
Зарегистрирован: 02.03.2016

не, по подсчету импульсов выполнять действия уже в другом скетче,

надо было понять в какой момент cnt1 станет например 100, и понять во втором канале в данный момент еще идет импульс или нет (два канала со сдвигом 90 градусов)

спасибо за быстрые ответы

okta
Offline
Зарегистрирован: 10.01.2015

kulon пишет:

все, понял, в конце заметил, т.е. передний фронт импульса

Это зависит от того, что вы импульсом считать будете :)

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

kulon пишет:

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

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

выдернул часть из найденых скетчей, считает нормально, не могу понять cnt++ когда значение меняет? по переднему фронту импульса или когда он закончен?

  static long cnt1 = 0;
  static int in1_last = HIGH;
  static long time_last = 0;
  int in1 = digitalRead(IN1);
  long ct = micros();
  if (in1 == HIGH && in1_last ==LOW) {
   cnt1++;
   time_last = ct;

Вот же условие: (in1 == HIGH && in1_last ==LOW) : когда сигнал HIGH,  а до этого был LOW - передний фронт.

avo74i2
Offline
Зарегистрирован: 25.03.2016

это случайно не светодиодный тахометр будет?) я задался целью сделать такой на мотоцикл)

SiMuS
Offline
Зарегистрирован: 31.10.2011

с тахомтером все проще намного

murash20
Offline
Зарегистрирован: 21.03.2016

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