Подскажите с кодом: не работает без программатора

xorkrus
Offline
Зарегистрирован: 22.09.2013

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

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

опять? с новой темы по новому кругу?

уж мильён раз сказали СМОТРИ ЖЕЛЕЗО!

xorkrus
Offline
Зарегистрирован: 22.09.2013

Не совсем, но да. Вопрос означенный ранее как "теория...", относился не только к данно ситуации. Есть ещё пара похожих скетчей, но они - просто так и не требуют решения.

При всем уважении, но я бы не стал писать не проверив все несколько раз. Железо уже проверенно. Причем был собран второй "комплект" и ситуация таже самая. Зависания на 90% устраняются полным удалением кода анемометра. Т.е. без этого кода ардуинка зависает в разы реже. А может и не зависать вовсе. Но я не вижу проблемы в коде анемометра.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

может все банально и тупо тока вашего источника не хватает

xorkrus
Offline
Зарегистрирован: 22.09.2013

Питание подается от лабораторника. Напряжение 5В, потребление тока не превышает 200мА.

Да и питание от программатора не используется - только SPI\RST\GND

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

но все равно проблема в железе если реагирует на просто подключение программатора да еще и без питания

если бы в любом случае зависало можно было подумать что оперативка закончилась, но если с программатором работает значит дело не в этом

сделайте просто. врядли реагирует на все пины программатора. подключайте по одному и узнаете на что именно реагирует и узнаете причину

xorkrus
Offline
Зарегистрирован: 22.09.2013

По предварительным данным, проблема таки в питании. Дома проверю ещё раз.

В общем занимаясь сторонним проектом, случилась ситуация, когда преобразователь 5В->3В (на AMS1117) не выдал необходимой мощщи. Т.к. преобразователь такой же как и в моем девайсе - был проведен эксперимент по запитывания 3.3В модулей от отдельного бп - и тут-то зависания пропали. Параметры потребления модуля BMP085 и сетевого интерфейса укладываются в параметры преобразователя с большим запасом, но все же взял импульсный бп с 5в и 3.3в на выходе и запитал раздельно. За вот уже 3 часа - ни разу не зависло. Вечером попробую вернуть домой девайс и подключить сеть\анемометр\датчик уличный.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну знаете тот же визнет очень ощутимо нагревает стабилизатор в корпусе TO-220 даже с небольшим радиатором

да нужно точно знать в чем проблема зависания. просадка напряжения или шумы. от шумов, и частично от просадки помогают конденсаторы, надеюсь вы ими не пренебрегли. и не просто электролит повесить, а еще и керамику обязательно

xorkrus
Offline
Зарегистрирован: 22.09.2013

В SOT-223 у меня стабилизаторы. Греется мало, кондеры стоят (по старой привычке - три на входе три на выходе). Также кондеры (104. 0.1 которые) стоят у пинов всех компонентов. Просадки я не заметил (!), а тыкнуться осцилографом не умею (а умеющий коллега недоступен). Сменил стабилизатор на какой-то китайский аналог в дпаке: два часа полет нормальный. При этом запитав от лабораторника, вижу что потребляет уже в районе 300, а иногда и 400 (!)ма

p.s. enc28j60 у меня

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проблема в питании как изначально и предполагалось