Проблема с получением данных на esp32 для счетчика гейгера - PullRequest
1 голос
/ 10 июля 2020

Я купил те же платы, которые использовались в этом видео на Youtube (компоненты - ЭТО счетчик Гейгера (я почти уверен, что он работает, тики на спекере совпадают) и ЭТО esp (я не знаю, здесь ли проблема или в коде), я загрузил код arduino в плату esp32, но дисплей по-прежнему застревает на «Измерение». Он правильно подключается к канал ThingSpeak, но измерения всегда линейно увеличиваются. Число постоянно растет (см. прикрепленное изображение). Я попытался вставить некоторые currentMillis и previousMillis println. Обе переменные всегда равны 0 в последовательном мониторе. Поэтому я попытался добавить currentMillis = millis () ; в начале l oop (), в этот момент на дисплее наконец отображается «радиоактивность» с обычными увеличивающимися числами.Даже если карта отключена от счетчика Гейгера, данные остаются такими же и всегда увеличиваются. Как я могу решить эту проблему?

enter image description here

#define PRINT_DEBUG_MESSAGES

#include 
#include 
#include 
#include 
#include 
//#include  // or define mySSID and myPASSWORD and THINGSPEAK_API_KEY

#define LOG_PERIOD 20000 //Logging period in milliseconds
#define MINUTE_PERIOD 60000
#define WIFI_TIMEOUT_DEF 30
#define PERIODE_THINKSPEAK 20000

#ifndef CREDENTIALS
// WLAN
#define mySSID ""
#define myPASSWORD ""

//IFTT
#define IFTTT_KEY "......."

// Thingspeak
#define SECRET_CH_ID 000000      // replace 0000000 with your channel number
#define SECRET_WRITE_APIKEY "XYZ"   // replace XYZ with your channel write API Key

#endif

// IFTTT
#define EVENT_NAME "Radioactivity" // Name of your event name, set when you are creating the applet


IPAddress ip;

WiFiClient client;

WiFiClientSecure secure_client;
IFTTTMaker ifttt(IFTTT_KEY, secure_client);
SSD1306  display(0x3c, 5, 4);

volatile unsigned long counts = 0;                       // Tube events
unsigned long cpm = 0;                                   // CPM
unsigned long previousMillis;                            // Time measurement
const int inputPin = 7;
unsigned int thirds = 0;
unsigned long minutes = 1;
unsigned long start = 0;
unsigned long entryThingspeak;
unsigned long currentMillis = millis();

unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

#define LOG_PERIOD 20000 //Logging period in milliseconds
#define MINUTE_PERIOD 60000

void ISR_impulse() { // Captures count of events from Geiger counter board
  counts++;
}

void displayInit() {
  display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_24);
}

void displayInt(int dispInt, int x, int y) {
  display.setColor(WHITE);
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.drawString(x, y, String(dispInt));
  display.setFont(ArialMT_Plain_24);
  display.display();
}

void displayString(String dispString, int x, int y) {
  display.setColor(WHITE);
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.drawString(x, y, dispString);
  display.setFont(ArialMT_Plain_24);
  display.display();
}


/****reset***/
void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
{
  Serial.print("resetting");
  esp_restart();
}


void IFTTT(String event, int postValue) {
  if (ifttt.triggerEvent(EVENT_NAME, String(postValue))) {
    Serial.println("Successfully sent to IFTTT");
  } else
  {
    Serial.println("IFTTT failed!");
  }
}

void postThingspeak( int value) {
  // Write to ThingSpeak. There are up to 8 fields in a channel, allowing you to store up to 8 different
  // pieces of information in a channel.  Here, we write to field 1.
  int x = ThingSpeak.writeField(myChannelNumber, 1, value, myWriteAPIKey);
  if (x == 200) {
    Serial.println("Channel update successful.");
  }
  else {
    Serial.println("Problem updating channel. HTTP error code " + String(x));
  }
}

void setup() {
  Serial.begin(115200);
  displayInit();
  ThingSpeak.begin(client);  // Initialize ThingSpeak
  displayString("Welcome", 64, 15);
  Serial.println("Connecting to Wi-Fi");

  WiFi.begin(mySSID, myPASSWORD);

  int wifi_loops = 0;
  int wifi_timeout = WIFI_TIMEOUT_DEF;
  while (WiFi.status() != WL_CONNECTED) {
    wifi_loops++;
    Serial.print(".");
    delay(500);
    if (wifi_loops > wifi_timeout)
    {
      software_Reset();
    }
  }
  Serial.println();
  Serial.println("Wi-Fi Connected");
  display.clear();
  displayString("Measuring", 64, 15);
  pinMode(inputPin, INPUT);                                                // Set pin for capturing Tube events
  interrupts();                                                            // Enable interrupts
  attachInterrupt(digitalPinToInterrupt(inputPin), ISR_impulse, FALLING); // Define interrupt on falling edge
  unsigned long clock1 = millis();
  start = clock1;
}

void loop() {

  if (WiFi.status() != WL_CONNECTED)
  {
    software_Reset();
  }

  if (currentMillis - previousMillis > LOG_PERIOD) {

    previousMillis = currentMillis;

    cpm = counts * MINUTE_PERIOD / LOG_PERIOD;
    //cpm=105;
    counts = 0;
    display.clear();
    displayString("Radioactivity", 64, 0);
    displayInt(cpm, 64, 30);
    if (cpm > 100 ) IFTTT( EVENT_NAME, cpm);
  }
  // Serial.print("minutes: ");
  // Serial.println(String(minutes));

  //cpm = counts * MINUTE_PERIOD / LOG_PERIOD; this is just counts times 3 so:

  cpm = counts / minutes;


  if (millis() - entryThingspeak > PERIODE_THINKSPEAK) {
    Serial.print("Total clicks since start: ");
    Serial.println(String(counts));
    Serial.print("Rolling CPM: ");
    Serial.println(String(cpm));
    postThingspeak(cpm);
    entryThingspeak = millis();
  }

  //    if ( thirds > 2) {
  //      counts = 0;
  //      thirds = 0;
  //    }
}

This is based on это работает на GITHUB

1 Ответ

1 голос
/ 11 июля 2020

Ваш код никогда не обновляет значение currentMillis. Вы устанавливаете его равным millis в глобальной области видимости, вероятно, до вызова init и до того, как millis даже получит значение, а затем вы просто оставите его с этим значением. Вы не говорите этой переменной вызывать миллис каждый раз, вы просто присваиваете ей значение в миллисекундах в один момент. Чтобы обновить эту переменную, вам нужна строка в l oop.

Из-за этого этот раздел никогда не запускается:

if (currentMillis - previousMillis > LOG_PERIOD) {

    previousMillis = currentMillis;

    cpm = counts * MINUTE_PERIOD / LOG_PERIOD;
    //cpm=105;
    counts = 0;
    display.clear();
    displayString("Radioactivity", 64, 0);
    displayInt(cpm, 64, 30);
    if (cpm > 100 ) IFTTT( EVENT_NAME, cpm);
  }

и счетчики никогда не сбрасываются обратно в 0. Вот почему вы увидеть постоянно увеличивающееся число.

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

...