Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.11.2014, 14:31   #1
Batons
Junior Member
 
Регистрация: 09.11.2014
Сообщений: 8
Вес репутации: 0
Batons is an unknown quantity at this point
Post Arduino + DS2423

Озадачился проблемой снятия показаний с счетчиков воды. Перебрал в инете много вариантов решения данной проблемы... все либо кривые, либо счетчики обнулялись при отключении электроэнергии.
В маказине http://www.hobby-boards.com
есть счетчик DS2423 с резервным питанием



но под него нужно городить шину 1-Wire. что в моем случае не очень подходило.
пришлось искать, как подружить DS2423 с arduino.
В инете есть код под Arduino для чтения данные с DS2423 но к нему приложена кривая библиотека, которая не дает считывать показания счетчика больше 255.
Как обычно без бубна не обошлось... в итоге получилась рабочая версия скетчка и библиотеки... собственно делюсь... может еще кому пригодится.
Batons вне форума   Ответить с цитированием
Старый 11.11.2014, 14:46   #2
Batons
Junior Member
 
Регистрация: 09.11.2014
Сообщений: 8
Вес репутации: 0
Batons is an unknown quantity at this point
По умолчанию Re: Arduino + DS2423

вот сам скетч. Работает это все только на Arduino 0023

PHP код:
#include <OneWire.h>

#include <DS2423.h>

#include <string.h>



// arduino 0023



//  адрес моего счетчика DS2423

DeviceAddress counter = { 0x1D0xEF0xC30x0F0x00x00x00x38 };


OneWire ow(5);// подклчение сигнального провода 1-wire


ds2423 myCounter(&owcounter);




void setup(void)

{



  
// Для отладки включим отправку данных в COM порт

  
Serial.begin(9600);

delay(2000);





}




void loop(void)



  
// Счетчик показаний Холодной воды. цифры 163422/100 - это показания моего счетчик, соответственно вы ставите свои
  
int a =((myCounter.readCounter(1)+163422)/100);

// Счетчик показаний горячей воды. цифры 94888/100 - это показания моего счетчик, соответственно вы ставите свои.

  
int b =((myCounter.readCounter(2)+94888)/100); 

// выводим результат


  
Serial.print("Counter A: ");

  
Serial.println(a);

  

  
Serial.print("Counter B: ");

  
Serial.println(b);

  
Serial.println();


 
delay(5000); // это чтоб не рябило в глазах :)
 


Это так сказать минимальный скетч... а дальше уже переменные a и b можно использовать под свои нужды... передать через интернет шилд например к вашему контроллеру

Последний раз редактировалось Batons; 11.11.2014 в 14:55.
Batons вне форума   Ответить с цитированием
Старый 11.11.2014, 14:51   #3
Batons
Junior Member
 
Регистрация: 09.11.2014
Сообщений: 8
Вес репутации: 0
Batons is an unknown quantity at this point
По умолчанию Re: Arduino + DS2423

вот код библиотеки DS2423.h

PHP код:
#ifndef DS2423_h
#define DS2423_h

/*
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

    Copyright 2010 Guilherme Barros
*/


#include <OneWire.h>

#define DS2423MODEL 0x1D

#define WRITESCRATCHPAD 0x0F
#define READSCRATCHPAD  0xAA
#define COPYSCRATCHPAD  0x5A
#define READMEMORY      0xF0
#define READCOUNTER     0xA5

/*
##counters at address:
# 0x01C0-0x1DF = Counter A (1)
# 0x01E0-0x1FF = Counter B (2)
*/

typedef uint8_t DeviceAddress[8];

class 
ds2423
{
  public:
    
ds2423(OneWire*, uint8_t*);
    
bool writeMem(uint8_t*, intuint8_tuint8_t);
    
void readMem(uint8_t*, uint8_tuint8_t);
    
uint32_t readCounter(uint8_t);

  private:
    
OneWire_wire;
    
uint8_t_deviceAddress;
};
#endif 
Batons вне форума   Ответить с цитированием
Старый 11.11.2014, 14:53   #4
Batons
Junior Member
 
Регистрация: 09.11.2014
Сообщений: 8
Вес репутации: 0
Batons is an unknown quantity at this point
По умолчанию Re: Arduino + DS2423

код DS2423.cpp

PHP код:
#include "DS2423.h"

extern "C" {
  
#include "WConstants.h"
}

ds2423::ds2423(OneWire_oneWireuint8_tdeviceAddress)
{
  
_wire _oneWire;
  
_deviceAddress deviceAddress;
}
//void ds2423::setAddress(uint8_t* deviceAddress)
//{
  //_deviceAddress = deviceAddress;
//}

bool ds2423::writeMem(uint8_t_memPageint _pageSizeuint8_t _TA1uint8_t _TA2)
{
  
uint8_t myES//store ES for auth
  
  
_wire->reset();
  
_wire->select(_deviceAddress);
  
_wire->write(WRITESCRATCHPAD,0);
  
_wire->write(_TA10); //begin address
  
_wire->write(_TA20); //begin address
  //write _memPage to scratchpad  
  
for (int i 0_pageSizei++) {
    
_wire->write(_memPage[i], 0);
  }
  
  
//read and check data in scratchpad
  
_wire->reset();
  
_wire->select(_deviceAddress);
  
_wire->write(READSCRATCHPAD,0);
  if (
_wire->read() != _TA1) { //check TA1, return if bad
    
return 0;
  }
  if (
_wire->read() != _TA2) { //check TA2, return if bad
    
return 0;
  }
  
myES _wire->read(); // ES Register
  //check data written
  
for (int i 0_pageSizei++) {
    if (
_wire->read() != _memPage[i]) { //return if bad
      
return 0;
    }
  }

  
//issue copy with auth data
  
_wire->reset();
  
_wire->select(_deviceAddress);
  
_wire->write(COPYSCRATCHPAD0);
  
_wire->write(_TA10);
  
_wire->write(_TA20);
  
_wire->write(myES1); //pull-up!
  
delay(10); //5ms min strong pullup delay
  
  
_wire->reset(); //just in case...
  
return 1;
}


void ds2423::readMem(uint8_t_memAlluint8_t _TA1uint8_t _TA2)
{
  
uint8_t tmpReader;
  
bool readFF 0;
  
  
_wire->reset();
  
_wire->select(_deviceAddress);
  
_wire->write(READMEMORY0);
  
_wire->write(_TA10);
  
_wire->write(_TA20);
  for (
int memPtr 0memPtr 512memPtr++) {
    
tmpReader _wire->read();
    if (
tmpReader == 0xff & !readFF)
      
readFF 1;
    else if (
tmpReader == 0xff readFF)
      
// 0xff read twice, hopefully EoF as we break here :)
      
break;
      
    
_memAll[memPtr] = tmpReader;
  }
}

uint32_t ds2423::readCounter(uint8_t counter)
{
  
uint32_t count;
  
uint8_t myTA1;
uint8_t data[4];

  
_wire->reset();
  
_wire->select(_deviceAddress);
  
_wire->write(READCOUNTER0);

  if (
counter == 1) {
    
myTA1 0xC0;
  }
  else if (
counter == 2) {
    
myTA1 0xE0;
  }

  
_wire->write(myTA10);
  
_wire->write(0x010);

  for (
int i=0i<32i++) {
    
_wire->read(); //ignore data in that page
  
}
  
for (
int i=0i<3i++) {
    
data[i] = _wire->read();    // read in counter data
  
}
  
count data[3];
  
count count << 8;
  
count |= data[2];
  
count count << 8;
  
count |= data[1];
  
count count << 8;
  
count |= data[0];
 
  return 
count;
 

Batons вне форума   Ответить с цитированием
Старый 11.11.2014, 16:34   #5
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,607
Вес репутации: 9808
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Arduino + DS2423

Каке Вам вот такой вариант удаленного снятия показаний счетчиков
Admin вне форума   Ответить с цитированием
Старый 11.11.2014, 17:37   #6
Batons
Junior Member
 
Регистрация: 09.11.2014
Сообщений: 8
Вес репутации: 0
Batons is an unknown quantity at this point
По умолчанию Re: Arduino + DS2423

Admin
Я пару дней назад увидел Ваш сайт, прочитал и этот пост - идея отличная.
Когда я "городил" свой считыватель, то не видел эту ветку
Прочитал ветку, но как я понял, проблема обнуления счетчика при отключении энергии до конца не решена? Вышеописанная схема у меня уже год работает и сбоев или потери данных не было.

А возможно к Вашему CyberWrt напрямую (без ардуино) подключить DS2423? По аналогии как это у Вас с модулем для температурного датчика
Batons вне форума   Ответить с цитированием
Старый 11.11.2014, 18:30   #7
stD
Senior Member
 
Аватар для stD
 
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1307
stD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant futurestD has a brilliant future
По умолчанию Re: Arduino + DS2423

Что мешает записывать показания счётчика в EEPROM?
stD вне форума   Ответить с цитированием
Старый 11.11.2014, 18:37   #8
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,607
Вес репутации: 9808
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: Arduino + DS2423

Цитата:
Прочитал ветку, но как я понял, проблема обнуления счетчика при отключении энергии до конца не решена?
Решена. Используем роeтер MR3040, у него встроенный аккумулятор
Admin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 08:04. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика