Перейти к содержанию

Зависания Arduino Pro Mini Без Программатора


Рекомендуемые сообщения

Путем писания пятой точкой, сообразил такую версию кода:

   #include <Wire.h>              // Common library
   #include "DHT.h"                // DHT11 & DHT22 Library
   #include "af_BMP085.h"          // Simple library for BMP085
   #include <EtherCard.h>          // ENC28J60 Library
   #include <LiquidCrystal_I2C.h>  // Display with PFC8574

   // BMP085: SDA->A4 / SCL->A5
   // DHT11: DATA->A0
   // DHT22: DATA->A1
   // JACK: DATA->D4
   // DISPLAY-I2C: SDA->A4 SCL->A5 BACKLIGHT->D5
   // ENC28J60: SCK->D13 MOSI->D12 MISO->D11 INT->D2 RST->RST CS->D10
   // ISP: SCK->D13 MOSI->D12 MISO->D11 RST->RST
   // DIODE GREEN: + -> D8
   // DIODE ORANGE: + -> D7
   // BUZZER: SIGNAL -> D9
   // ANEMOMETER -> D3 (INT1)

   // Setting vars
   //#define BACKLIGHT_PIN 5 // Display backlight with npn-transistor
   #define DHT_S1_PIN A1 // DHT22 / AM2302
   #define DHT_S2_PIN A0 // DHT11
   //#define D_ORANGE_PIN 7 // Diode orange
   //#define D_GREEN_PIN 8 // Diode green
   //#define BUZZER_PIN 9 // Buzzer
   //#define WIND_PIN 3 // Anemometer

   //uint8_t wind[8] = {B11000,B00011,B00100,B11000,B00011,B00100,B11000}; //ветер
   uint8_t home[8] = {B00100,B01010,B11111,B10001,B10101,B10001,B11111}; //домик
   uint8_t sun[8] = {B00100,B10101,B01110,B11011,B01110,B10101,B00100}; //солнышко
   uint8_t mmhg[8] = {B01110,B01110,B01110,B01110,B11111,B01110,B00100}; //давление
   uint8_t temp_w_cel[8] = {B00011,B00011,B01100,B10010,B10000,B10010,B01100}; //ц с градусом
   uint8_t hum[8] = {B00000,B00100,B01010,B01010,B10001,B11111,B01110}; //влажность
   short int humidity = 0, temp_dht = 0, humidity2 = 0, temp_dht2 = 0, temp = 0;//temp_bmp = 0,
   static uint8_t mymac[6] = { ххх };
   LiquidCrystal_I2C lcd(0x20,4,5,6,0,1,2,3,7, POSITIVE);
   const char website[12] = "narodmon.ru";
   static byte hisip[] = { 94, 19, 113, 221 };
   static byte dnsip[] = {8, 8, 8, 8};
   int32_t pressure_pa = 0, pressure_mm = 0;
   volatile byte half_revolutions = 0;
   byte Ethernet::buffer[500];
   float tavgwspeed = 0;
   float avgwspeed = 0;
   //unsigned int avgrpm=0;
   float wspeed=0;
   short int taws = 0;

   Adafruit_BMP085 bmp;
   dht dht_s1, dht_s2;

   Stash stash;

   unsigned long DisplayTime;
   unsigned long lDisplayTime;
   unsigned long NMTime;
   unsigned long lNMTime;
   unsigned long AnemoTime;
   unsigned long lAnemoTime;
   unsigned long ResetTime;
   unsigned long lResetTime;

   void(* resetFunc) (void) = 0;

   void setup()
   {
       // LCD
     pinMode(5, INPUT);          // set pin to input
     digitalWrite(5, HIGH);      // turn on pullup resistors
     lcd.home();
     lcd.begin(24,2);
   //  lcd.createChar(0, wind);
     lcd.createChar(1, home);
     lcd.createChar(2, sun);
     lcd.createChar(3, mmhg);
     lcd.createChar(4, temp_w_cel);
     lcd.createChar(5, hum);
     lcd.setCursor(0,0);
     lcd.print("[Online Meteostation v3]");
     delay(3000);
     lcd.clear();
     // ETHERNET
     if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) {
       lcd.setCursor(0,0);
       lcd.print("ETH ERR");
     } else {
       lcd.setCursor(0,0);
       lcd.print("ETH OK");
     }

     if (!ether.dhcpSetup()) {
       lcd.setCursor(8,0);
       lcd.print("DHCP ERR");
     } else {
       lcd.setCursor(8,0);
       lcd.print("DHCP OK");
     }

     ether.copyIp(ether.dnsip, dnsip);
     ether.copyIp(ether.hisip, hisip);

   /*  if (!ether.dnsLookup(website)){
       lcd.setCursor(17,0);
       lcd.print("DNS ERR");
     } else {
       lcd.setCursor(17,0);
       lcd.print("DNS OK");
     }*/

     while (ether.clientWaitingGw()) {
       ether.packetLoop(ether.packetReceive());
       lcd.setCursor(0,1);
       lcd.print("GW OK");
     }

       delay(4000);
     lcd.clear();
     // BMP085
     bmp.begin();
     // Narodmon.ru Update
     nm_upd();
     // Display Update
     DisplayTotal();
     // 600000 - 10 min // 60000 - min // 1000 - sec // 100 - millisec // 10 - microsec // 1 sec = 1000ms = 1000000uS
     attachInterrupt(1, rpm_fun, FALLING);

     DisplayTime = millis();      // считываем время, прошедшее с момента запуска программы
     NMTime = millis();
     AnemoTime = millis();
     ResetTime = millis();

     lDisplayTime = DisplayTime;
     lNMTime = NMTime;
     lAnemoTime = AnemoTime;
     lResetTime = ResetTime;
   }
   void loop()
   {
     DisplayTime = millis();                          // считываем время, прошедшее с момента запуска программы
     if(DisplayTime >= (lDisplayTime + 60000)){        // сравниваем текущий таймер с переменной lDisplayTime + 60 секунд
       DisplayTotal();                                  // включаем/выключаем LED
       lDisplayTime = DisplayTime;                    // в loopTime записываем новое значение
     }

     NMTime = millis();                                // считываем время, прошедшее с момента запуска программы
     if(NMTime >= (lNMTime + 300000)){                // сравниваем текущий таймер с переменной lDisplayTime + 300 секунд
       nm_upd();                                      // включаем/выключаем LED
       lNMTime = NMTime;                              // в loopTime записываем новое значение
     }

     AnemoTime = millis();                            // считываем время, прошедшее с момента запуска программы
     if(AnemoTime >= (lAnemoTime + 60000)){            // сравниваем текущий таймер с переменной lDisplayTime + 60 секунд
       anemometer();                                  // включаем/выключаем LED
       lAnemoTime = AnemoTime;                        // в loopTime записываем новое значение
     }

     ResetTime = millis();                            // считываем время, прошедшее с момента запуска программы
     if(ResetTime >= (lResetTime + 86400000)){            // сравниваем текущий таймер с переменной lDisplayTime + 60 секунд
       resetFunc();
       lResetTime = ResetTime;                        // в loopTime записываем новое значение
     }

       // Ethernet ping answer
     ether.packetLoop(ether.packetReceive());
   }

   // Narodmon.ru Update
   void nm_upd(){
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Now updating narodmon.ru");
     MS_BMP085();
     MS_DHT11();
   // MS_DHT22();
     byte sd = stash.create();
     stash.println("ID=ххх");
     stash.println("&ххх=");
     stash.println(temp_dht);
     stash.println("&ххх=");
     stash.println(humidity);
     stash.println("&ххх=");
     stash.println(pressure_mm);
     stash.save();
     Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n"
                         "Host: narodmon.ru" "\r\n"
                         "Content-Length: $D" "\r\n"
                         "\r\n"
                         "$H"),
                         stash.size(), sd);
     ether.tcpSend();
     stash.cleanup();
     delay(3000);
     lcd.clear();
     DisplayTotal();
   }

   // Main display view
   void DisplayTotal() {
     MS_SensUpdate();
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.write(byte(2));//sun
     lcd.setCursor(3,0);
     lcd.write(byte(3));//mmhg
     lcd.print(pressure_mm);
     lcd.setCursor(9,0);
     lcd.write(byte(5));//hum
     if ( humidity == 0 ) {
       lcd.print(" ");
     }
     lcd.print(humidity);
     if (temp_dht == 0) {
       lcd.print("  ");
     } else if (temp_dht <= 9) {
       lcd.print("  +");
     } else if (temp_dht >= 10) {
       lcd.print("  +");
     };
     lcd.print(temp_dht);
     lcd.write(byte(4));//cel
     lcd.print("  ");
     lcd.setCursor(20,0);
   //  lcd.write(byte(0));//wind
     lcd.print("W");
     lcd.print(wspeed);

     lcd.setCursor(0,1);
     lcd.write(byte(1));//home
     lcd.print("  ");
     lcd.write(byte(3));//mmhg
     lcd.print(pressure_mm);
     lcd.print("  ");
     lcd.write(byte(5));//hum
     lcd.print(humidity2);
     if ( temp_dht2 >= 1 ) {
       lcd.print("  +");
     } else if (temp_dht2 == 0) {
       lcd.print("  ");
     } else if (temp_dht2 >= 10) {
       lcd.print("  +");
     };
     lcd.print(temp_dht2);
     lcd.write(byte(4));//cel

     lcd.setCursor(20,1);
     lcd.print("W");
   //  lcd.write(byte(0));//wind
     lcd.print(avgwspeed);
     /*
     [s][ ][-][>][ ][p][7][4][5][ ][ ][h][6][0][ ][+][2][5][c*][ ][ ][ w][2][6]
     [H][ ][-][>][ ][p][7][4][5][ ][ ][h][4][5][ ][+][2][3][c*][ ][+][2][3][c*]
     Total: 24x02
     */
   }

   // Sensors
   // Update all sensors one time
   void MS_SensUpdate() {
     MS_BMP085();
     MS_DHT22();
     MS_DHT11();
   }

   // Update only BMP085
   void MS_BMP085() {
   //  temp_bmp = bmp.readTemperature();
     pressure_pa = bmp.readPressure();
     pressure_mm = pressure_pa/133.3;
   }

   // Update only DHT22
   void MS_DHT22() {
     if (dht_s1.read22(DHT_S1_PIN) == DHTLIB_OK) {
       humidity = dht_s1.humidity;
       temp_dht = dht_s1.temperature;
       temp = temp_dht;
     } else {
       temp = temp_dht;
     }
   }

   // Update only DHT11
   void MS_DHT11() {
     if (dht_s2.read11(DHT_S2_PIN) == DHTLIB_OK) {
       humidity2 = dht_s2.humidity;
       temp_dht2 = dht_s2.temperature;
       temp = temp_dht2;
     } else {
       temp = temp_dht2;
     }
   }

   void rpm_fun() {
     half_revolutions++;
   }

   void anemometer(){
     wspeed = half_revolutions * 0.60288; // метров в минуту
     wspeed = wspeed / 60; // метров в секунду
     if (taws == 10){
       avgwspeed = tavgwspeed / 10; // средняя скорость
       tavgwspeed = 0;
       taws = 0;
     } else if (taws <= 9) {
       tavgwspeed = tavgwspeed + wspeed; // накапливание
       taws++;
     } else if (taws >= 11) {
       taws = 0;
     }
     half_revolutions = 0;
   }

Оно все работает, при условии, что подключен USBasp и он (USBasp) воткнут в усб компьютера. При отсутствии программатора происходит следующее: Запуск - Езернет инит - отправка данных на народмон - вывод на дисплей - всё, тут всё виснет. Т.е. отображаются данные на момент вывода и не происходит более ни отправки ни обновления на дисплее.

Что делать, чтобы не зависало без программатора?

Добавлю. Если убрать код анемометра целиком (прерывания и обсчет и вывод) - зависает реже (а может и не зависнуть). В чем ошибка?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...