• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Надо побороть прерывания

selan61

Member
У меня уличные датчики такой конструкции и в них стоит вентилятор. Нашел на arduinoLab скетч подсчета оборотов кулера. Вставил этот скетч в проект Виталия Коробова с GitHub и залил в ардуину. Сейчас такая конструкция с вентилятором работает на ардуине и считает обороты и вместе с показаниями датчиков отправляет на narodmon. Хочу использовать такую конструкцию корпуса метеодатчиков и для ESP


Скетч рабочий и использует прерывания.
Раскрыть Спойлер
Код:
[LIST=1]
[*]

[*]/ volatile int val;
[*]int rpmcount = 0;
[*]void rpm(){
[*]val++;
[*]}
[*]void setup() {
[*]Serial.begin(9600);
[*]attachInterrupt(2, rpm, CHANGE);
[*]}
[*]void loop() {
[*]val = 0; // сбрасываем счетчик и ждем.
[*]delay(500); // так как прерывание CHANGE, срабатывает два раза
[*]// то и считываем каждые пол секунды.
[*]rpmcount =(val*60)/2;
[*]

[*]Serial.print(rpmcount); // количество импульсов на 60 секунд
[*]// и делим на количество импульсов на оборот
[*]Serial.print(" rpm ");
[*]Serial.print(val);
[*]Serial.println(" val");
[*]}
[*]
[/LIST]

ESP с этим скетчем тоже работает, но когда я вставляю его в скетч arduinoLab для отправки на narodmon, то ESP крахуется fatal exception(0). Поставил на IDE в инструменты EspExceptionDecoder и по данным стека определил, что ESP крахуется именно по прерываниям. Видимо ESP более капризна при работе с прерываниями, чем ардуина. Прочитал здесь на форуме, что при работе с прерываниями не надо использовать delay(), нашел скетч подсчета оборотов на millis()
Код:
// read RPM

volatile int rpmcount = 0;
int rpm = 0;
unsigned long lastmillis = 0;

void setup(){
Serial.begin(9600);
attachInterrupt(0, rpm_fan, FALLING);//interrupt cero (0) is on pin two(2).
}

void loop(){
if (millis() - lastmillis == 1000){ /*Обновляйте каждую секунду, это будет равно частоте чтения (Hz).*/
rpm = rpmcount * 60; /* Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use rpmcount * 30.*/

Serial.print("RPM =\t"); //print the word "RPM" and tab.
Serial.print(rpm); // print the rpm value.
Serial.print("\t Hz=\t"); //print the word "Hz".
Serial.println(rpmcount); /*print revolutions per second or Hz. And print new line or enter.*/

rpmcount = 0; // Restart the RPM counter
lastmillis = millis(); // Uptade lasmillis

}
}
Но с ним тоже, когда я вставляю его в скетч arduinoLab
Код:
//Датчик для народного мониторинга на ESP8266

#include <ESP8266WiFi.h>
#include <OneWire.h>

OneWire  ds(2);  // GPIO2 (a 4.7K resistor is necessary)

const char* ssid     = "******"; // название и пароль точки доступа
const char* password = "******";

const char* host = "narodmon.ru";
const int httpPort = 8283;

byte addr[8];
float temperature;

float getTemp(){
  byte data[12];

  if (!ds.search(addr)) {
    Serial.println("No more addresses.");
    while(1);
  }
   ds.reset_search();

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      while(1);
  }

 
  ds.reset();          
  ds.select(addr);      
  ds.write(0x44);    
  delay(1000);  
 
  ds.reset();
  ds.select(addr);  
  ds.write(0xBE);        

  for (int i = 0; i < 9; i++) {          
    data[i] = ds.read();
  }

  int raw = (data[1] << 8) | data[0];
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];
  return raw / 16.0;
  
}

void setup() {
  Serial.begin(115200);
  delay(10);

}

void loop() {
     // забираем температуру.
  temperature = getTemp();

     // Подключаемся к wifi
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("MAC address: ");
  Serial.println(WiFi.macAddress());
  Serial.println();
 
  // подключаемся к серверу
  Serial.print("connecting to ");
  Serial.println(host);
 
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
 
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
 
  // отправляем данные
  Serial.println("Sending...");
      // заголовок
  client.print("#");
  client.print(WiFi.macAddress()); // отправляем МАС нашей ESP8266
  client.print("#");
  client.print("ESP8266"); // название устройства
  client.println();
 
      // отправляем данные с градусника
    client.print("#");
    for(int i = 0; i < 8; i++) client.print(addr[i], HEX); // номер 18b20
    client.print("#");
    client.print(temperature);
    client.print("#temp");  // название датчика

   client.println("##");
  
  delay(10);

  // читаем ответ с и отправляем его в сериал
  Serial.print("Requesting: ");
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line); // хотя это можно убрать
  }
 
  client.stop();
  Serial.println();
  Serial.println();
  Serial.println("Closing connection");

  WiFi.disconnect(); // отключаемся от сети
  Serial.println("Disconnect WiFi.");
 
  delay(1000*60*10); // перекур 10 минут
}
для отправки на narodmon, то ESP крахуется.
Помогите, если можно, грамотно вставить в этот скетч подсчет оборотов или первый или второй вариант. Я ни разу не программист и у меня не получается, хотя до этого собирал из разных кусков различные скетчи и всё прекрасно работало.
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
Идея такая:
НА ВЫКЛЮЧЕННОМ WIFI
1/ включить прерывания (прицепить хэндлер)
2/ поставить паузу любым способом
3/ после паузы выключить прерывания, включитьWIFI и передать данные куда нужно
4/ выключить wifi, перейти к пункту 1
 

nikolz

Well-known member
Идея такая:
НА ВЫКЛЮЧЕННОМ WIFI
1/ включить прерывания (прицепить хэндлер)
2/ поставить паузу любым способом
3/ после паузы выключить прерывания, включитьWIFI и передать данные куда нужно
4/ выключить wifi, перейти к пункту 1
Как я понял, чел использует "французский" метод РЕКЛЕ -режу-клею(старый метод радиолюбителей) Вот он вырезал с сайтов скрипты и теперь их склеил, но картинка не получилась.
Он просит, что бы в этих картинках не нужное отрезали а нужное приклеили.
Что нужно, а что не нужно, он точно не знает .
Но надо чтобы работало.
По-моему, все просто, надо готовое решение,
а Ваше предложение -это не делает, оно требует знаний и умений.
 

selan61

Member
Идея такая:
НА ВЫКЛЮЧЕННОМ WIFI
1/ включить прерывания (прицепить хэндлер)
2/ поставить паузу любым способом
3/ после паузы выключить прерывания, включитьWIFI и передать данные куда нужно
4/ выключить wifi, перейти к пункту 1
Идею понял, но я ни разу не программист, поэтому мне это непосилам. Если показать как это примерно делается я может быть и сделал.
Как я понял, чел использует "французский" метод РЕКЛЕ -режу-клею(старый метод радиолюбителей) Вот он вырезал с сайтов скрипты и теперь их склеил, но картинка не получилась.
Он просит, что бы в этих картинках не нужное отрезали а нужное приклеили.
Что нужно, а что не нужно, он точно не знает .
Но надо чтобы работало.
По-моему, все просто, надо готовое решение,
а Ваше предложение -это не делает, оно требует знаний и умений.
Да Вы правы, это действительно так, но я не вижу в этом ничего плохого. Если Вы классный программист, то честь Вам и хвала. А я нет, я пенсионер любитель, поэтому и обращаюсь за помощью. И по моему тут таких как я 90 процентов.
 

nikolz

Well-known member
Идею понял, но я ни разу не программист, поэтому мне это непосилам. Если показать как это примерно делается я может быть и сделал.

Да Вы правы, это действительно так, но я не вижу в этом ничего плохого. Если Вы классный программист, то честь Вам и хвала. А я нет, я пенсионер любитель, поэтому и обращаюсь за помощью. И по моему тут таких как я 90 процентов.
На самом деле, Вы цените свое время и не цените чужое.
Вам разбираться в этом лень и Вы хотите халяву.
Да на этот форум приходят за халявой.
Поэтому это плохо.
-------------------
Я тоже не знаю японского,
но у меня не возникает желания попросить знающих написать на японском роман
под названием "Полет на Марс" (ну хочется мне такой роман иметь)
------------------
Более того, раз Вы пенсионер, то есть время изучить язык ардуины(это проще чем японский)
и сделать и эту прогу и еще десяток других, которые захочется, а не ходит с протянутой рукой за халявой.
 

selan61

Member
На самом деле, Вы цените свое время и не цените чужое.
Вам разбираться в этом лень и Вы хотите халяву.
Да на этот форум приходят за халявой.
Поэтому это плохо.
Уважаемый nikolz, извините, что заставил Вас потратить Ваше драгоценное время. Но я не обращался лично к Вам, я обратился за помощью на форум и если Вы так дорожите своим драгоценным временем, то игнорировали бы мое сообщение. Изучали бы японский и не занимались бы педагогической деятельностью. Я думаю, что и Вы в других сферах деятельности можете быть не специалистом, и Вам приходится просить помощи на профильных форумах и тамошним консультантам, так же, приходится отвечать на Ваши, казалось бы банальные вопросы. И это правильно, потому что форумы для этого и предназначены.
Я не ищу халявы, я не прошу написать с нуля мне код. Тут дело может быть в двух строчках кода, а мы занимаемся беллетристикой.
Когда я обратился к Виталию Коробову на GitHub с просьбой помочь в коде, он любезно исправил мои ошибки и пожелал мне удачи. То же самое я ожидал и от команды этого форума, но как видно ошибся, тут другие правила и форум предназначен для чего то другого.
 

kab

New member
форум предназначен для чего то другого
:):):):):):):)
Я Вам открою "страшную военную тайну" Мальчиша-Кибальчиша:
- кроме обсуждения технических проблем, этот форум предназначен для воспитания мужества, укрепления характера, выработки настойчивости!!!

Даже у пенсионеров- любителей :D!

Б... , меня опять за флуд и оффтоп накажут...
 

selan61

Member
:):):):):):):)
Я Вам открою "страшную военную тайну" Мальчиша-Кибальчиша:
- кроме обсуждения технических проблем, этот форум предназначен для воспитания мужества, укрепления характера, выработки настойчивости!!!

Даже у пенсионеров- любителей :D!

Б... , меня опять за флуд и оффтоп накажут...
За что наказывать, это видимо основная задача форума.
 

selan61

Member
Проблема решена, правда аппаратно.
Тему можно удалить, так как не содержит технически полезную информацию.
 

selan61

Member
:) Вы имеете возможность исправить отмеченный Вами недостаток темы:
- не уподобляйтесь некоторым, а просто расскажите, что Вы сделали. Кому-то, наверняка, пригодится...
Да вряд-ли, у меня от форума только негативные впечатления. Поэтому esp обсуждают на arduino.ru. Там более отзывчатая атмосфера. А тут и так сообщений мало, так будет еще меньше. Все туда перейдут.
 
Сверху Снизу