• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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. Там более отзывчатая атмосфера. А тут и так сообщений мало, так будет еще меньше. Все туда перейдут.
 
Сверху Снизу