Зависания без программатора ISCP

Тема в разделе "Arduino & Shields", создана пользователем xopkep, 22 авг 2014.

  1. xopkep

    xopkep Нуб

    Путем писания пятой точкой, сообразил такую версию кода:
    Код (Text):
    #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) воткнут в усб компьютера. При отсутствии программатора происходит следующее: Запуск - Езернет инит - отправка данных на народмон - вывод на дисплей - всё, тут всё виснет. Т.е. отображаются данные на момент вывода и не происходит более ни отправки ни обновления на дисплее.
    Что делать, чтобы не зависало без программатора?
     
  2. xopkep

    xopkep Нуб

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

    xopkep Нуб

    Ну хотя бы идеи...