Мониторинг веса и MajorDoMo

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Vadymkyr
Сообщения: 125
Зарегистрирован: Ср дек 26, 2012 8:33 pm
Откуда: Севастополь
Благодарил (а): 0
Поблагодарили: 1 раз

Мониторинг веса и MajorDoMo

Сообщение Vadymkyr » Пт фев 01, 2013 8:48 pm

Написал простенький скетч для ардуино. Есть 5 кнопок, подключенных к аналоговому входу 0 и LCD.

Код: Выделить всё

#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7);
int analogPin = 0;     
int val = 0;   
double v = 70;
float u = 48.1;

 
void setup()
{
  lcd.begin(16, 2);  
 Serial.begin(9600); 
}
 
void loop()
{
  lcd.setCursor(0, 0);
  lcd.print("Ulen'ka");
  lcd.setCursor(8, 0);
  lcd.print(u,1);
  lcd.setCursor(14, 0);
  lcd.print("KG");
  lcd.setCursor(0, 1);
  lcd.print("Vadym");
  lcd.setCursor(8, 1);
  lcd.print(v,1);
  lcd.setCursor(14, 1);
  lcd.print("KG");
  
  
  val = analogRead(analogPin);
if (val == 480) //left
  {u -=0.1;  delay(100);}
else if (val == 0) // right
  {u +=0.1;  delay(100);}  
else if (val == 131) //up
  {v +=0.1;  delay(100); }
else if (val == 307) //down
 { v -=0.1;  delay(100);}
  else if (val == 721) //select
  {Serial.print("Ulen'ka  ");
  Serial.print(u);
  Serial.println(" kg");
  Serial.print("Vadym  ");
  Serial.print(v);
  Serial.println(" kg");
  delay(1000);
  }
}
Изображение
подскажите, как интегрировать в majordomo, что бы можно было посмотреть на графике и данный хранились долго в базе.
Думаю использовать блютус для передачи данных
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Мониторинг веса и MajorDoMo

Сообщение sergejey » Пт фев 01, 2013 10:45 pm

если вес в переменной u, то можно просто сделать вывод такого плана:

Код: Выделить всё

char buf[80];
int u1= (u - (int)u) * 100; // выделяем дробную часть
sprintf(buf, "GET /objects/?object=user1&op=m&m=weightChanged&w=%0d.%d HTTP/1.0", (int)u, abs(u1));
Serial.println(buf);
Вышеописанный код вызовет метод user1.weightChanged, в котором сам вес будет доступен как $params['w']

Это при условии, если ардуино подключается без ethernet-shield-а.

Иначе вместо Serial.println(buf); нужно организовать отправку http-запроса на сервер.

Мне больше интересней сам механизм -- как устроены весы?

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Vadymkyr
Сообщения: 125
Зарегистрирован: Ср дек 26, 2012 8:33 pm
Откуда: Севастополь
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Мониторинг веса и MajorDoMo

Сообщение Vadymkyr » Пт фев 01, 2013 10:57 pm

весы обыкновенные:), просто когда взвесился - тыкнул кнопочку - подкорректировал вес, нажал SELECT и отправилось по UART.
сейчас еще попробую с ecn28j60 и чтобы сервер забирал данные как веб-переменную
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Мониторинг веса и MajorDoMo

Сообщение sergejey » Сб фев 02, 2013 11:09 am

Vadymkyr писал(а):весы обыкновенные:), просто когда взвесился - тыкнул кнопочку - подкорректировал вес, нажал SELECT и отправилось по UART.
сейчас еще попробую с ecn28j60 и чтобы сервер забирал данные как веб-переменную
А! :) Я думал Arduino сразу с весов информацию получает )) Я просто подобные проекты в инете видел, но там всё как-то сложно было, а тут смотрю, что как-то совсем просто, поэтому и не понял как именно.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Vadymkyr
Сообщения: 125
Зарегистрирован: Ср дек 26, 2012 8:33 pm
Откуда: Севастополь
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Мониторинг веса и MajorDoMo

Сообщение Vadymkyr » Сб фев 02, 2013 2:25 pm

можно конечно и напрямую с весов данные снимать. Но есть одна проблема, как различать, кто встал на весы.
Подскажите пожалуйста, как полученные данные выводить на график.
Создал Class: Weight, добавил новое свойство w, указал хранение истории 500.
создал в классе объект ju, в нем свойство ju.
В настройках веб-переменных указал связанный объект.свойство ju.ju.
Данные забираются в формате xx,xx(пример 48,39)
но по ссылке 127.0.0.1/pchart/?p=ju.ju&type=1h график не выводится.
подскажите, что сделал не так?
Спасибо
Изображение
Аватара пользователя
sergejey
Site Admin
Сообщения: 4286
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 76 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Мониторинг веса и MajorDoMo

Сообщение sergejey » Сб фев 02, 2013 2:29 pm

Так... Я думаю тут логически лучше по-другому поступить. Я бы сделал класс Users в нём свойство weight (обязательно отметить, что нужно хранить историю свойства -- это нужно для графика). Далее можно сделать объект этого класса ju -- а потом просто устанавливать свойство ju.weight и соответственно его использовать для графика. Для добавления второго человека нужно будет просто создаеть ещё один объект класса Users (например va) и устанавливать свойство va.weight.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Vadymkyr
Сообщения: 125
Зарегистрирован: Ср дек 26, 2012 8:33 pm
Откуда: Севастополь
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Мониторинг веса и MajorDoMo

Сообщение Vadymkyr » Сб фев 02, 2013 3:24 pm

сделал, как Вы сказали. график не изменился
127.0.0.1/pchart/?p=ju.weight&type=1h
Изображение
хотя в свойствах объект данные изменяются

подскажите пожалуйста, как еще можно передавать данные с arduino(не через веб-переменные)

вод такой сейчас скетч

Код: Выделить всё

#include <LiquidCrystal.h>
#include "etherShield.h"
#include "ETHER_28J60.h"

int outputPin = 6;
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};                                                          
static uint8_t ip[4] = {192, 168, 1, 16};                      
static uint16_t port = 80;                                      
ETHER_28J60 e;

LiquidCrystal lcd(8,9,4,5,6,7);
int analogPin = 0;     
int val = 0;   
double v = 70;
float u = 48.1;
float uold = 0;
float vold = 0;
char buf[80];
byte u_l[8] = {     
  B10010,
  B10101,
  B10101,
  B11101,
  B10101,
  B10101,
  B10010,
  B00000
};

byte l_l[8] = {  
  B00111,
  B01001,
  B01001,
  B01001,
  B01001,
  B01001,
  B11001,
  B00000
};
byte b_l[8] = {
  B10000,
  B10000,
  B10000,
  B11110,
  B10001,
  B10001,
  B11110,
  B00000
};

byte d_l[8] = {
  B00110,
  B01010,
  B01010,
  B01010,
  B01010,
  B11111,
  B10001,
  B00000
};

byte i_l[8] = {
  B10001,
  B10001,
  B10011,
  B10101,
  B11001,
  B10001,
  B10001,
  B00000
};

byte m_l[8] = {
  B10001,
  B10001,
  B11011,
  B10101,
  B10101,
  B10001,
  B10001,
  B00000
};

byte k_l[8] = {
  B00000,
  B00000,
  B10010,
  B10100,
  B11000,
  B10100,
  B10010,
  B00000
};

byte g_l[8] = {
  B00000,
  B00000,
  B11110,
  B10010,
  B10000,
  B10000,
  B10000,
  B00000
};

void setup()
{
  e.setup(mac, ip, port);
  lcd.begin(16, 2);  
 lcd.createChar(0, u_l);
 lcd.createChar(1, l_l);
 lcd.createChar(2, b_l);
 lcd.createChar(3, d_l);
 lcd.createChar(4, i_l);
 lcd.createChar(5, k_l);
 lcd.createChar(6, g_l);
 
}
 
void loop()
{
  
  lcd.setCursor(0,0);
  lcd.write(0);
  lcd.write(1);
  lcd.print("E");
  lcd.print("H");
  lcd.write(2);
  lcd.print("K");
  lcd.print("A");
 
  lcd.setCursor(9, 0);
  lcd.print(u,1);
  lcd.setCursor(14, 0);
  lcd.write(5);
  lcd.write(6);
  
  lcd.setCursor(0,1);
  lcd.print("B");
  lcd.print("A");
  lcd.write(3);
  lcd.write(4);
  lcd.print("M");
  
  lcd.setCursor(9, 1);
  lcd.print(v,1);
  lcd.setCursor(14, 1);
  lcd.write(5);
  lcd.write(6);
 
  val = analogRead(analogPin);
if (val == 480) //left
  {u -=0.1;  delay(150);}
else if (val == 0) // right
  {u +=0.1;  delay(150);}  
else if (val == 131) //up
  {v +=0.1;  delay(150); }
else if (val == 307) //down
 { v -=0.1;  delay(150);}
  else if (val == 721) //select
  
uold = u;
vold = v;

  }
 char* params;
   if (params = e.serviceRequest())
  {int u1= (uold - (int)uold) * 100;
  int v1= (vold - (int)vold) * 100;
  e.print("Julia: ");
    e.print(uold);
    e.print(",");
    e.print(abs(u1));
    e.print(" kg"); 
    e.print("<br><br>");
    e.print("Vadym: ");
    e.print(vold);
    e.print(",");
    e.print(abs(v1));
    e.print(" kg"); 
    e.respond();
  }
  
  
}
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Мониторинг веса и MajorDoMo

Сообщение Alex » Сб фев 02, 2013 3:59 pm

Но есть одна проблема, как различать, кто встал на весы.
:D :D :D Дык по весу и различать. :D :D :D
Vadymkyr
Сообщения: 125
Зарегистрирован: Ср дек 26, 2012 8:33 pm
Откуда: Севастополь
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Мониторинг веса и MajorDoMo

Сообщение Vadymkyr » Сб фев 02, 2013 4:04 pm

Alex писал(а):
Но есть одна проблема, как различать, кто встал на весы.
:D :D :D Дык по весу и различать. :D :D :D
а если у двух человек очень близкий вес?
и еще не хотелось бы делать весы стационарными.
Vadymkyr
Сообщения: 125
Зарегистрирован: Ср дек 26, 2012 8:33 pm
Откуда: Севастополь
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Мониторинг веса и MajorDoMo

Сообщение Vadymkyr » Вс фев 03, 2013 9:56 pm

подскажите, как график победить?
Ответить