Прошу помощи.

RAMBOTRON
Offline
Зарегистрирован: 01.10.2016

Доброго времени суток, в програмировании я 0 поэтому прошу помощи у знатоков. Задача давольно простая:

1. На ардуино подаётся питание и начинается отщёт времени это будет 10 минут

2. Спустя 10 минут на электроды (их 4 штуки) подключеные к 3.3 вольтам и 13 пину например, должен подоватся слабый ток с частотой 40 герц продолжительностью 5 минут

3. и так по кругу.

Быть может кто-нибудь скинет скетч годный? Очень прошу!

Green
Offline
Зарегистрирован: 01.10.2015
#define OUT_PIN   13
#define OFF_MS    10 * 60 * 1000L
#define ON_MS     5 * 60 * 1000L
#define HZ        40
#define T_US      1000000L / HZ


void setup() {
  digitalWrite(OUT_PIN, HIGH);
  pinMode(OUT_PIN, OUTPUT);
}

void loop() {
  delay(OFF_MS);
  for (uint32_t i = 0; i < ON_MS * 1000 / T_US * 2; i++) {
    delayMicroseconds(T_US / 2);
    digitalWrite(OUT_PIN, !digitalRead(OUT_PIN));
  }
}

 

RAMBOTRON
Offline
Зарегистрирован: 01.10.2016
#define OUT_PIN   13
#define OFF_MS    10 * 60 * 1000L
#define ON_MS     5 * 60 * 1000L
#define HZ        40
#define T_US      1000000L / HZ
 я так понял это и есть пораметры? Что именно я должен изменить чтобы было другое время включения или частота герц?
Green
Offline
Зарегистрирован: 01.10.2015
Onkel
Offline
Зарегистрирован: 22.02.2016

RAMBOTRON пишет:

 

 я так понял это и есть пораметры? Что именно я должен изменить чтобы было другое время включения или частота герц?

#define OUT_PIN   13
#define OFF_MS    10 * 60 * 1000L  //- тут 10 - время в минутах
#define ON_MS     5 * 60 * 1000L  //- тут 5 - время в минутах
#define HZ        40       // 40 - частота в Герцах
#define T_US      1000000L / HZ
 
впрочем, это не говорит ничего о правильности кода, предложенного green. У него использованы тормозные чисто ардуиновские функции digitalWrite() и , кроме того,  счетчик микросекунд, использованный в delay,  считает не микросекунды, а кратные 4 мкс значения. Так что результат будет кривым.  Если вам нужен нормальный код на честном С, без тормозов и костылей -обращайтесь ydom@mail.ru . Могу сделать с нормальным кодом, могу с индикатором частоты. Кстати, частота у вас - меандр, не синус? А то я могу и синус по 256 (примерно) точкам сделать, не только меандр.
 
Green
Offline
Зарегистрирован: 01.10.2015

Надеюсь всё будет на "честном Си"?))

RAMBOTRON
Offline
Зарегистрирован: 01.10.2016

странно светодиод постоянно горит не выключаясь

Onkel
Offline
Зарегистрирован: 22.02.2016

RAMBOTRON пишет:

странно светодиод постоянно горит не выключаясь

зато бесплатно.

RAMBOTRON
Offline
Зарегистрирован: 01.10.2016

А можно бесплатно и чтоб работало? =)

Green
Offline
Зарегистрирован: 01.10.2015

RAMBOTRON пишет:

А можно бесплатно и чтоб работало? =)

В другой форум.

RAMBOTRON
Offline
Зарегистрирован: 01.10.2016

да вы тут сговорились)))

JasKo
Offline
Зарегистрирован: 21.11.2015

RAMBOTRON пишет:

странно светодиод постоянно горит не выключаясь

Дествительно странно, ведь лампочка на 50 герцах не постоянно горит. :)

Вы пчела, что бы увидеть мерцание 40 гц?

;))

Green
Offline
Зарегистрирован: 01.10.2015

RAMBOTRON пишет:

да вы тут сговорились)))

Ни тебе спасибо, ни тебе чего... От народ! Быдло.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

RAMBOTRON пишет:

да вы тут сговорились)))

Онкель бесплатно делает, дарит бескостыльное оборудование и три фонтана в придачу.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

RAMBOTRON

unsigned long ts_duty,ts_idle;                    // timestamp
bool ena_duty=0;                                  // flag

void setup(){
  ts_idle=millis();
  DDRB|=B00100000;                                // D13
}

void loop(){
  if(!ena_duty && millis()-ts_idle>=600000){      // 10 min
    ts_idle=millis();
    ts_duty=micros();
    ena_duty=1;
  }
  if(ena_duty && millis()-ts_idle>=300000){       // 5 min
    ts_idle=millis();
    ena_duty=0;
  }
  if(ena_duty){
    if(micros()-ts_duty>=25000){                  // 40 hz
      PORTB^=B00100000;
      ts_duty=micros();
    }
  }else PORTB&=B11011111;                         // off
}

500 денег достаточно, ЯД 410011919696337.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Voodoo Doll пишет:

RAMBOTRON

unsigned long ts_duty,ts_idle;                    // timestamp
bool ena_duty=0;                                  // flag

void setup(){
  ts_idle=millis();
  DDRB|=B00100000;                                // D13
}

void loop(){
  if(!ena_duty && millis()-ts_idle>=600000){      // 10 min
    ts_idle=millis();
    ts_duty=micros();
    ena_duty=1;
  }
  if(ena_duty && millis()-ts_idle>=300000){       // 5 min
    ts_idle=millis();
    ena_duty=0;
  }
  if(ena_duty){
    if(micros()-ts_duty>=25000){                  // 40 hz
      PORTB^=B00100000;
      ts_duty=micros();
    }
  }else PORTB&=B11011111;                         // off
}

500 денег достаточно, ЯД 410011919696337.

где-то в Усть-Зажопинске пересох фонтан.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Voodoo Doll пишет:

RAMBOTRON

unsigned long ts_duty,ts_idle;                    // timestamp
bool ena_duty=0;                                  // flag

void setup(){
  ts_idle=millis();
  DDRB|=B00100000;                                // D13
}

void loop(){
  if(!ena_duty && millis()-ts_idle>=600000){      // 10 min
    ts_idle=millis();
    ts_duty=micros();
    ena_duty=1;
  }
  if(ena_duty && millis()-ts_idle>=300000){       // 5 min
    ts_idle=millis();
    ena_duty=0;
  }
  if(ena_duty){
    if(micros()-ts_duty>=25000){                  // 40 hz
      PORTB^=B00100000;
      ts_duty=micros();
    }
  }else PORTB&=B11011111;                         // off
}

500 денег достаточно, ЯД 410011919696337.

 

Это же нихрена ни разу не чистый си !!! Как можно !? А онкель знает !? Кошмар !!!!

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Аще индифферентно, nigger's problems don't fuck sheriff. Афтар знал куда зашёл, реализация есть? - есть. Оплата теперь на его совести.

RAMBOTRON
Offline
Зарегистрирован: 01.10.2016

 Всем большое спасибо, Voodoo Doll от души! За мной не заржавеет. Только вот на 13 пине те 10 минут  

if(!ena_duty && millis()-ts_idle>=600000){      // 10 min
11     ts_idle=millis();
12     ts_duty=micros();
13

    ena_duty=1;

есть напряжение, а его быть не должно. Тоесть только стробоскоп 5 минут 40 герц а потом тишина 10 мин а потом сново строб и т.д

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Инверсная логика чтоли? Тогда в строке 24 поменять PORTB&=B11011111 на PORTB|=B00100000

MacSim
Offline
Зарегистрирован: 28.11.2012

 немного шутим над ТС :-)?

RAMBOTRON пишет:

 может кто-нибудь скинет скетч годный?

почитай, разберешся.

http://arduino.ru/Reference/Delay

http://arduino.ru/Reference/Tone