Подскажите с кодом: не работает без программатора
- Войдите на сайт для отправки комментариев
Пнд, 25/08/2014 - 06:46
Путем писания пятой точкой, сообразил такую версию кода:
#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) воткнут в усб компьютера. При отсутствии программатора происходит следующее: Запуск - Езернет инит - отправка данных на народмон - вывод на дисплей - всё, тут всё виснет. Т.е. отображаются данные на момент вывода и не происходит более ни отправки ни обновления на дисплее. Что делать, чтобы не зависало без программатора?
опять? с новой темы по новому кругу?
уж мильён раз сказали СМОТРИ ЖЕЛЕЗО!
Не совсем, но да. Вопрос означенный ранее как "теория...", относился не только к данно ситуации. Есть ещё пара похожих скетчей, но они - просто так и не требуют решения.
При всем уважении, но я бы не стал писать не проверив все несколько раз. Железо уже проверенно. Причем был собран второй "комплект" и ситуация таже самая. Зависания на 90% устраняются полным удалением кода анемометра. Т.е. без этого кода ардуинка зависает в разы реже. А может и не зависать вовсе. Но я не вижу проблемы в коде анемометра.
может все банально и тупо тока вашего источника не хватает
Питание подается от лабораторника. Напряжение 5В, потребление тока не превышает 200мА.
Да и питание от программатора не используется - только SPI\RST\GND
но все равно проблема в железе если реагирует на просто подключение программатора да еще и без питания
если бы в любом случае зависало можно было подумать что оперативка закончилась, но если с программатором работает значит дело не в этом
сделайте просто. врядли реагирует на все пины программатора. подключайте по одному и узнаете на что именно реагирует и узнаете причину
По предварительным данным, проблема таки в питании. Дома проверю ещё раз.
В общем занимаясь сторонним проектом, случилась ситуация, когда преобразователь 5В->3В (на AMS1117) не выдал необходимой мощщи. Т.к. преобразователь такой же как и в моем девайсе - был проведен эксперимент по запитывания 3.3В модулей от отдельного бп - и тут-то зависания пропали. Параметры потребления модуля BMP085 и сетевого интерфейса укладываются в параметры преобразователя с большим запасом, но все же взял импульсный бп с 5в и 3.3в на выходе и запитал раздельно. За вот уже 3 часа - ни разу не зависло. Вечером попробую вернуть домой девайс и подключить сеть\анемометр\датчик уличный.
ну знаете тот же визнет очень ощутимо нагревает стабилизатор в корпусе TO-220 даже с небольшим радиатором
да нужно точно знать в чем проблема зависания. просадка напряжения или шумы. от шумов, и частично от просадки помогают конденсаторы, надеюсь вы ими не пренебрегли. и не просто электролит повесить, а еще и керамику обязательно
В SOT-223 у меня стабилизаторы. Греется мало, кондеры стоят (по старой привычке - три на входе три на выходе). Также кондеры (104. 0.1 которые) стоят у пинов всех компонентов. Просадки я не заметил (!), а тыкнуться осцилографом не умею (а умеющий коллега недоступен). Сменил стабилизатор на какой-то китайский аналог в дпаке: два часа полет нормальный. При этом запитав от лабораторника, вижу что потребляет уже в районе 300, а иногда и 400 (!)ма
p.s. enc28j60 у меня
проблема в питании как изначально и предполагалось