attachInterrupt не работает скетч

gorauralsk
Offline
Зарегистрирован: 26.04.2018

Чтобы протестировать датчик радиации отсюда http://geektimes.com/post/281618/ взят код

int pocet;                            // переменная для подсчета частиц
unsigned long time;                   //   время наблюдения

void setup() {
  pinMode(2, INPUT);                  // pin 2  вход от счетчика Гейгера
  attachInterrupt(0, nacti, RISING);  // настройка прерывания
  Serial.begin(9600);                 // настройка скорости передачи данных по последовательному интерфейсу
  Serial.println(" ");                // Новая строка при ресете
}

void nacti() {
  pocet = pocet++;                    // обработка int0
}

void loop() {
  pocet = 0;                          // новое измерение
  time = millis() + 60000;            // время конца измерения
  while (time > millis()) {}          //  ожидание 1 минуту
  if (pocet < 10) Serial.print(" ");  // форматировать согласно количества цифр
  if (pocet < 100) Serial.print(" ");
  if (pocet < 1000) Serial.print(" ");
  Serial.print(pocet);                // написать количество распадов/мин
  Serial.print(" ");
  for (int i = 0; i < pocet; i++) {   // графический вывод
    Serial.print("#");
  }
  Serial.println(" ");                // окончание строки
}

Результат его рабоыт отраженный в системном мониторе должен быть таким:

 

Подаю руками 5 в на 2 пин несколько раз. Серийный монитор показывает нули. Как мне добиться такого же результата как в оригинале? Если у кого получится, поделитесь в чем секрет. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

volatile int pocet;

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Строка 12:

оставьте только 

pocet++;

зачем этот цирк с конями?

Строки 17-18:

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

Насчёт Вашего заявления, что 

gorauralsk пишет:

Результат его рабоыт отраженный в системном мониторе должен быть таким:

позволю себе усомниться.

1) где на картинке пробелы, печатаемые в строке №19?
2) в строке №23 печатается один пробел. На картинке же их явно больше.

gorauralsk
Offline
Зарегистрирован: 26.04.2018

Оно может и правильно. Но серийный монитор по прежнему показывает нули и не реагирует на смену напряжения на 2 пине.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А свежий код, после правок, Вы не хотите показать? Или Вы предлагает нам сами догадываться что и как Вы поправили?

gorauralsk
Offline
Зарегистрирован: 26.04.2018

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

Нашел вот такой счетчик. Может, кому пригодится.

#include <SPI.h>

#define LOG_PERIOD 15000     //Logging period in milliseconds, recommended value 15000-60000.

#define MAX_PERIOD 60000    //Maximum logging period

unsigned long counts;             //variable for GM Tube events

unsigned long cpm;                 //variable for CPM

unsigned int multiplier;             //variable for calculation CPM in this sketch

unsigned long previousMillis;      //variable for time measurement

 

void tube_impulse(){               //procedure for capturing events from Geiger Kit

  counts++;

}


void setup(){                                               //setup procedure

  counts = 0;

  cpm = 0;

  multiplier = MAX_PERIOD / LOG_PERIOD;      //calculating multiplier, depend on your log period

  Serial.begin(9600);                                    // start serial monitor

 // uncommennt if you have time-out problem to connect with Radiation Logger
 //  delay(2000);
 //  Serial.write('0');                                      // sending zero to avoid connection time out with radiation logger
 //  delay(2000);
 //  Serial.write('0');                                     // sending zero to avoid connection time out with radiation logger

  pinMode(2, INPUT);                                   // set pin INT0 input for capturing GM Tube events

  digitalWrite(2, HIGH);                                 // turn on internal pullup resistors, solder C-INT on the PCB

  attachInterrupt(0, tube_impulse, FALLING);  //define external interrupts

}

 

void loop(){                                               //main cycle

  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > LOG_PERIOD){

    previousMillis = currentMillis;

    cpm = counts * multiplier;

        Serial.print(cpm);                              // send cpm data to Radiation Logger

        Serial.write(' ');                                // send null character to separate next data

    counts = 0;

  }

}

Проверил руками, потом подключил прибор, кажисть работает. Правда распадов не так много фиксирует как в статье показано. Но, повторюсь, код там не рабочий.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

И увеличивает ошибку прибора примерно в 4 раза .. :)

a5021
Offline
Зарегистрирован: 07.07.2013

gorauralsk пишет:
Показатели монитора из другого скетча. Удивительно как много народу откоментировало эту статью и все явно специалисты. А то, что код не рабочий никто не заметил.

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

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не, это Вы "не читатель". Автор совершенно честно сказал что первый код он стырил в одном месте, а второй в ином. Это ваще ни разу не ЕГО код .. :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gorauralsk пишет:

кажисть работает

Вы пост #1 видели? Или человек его зря писал?

gorauralsk пишет:

Может, кому пригодится.

Кому модет пригодится толком неработающий кусок кода? Только Вам или такому же как Вы.

 

gorauralsk
Offline
Зарегистрирован: 26.04.2018

Я так понимаю вы с помощью хамства сайт продвигаете. И с чего вы взяли что, это толком неработающий кусок кода? Код работает и назначение свое выполняет. А таким трололо вы только людей в заблуждение вводите. И ценность форума понижаете. Пока. 

gorauralsk
Offline
Зарегистрирован: 26.04.2018

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gorauralsk пишет:

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

да, просто, посмотрели на код и взяли.

gorauralsk пишет:

Код работает и назначение свое выполняет. 

Тут спорить не буду, ибо хрен его знает, каково его назначение.