watchdog помогите со сторожевой собакой

delta_canon
Offline
Зарегистрирован: 12.02.2015

На arduino mini pro китайской собрана метеостанция, проблема в том что она зависате через  рандомное время и не передает данные на Народный монитор. Так как я новичек помогите вставит в скетч watchdog


// Скетч для Arduino для отправки данных о температуре на Народный мониторинг.
// Версия 1.3 (16.07.2014)
//
// Автор: Гладышев Дмитрий (2012-2014)
// http://student-proger.ru/2012/06/podklyuchenie-arduino-k-otechestvennomu...

#include <SPI.h>
#include <UIPEthernet.h>
#include <OneWire.h>
#include <avr/wdt.h>

bool Debug = false; //режим отладки

//****************************************************************************************
byte mac[] = {  0x74, 0x2F, 0x68, 0x1D, 0x09, 0xCD }; //MAC-адрес Arduino
OneWire ds(9); //пин подключения термодатчика
const unsigned long postingInterval = 300000;  // интервал между отправками данных в миллисекундах (10 минут)
//****************************************************************************************

IPAddress server(94,19,113,221); // IP сервера

EthernetClient client;

unsigned long lastConnectionTime = 0;           // время последней передачи данных
boolean lastConnected = false;                  // состояние подключения

int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;

char replyBuffer[160];

int CountSensors;

void setup() {
    wdt_disable();
    
    if (Debug)
    {
      Serial.begin(9600);
    }
   
    delay(1000);
    // Ethernet connection:
    if (Ethernet.begin(mac) == 0) 
    {
      if (Debug)
      {
        Serial.println("Failed to configure Ethernet using DHCP");
      }
      // ничего не делаем
      for(;;);
    }
    // секунда для инициализации Ethernet
    delay(1000);

    //Узнаём количество термодатчиков
    CountSensors = DsCount();
    if (Debug)
    {
      Serial.print("Found ");
      Serial.print(CountSensors);
      Serial.println(" sensors."); 
    }
    lastConnectionTime = millis()-postingInterval+15000; //первое соединение через 15 секунд после запуска
}

void loop()
{
  //Если вдруг нам случайно приходят откуда-то какие-то данные,
  //то просто читаем их и игнорируем, чтобы очистить буфер
  if (client.available()) 
  {
    client.read();
  }

  if (!client.connected() && lastConnected) 
  {
      if (Debug)
      {
         Serial.println();
         Serial.println("disconnecting.");
      }
      client.stop();
  }

  //если не подключены и прошло определённое время, то делаем замер,
  //переподключаемся и отправляем данные
  if (!client.connected() && (millis() - lastConnectionTime > postingInterval)) 
  {

    //формирование HTTP-запроса
    memset(replyBuffer, 0, sizeof(replyBuffer));
    strcpy(replyBuffer,"ID=");

    //Конвертируем MAC-адрес
    for (int k=0; k<6; k++)
    {
      int b1=mac[k]/16;
      int b2=mac[k]%16;
      char c1[2],c2[2];

      if (b1>9) c1[0]=(char)(b1-10)+'A';
      else c1[0] = (char)(b1) + '0';
      if (b2>9) c2[0]=(char)(b2-10)+'A';
      else c2[0] = (char)(b2) + '0';

      c1[1]='\0';
      c2[1]='\0';

      strcat(replyBuffer,c1);
      strcat(replyBuffer,c2);
    }

    //Сбрасываем поиск датчиков (кол-во нам уже известно)
    ds.reset_search();
    //Теперь в цикле опрашиваем все датчики сразу

    for (int j=0; j<CountSensors; j++)
    {

      byte i;
      byte present = 0;
      byte data[12];
      byte addr[8];

      if ( !ds.search(addr)) 
      {
        ds.reset_search();
        return;
      }

      ds.reset();
      ds.select(addr);
      ds.write(0x44,1);

      delay(1000);

      present = ds.reset();
      ds.select(addr);    
      ds.write(0xBE);

      for ( i = 0; i < 9; i++) // we need 9 bytes
      {
        data[i] = ds.read();
      }

      LowByte = data[0];
      HighByte = data[1];
      TReading = (HighByte << 8) + LowByte;
      SignBit = TReading & 0x8000;  // test most sig bit
      if (SignBit) // negative
      {
        TReading = (TReading ^ 0xffff) + 1; // 2's comp
      }
      Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25

      Whole = Tc_100 / 100;  // separate off the whole and fractional portions
      Fract = Tc_100 % 100;

      char temp[3];

      itos(Whole,temp);
      strcat(replyBuffer,"&");

      //конвертируем адрес термодатчика
      for (int k=7; k>=0; k--)
      {
        int b1=addr[k]/16;
        int b2=addr[k]%16;
        char c1[2],c2[2];

        if (b1>9) c1[0]=(char)(b1-10)+'A';
        else c1[0] = (char)(b1) + '0';
        if (b2>9) c2[0]=(char)(b2-10)+'A';
        else c2[0] = (char)(b2) + '0';

        c1[1]='\0';
        c2[1]='\0';

        strcat(replyBuffer,c1);
        strcat(replyBuffer,c2);
      }
      strcat(replyBuffer,"=");
      if (SignBit) //если температура отрицательная, добавляем знак минуса
      {
        strcat(replyBuffer,"-");
      }
      strcat(replyBuffer,temp);
      strcat(replyBuffer,".");
	  if (Fract<10)
	  {
		  strcat(replyBuffer,"0");
	  }
      itos(Fract,temp);
      strcat(replyBuffer,temp);

    }

    strcat(replyBuffer,'\0');

    if (Debug)
    {
      Serial.println(replyBuffer);
      Serial.print("Content-Length: ");
      Serial.println(len(replyBuffer));
    }

    //отправляем запрос
    httpRequest();

  }
  //храним последнее состояние подключения
  lastConnected = client.connected();
}

void httpRequest() {
  if (client.connect(server, 80))
  {
    if (Debug)
    {
      wdt_enable (WDTO_8S); // Для тестов не рекомендуется устанавливать значение менее 8 сек.
      Serial.println("Watchdog enabled.");
      Serial.println("connecting...");
    }
    // send the HTTP POST request:
    client.println("POST http://narodmon.ru/post.php HTTP/1.0");
    client.println("Host: narodmon.ru");
    //client.println("User-Agent: arduino-ethernet");
    //client.println("Connection: close");
    client.println("Content-Type: application/x-www-form-urlencoded");
    client.print("Content-Length: ");
    client.println(len(replyBuffer));
    client.println();
    client.println(replyBuffer);
    client.println();

    lastConnectionTime = millis();
  } 
  else
  {
    if (Debug)
    {
      Serial.println("connection failed");
      Serial.println("disconnecting.");
    }
    client.stop();
  }
}

//Количество термодатчиков на шине
int DsCount()
{
  int count=0;
  bool thatsall = false;
  byte addr[8];
  do
  {
    if ( !ds.search(addr))
    {
      ds.reset_search();
      thatsall = true;
    }
    count++;
  } while(!thatsall);
  return (count-1);
}

int len(char *buf)
{
  int i=0; 
  do
  {
    i++;
  } while (buf[i]!='\0');
  return i;
}

void itos(int n, char bufp[3]) //int to string
{
  char buf[3]={'0','0','\0'}; 
  int i = 1;

  while (n > 0) {
    buf[i] = (n % 10)+48;
    i--;
    n /= 10;
  }

  for (i=0; i<3; i++)
    bufp[i]=buf[i];
}
  wdt_reset();

Looka
Offline
Зарегистрирован: 24.04.2012

Сначала понять  будет Ваша прописка с собакой работать или нет. 

Воспользуйтесь поиском, не одна тема была 

Вот что под руками - проверка. Только имейте ввиду - если прошивка не работает с WDT, для воссстановления работоспособности ардуины  прийдется Вам пперепрошить загрузчик. 

 

#include <avr/wdt.h>
 
int counter=0;
void setup(){
   wdt_disable(); // запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут
   
    Serial.begin(57600);
  Serial.println("Starting...");
  delay(1000); // что-бы четче видеть рестар скетча
  
 
  wdt_enable(WDTO_4S); // активировали таймер, каждые 4-ре секунды его нужно сбрасывать
 
  
}
 
 
 
void loop(){
  wdt_reset(); // говорим собаке что "В Багдаде все спокойно", начинается очередной отсчет 4-х секунд.
  
   Serial.println(counter);
   counter++;
   
   if(counter==5){
      while(true){} // создаем зависание, через 4 секунды должен произойти ресет, так как не вызывается wdt_reset();
   }
   delay(500);
  
}

 

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

А еще лучше, разберитесь почему зависает.

delta_canon
Offline
Зарегистрирован: 12.02.2015

bwn пишет:

А еще лучше, разберитесь почему зависает.

Подскажите у меня идет питание 4,9 вольта на ардуно и столько же идет на eternet шилд который должен питаться 3,3 вольта может это быть из-за этого (зависания)?

Looka
Offline
Зарегистрирован: 24.04.2012

Может.

Вы уже расскажите что уи как Вы включаете....

delta_canon
Offline
Зарегистрирован: 12.02.2015

Делал по схеме http://sagis.ru/blog/?p=8

Looka
Offline
Зарегистрирован: 24.04.2012

Делали по схеме.  А как сделали?

Откуда подаете питание на эзернет ?

Блочек питания такой-же?  Перемычки как стоят?

Или на печатной плате стабилизатор у Вас? 

 

По Вашей ссылке там два варианта - проводочками и на плате. Вы какой сделали?

delta_canon
Offline
Зарегистрирован: 12.02.2015

я проводками сделал

Looka
Offline
Зарегистрирован: 24.04.2012

Какой блок питания использовали?

на рисунке после фразы "примерно так:"  один из красных проводников подписан 3.3    

Он куда у Вас подключен?

delta_canon
Offline
Зарегистрирован: 12.02.2015

у меня без стабилизатора прямо 5 вольт и идет туда где должен быть 3,3

Looka
Offline
Зарегистрирован: 24.04.2012

а говорите по схеме.

Сами как думаете?  

Разница в полтора раза?

 

delta_canon
Offline
Зарегистрирован: 12.02.2015

спасибо