Medidor de consumo electrico basado en openenergymonitor

Hola
Soy un novato al que le gusta la electronica y y aunque he programado nunca he empezado un proyecto desde cero.
Hace tiempo que tengo este proyecto, y al principio por falta de tiempo y ahora porque veo que es mucho mas complicado de lo que pense en un principio… estoy atascado :frowning:

Mi proyecto es basicamente es leer la corriente y voltaje que entra en mi casa con una pinza y un transformador
http://openenergymonitor.org/emon/buildingblocks/how-to-build-an-arduino-energy-monitor

luego mandarlo por RF a otro arduino
http://openenergymonitor.org/emon/buildingblocks/simple-rf-link

que lo recibe y lo manda por ethernet usando un enc28j60 para subirlo a emoncms
http://wiki.openenergymonitor.org/index.php?title=NanodeRF

vamos una copia del openenergymonitor pero usando un RF de 1 ‚ā¨

Mi codigo es una kk, lo se, creo que el problema es que no entiendo la libreria emonlib, que practicamente hace todo. He encontrado un proyecto (http://openenergymonitor.org/emon/archive/nokia-3310-wireless-display) que usa mi modulo de RF pero falta el codigo TX (transmisor)

Si me pudierais ayudar… Tengo que decir que los codigos de ejemplo de emonlib, virtualwire y ethercard me funcion por separado

Por favor ayuda!!! y gracias por leer esto :wink:

Mi codigo TX

#include <VirtualWire_Config.h>
#include <VirtualWire.h>

/*
emonTxV3 Real Power Example - Read from the four CT channels and Tx values via RFM12B
Requires connection of 9V AC-AC adapter for AC voltage sample
-----------------------------------------
Part of the openenergymonitor.org project
Licence: GNU GPL V3
*/

/*Recommended node ID allocation
------------------------------------------------------------------------------------------------------------
-ID- -Node Type-
0 - Special allocation in JeeLib RFM12 driver - reserved for OOK use
1-4 - Control nodes
5-10 - Energy monitoring nodes
11-14 --Un-assigned --
15-16 - Base Station & logging nodes
17-30 - Environmental sensing nodes (temperature humidity etc.)
31 - Special allocation in JeeLib RFM12 driver - Node31 can communicate with nodes on any network group
-------------------------------------------------------------------------------------------------------------
*/

//#define emonTxV3 // Tell emonLib this is the emonTx V3 - don't read Vcc assume Vcc = 3.3V as is always the case on emonTx V3 eliminates bandgap error and need for calibration http://harizanov.com/2013/09/thoughts-on-avr-adc-accuracy/

//#include <RFu_JeeLib.h> //https://github.com/openenergymonitor/RFu_jeelib
//ISR(WDT_vect) { Sleepy::watchdogEvent(); } // Attached JeeLib sleep function to Atmega328 watchdog -enables MCU to be put into sleep mode inbetween readings to reduce power consumption

#include "EmonLib.h" // Include Emon Library
EnergyMonitor ct1, ct2, ct3, ct4; // Create two instances

#define FILTERSETTLETIME 5000 // Time (ms) to allow the filters to settle before sending data

//#define RF_freq RF12_433MHZ // Frequency of RF12B module can be RF12_433MHZ, RF12_868MHZ or RF12_915MHZ. You should use the one matching the module you have.
//const int nodeID = 10; // emonTx RFM12B node ID
//const int networkGroup = 210;

typedef struct { int power1, power2, power3, power4, Vrms; } PayloadTX; // create structure - a neat way of packaging data for RF comms
  PayloadTX emontx;

boolean settled = false;
const int LEDpin=13; //emonTx V3 LED
boolean CT1, CT2, CT3, CT4;
                                                 //time between readings in s



void setup()
{
  
   vw_set_tx_pin(9); // change tx pin? Won't work??? 
    vw_setup(2000);    // Bits per sec
 // rf12_initialize(nodeID,RF_freq,networkGroup); // initialize RFM12B
 // rf12_sleep(RF12_SLEEP) ; //rf12 sleep seems to cause issue on the RFu, not sure why? Need to look into this
  
  //emonTxV3 CT channel will read ADC 0 when nothing is connected due to switched jack plugs connecting ADC to 0V when no jack is inserted
  if (analogRead(1) > 0) CT1 = 1; //check to see if CT is connected to CT1 input, if so enable that channel
  if (analogRead(2) > 0) CT2 = 1; //check to see if CT is connected to CT2 input, if so enable that channel
  if (analogRead(3) > 0) CT3 = 1; //check to see if CT is connected to CT3 input, if so enable that channel
  if (analogRead(4) > 0) CT4 = 1; //check to see if CT is connected to CT4 input, if so enable that channel
  
  Serial.begin(9600);
  Serial.println("emonTx V3 Real Power Example");
  
  // (230V x 13) / (9V * 1.2) = 276.9
  // 13: voltage divider factor
  // 1.2: 20% output voltage increase due to open circuit)
  ct1.voltage(0, 163, 1.7); // Calibration, phase_shift
  ct2.voltage(0, 276.9, 1.7); // Calibration, phase_shift
  ct3.voltage(0, 276.9, 1.7); // Calibration, phase_shift
  ct4.voltage(0, 276.9, 1.7); // Calibration, phase_shift
  
  ct1.current(1, 87.564); // CT channel 1, calibration. calibration (2000 turns / 22 Ohm burden resistor = 90.909)
  ct2.current(2, 90.9); // CT channel 2, calibration.
  ct3.current(3, 90.9); // CT channel 3, calibration.
  //CT 4 is high accuracy @ low power - 4.5kW Max
  ct4.current(4, 16.6); // CT channel 4, calibration. calibration (2000 turns / 120 Ohm burden resistor = 16.66)
  
   
  pinMode(LEDpin, OUTPUT);
  digitalWrite(LEDpin, HIGH); delay(5000); digitalWrite(LEDpin, LOW); //long flash LED to indicate power up success
  
}





void loop()
{
  if (CT1) {
  ct1.calcVI(20,2000); // Calculate all. No.of half wavelengths (crossings), time-out
  emontx.power1 = ct1.realPower;
  Serial.print(emontx.power1); Serial.print(" ");
  //Serial.print(ct1.apparentPower);
  //Serial.print(ct1.powerFactor);
  //Serial.print(ct1.apparentIrms);
  }
  
  if (CT2) {
  ct2.calcVI(20,2000); // Calculate all. No.of half wavelengths (crossings), time-out
  emontx.power2 = ct2.realPower;
  Serial.print(emontx.power2); Serial.print(" ");
}
  
  if (CT3) {
  ct3.calcVI(20,2000); // Calculate all. No.of half wavelengths (crossings), time-out
  emontx.power3 = ct3.realPower;
  Serial.print(emontx.power3); Serial.print(" ");
}
  
  if (CT4) {
  ct4.calcVI(20,2000); // Calculate all. No.of half wavelengths (crossings), time-out
  emontx.power4 = ct4.realPower;
  Serial.print(emontx.power4); Serial.print(" ");
}
  
  emontx.Vrms = ct1.Vrms*100; //AC RMS voltage - convert to integer ready for RF transmission (divide by 0.01 using emoncms input process to convert back to two decimal places)
  

  
  Serial.println(emontx.Vrms);
  delay(20);
  
  // because millis() returns to zero after 50 days !
  if (!settled && millis() > FILTERSETTLETIME) settled = true;

  if (settled) // send data only after filters have settled
  {
    send_rf_data(); // *SEND RF DATA* - see emontx_lib
    digitalWrite(LEDpin, HIGH); delay(10); digitalWrite(LEDpin, LOW); // flash LED
    delay(10000); // use delay instead of sleep since we're powering from AC
  }
  
 
}

void send_rf_data()
{
   vw_send((byte *)(&emontx), sizeof(emontx)); // esto manda la secuencia de datos
//  rf12_sleep(RF12_WAKEUP); //TO DO need to test if RFM12 sleep works on RFu
 // rf12_sendNow(0, &emontx, sizeof emontx); //send temperature data via RFM12B using new rf12_sendNow wrapper
  // set the sync mode to 2 if the fuses are still the Arduino default
  // mode 3 (full powerdown) can only be used with 258 CK startup fuses
 // rf12_sendWait(2);
 // rf12_sleep(RF12_SLEEP);
}

Mi codigo RX
No me cabe lo ponco en otro post

Perdon no cabia el codigo RX lo pongo aqui

//--------------------------------------------------------------------------------------
// Relays data received by emontx up to COSM
// Looks for 'ok' reply from http request to verify data reached COSM

// emonBase Documentation: http://openenergymonitor.org/emon/emonbase

// Authors: Trystan Lea and Glyn Hudson
// Modified for COSM by Roger James
// Modified for MX05V Radio Module by Robert Wall (OEM)
// Part of the: openenergymonitor.org project
// Licenced under GNU GPL V3
//http://openenergymonitor.org/emon/license

// EtherCard Library by Jean-Claude Wippler and Andrew Lindsay
// JeeLib Library by Jean-Claude Wippler
// VirtualWire Library http://www.pjrc.com/teensy/td_libs_VirtualWire.html
// From example by Andrew Davies - HobbyComponents.com


//   Rx MODULE CONNECTIONS:

//    PIN  DESCRIPTION      ARDUINO PIN
//    1    GND              GND
//    2    RX DATA          D2
//    3    RX DATA          N/A
//    4    VCC (5V)         VCC


//--------------------------------------------------------------------------------------

#define DEBUG     //comment out to disable serial printing to increase long term stability 
#define UNO       //anti crash watchdog reset only works with Uno (optiboot) bootloader, comment out the line if using delianuova

#include <avr/wdt.h>


//---------------------------------------------------

//---------------------------------------------------------------------
// The PacketBuffer class is used to generate the JSON string that is send via Ethernet - JeeLabs
//---------------------------------------------------------------------
class PacketBuffer : public Print {
public:
    PacketBuffer () : fill (0) {}
    const char* buffer() { return buf; }
    byte length() { return fill; }
    void reset()
    { 
      memset(buf,NULL,sizeof(buf));
      fill = 0; 
    }
    virtual size_t write (uint8_t ch)
        { if (fill < sizeof buf) buf[fill++] = ch; }
    byte fill;
    char buf[150];
    private:
};
PacketBuffer str;

//--------------------------------------------------------------------------
// Ethernet
//--------------------------------------------------------------------------
#include <EtherCard.h>		//https://github.com/jcw/ethercard 
#include <VirtualWire.h>


// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x42,0x31,0x42,0x21,0x30,0x31 };

//IP address of remote sever, only needed when posting to a server that has not got a dns domain name (staticIP e.g local server) 
byte Ethernet::buffer[700];
static uint32_t timer;

//Domain name of remote webserver - leave blank if posting to IP address 
char website[] PROGMEM = "emoncms";
// or if your posting to a static IP server:
static byte hisip[] = { 192,168,1,136 };
// change to true if you would like the sketch to use hisip
boolean use_hisip = false;  

const int redLED = 6;                     // NanodeRF RED indicator LED
const int greenLED = 5;                   // NanodeRF GREEN indicator LED

const int RX_DIO_Pin = 2;                 // Digital IO pin that will be used for receiving data from the receiver


int ethernet_error = 0;                   // Ethernet (controller/DHCP) error flag
int rf_error = 0;                         // RF error flag - high when no data received 
int ethernet_requests = 0;                // count Ethernet requests without reply                 

int dhcp_status = 0;
int dns_status = 0;
int data_ready=0;                         // Used to signal that emontx data is ready to be sent
unsigned long last_rf;                    // Used to check for regular emontx data - otherwise error

char line_buf[50];                        // Used to store line of http reply header

//**********************************************************************************************************************
// SETUP
//**********************************************************************************************************************
void setup () {
  
  //Nanode RF LED indicator  setup - green flashing means good - red on for a long time means bad! 
  //High means off since NanodeRF tri-state buffer inverts signal 
  pinMode(redLED, OUTPUT); digitalWrite(redLED,LOW);            
  pinMode(greenLED, OUTPUT); digitalWrite(greenLED,LOW);       
  delay(100); digitalWrite(redLED,HIGH);                          // turn off redLED

  /* Initialises the DIO pin used to receive data from the Rx module */
  vw_set_rx_pin(RX_DIO_Pin);
       
  /* Receive at 2000 bits per second */
  vw_setup(2000);
       
  /* Enable the receiver */
  vw_rx_start();
  
  /* Enable the Serial monitor interface */
  Serial.begin(9600);
  Serial.println("\n[webClient]");

  if (ether.begin(sizeof Ethernet::buffer, mymac, 53) == 0) {	
    if (ether.begin(sizeof Ethernet::buffer, mymac, 53) == 0) {
      Serial.println( "Failed to access Ethernet controller");
      ethernet_error = 1;  
    }

    dhcp_status = 0;
    dns_status = 0;
    ethernet_requests = 0;
    ethernet_error=0;
   
    digitalWrite(greenLED,HIGH);                                    // Green LED off - indicate that setup has finished 
 
    #ifdef UNO
    wdt_enable(WDTO_8S); 
    #endif;
  }
}

//**********************************************************************************************************************
// LOOP
//**********************************************************************************************************************
void loop () {
  
  #ifdef UNO
  wdt_reset();
  #endif

  dhcp_dns();   // handle dhcp and dns setup - see dhcp_dns tab
  
  // Display error states on status LED
  if (ethernet_error==1 || ethernet_requests > 0) digitalWrite(redLED,LOW);
    else digitalWrite(redLED,HIGH);

  //-----------------------------------------------------------------------------------------------------------------
  // 1) On RF receive
  //-----------------------------------------------------------------------------------------------------------------
 
  /* Set the receive buffer size to 2 bytes  -  change this to receive more data */
  uint8_t Buffer_Size = 2;
     
  /* Holds the received data */
  unsigned int Data;
     
  /* The receive buffer */
  uint8_t RxBuffer[Buffer_Size];

  /* Has a message been received? */
  if (vw_get_message(RxBuffer, &Buffer_Size)) // Non-blocking
  {
     /* If so, then turn on the LED connected to DIO 13
               to indicate this */
     digitalWrite(greenLED,HIGH);
       
     /* Store the received high and low byte data */
     Data = RxBuffer[0] << 8 | RxBuffer[1];

     /* Output this data to the UART */
     Serial.print("Analogue pin A0: ");
     Serial.println(Data);
       
     /* Turn off the LED on pin 13 to indicate that the
        data has now been received */
     digitalWrite(13, LOW);



     str.reset();                                                   // Reset csv string      
     str.println("rf_fail,0");                                      // RF received so no failure
     str.print("Data,");          str.println(Data);                // Add the data received
                                                                    //  Add more lines like this to send more data
                                                                    //  The format must be correct for the database receiving the data
     
     data_ready = 1;                                                // data is ready
     rf_error = 0;
  }



  //-----------------------------------------------------------------------------------------------------------------
  // 3) Send data via ethernet
  //-----------------------------------------------------------------------------------------------------------------
  ether.packetLoop(ether.packetReceive());
  
  if (data_ready) {
       
    Serial.println("CSV data"); Serial.println(str.buf); // print to serial csv string

    // Example of posting to COSM
    ethernet_requests ++;
    ether.httpPost(PSTR("/v2/feeds/YOUR FEED ID.csv?_method=put"), website, PSTR("X-ApiKey:8669bab19f8783d76b8756d09217e62a"), str.buf, my_callback);
    data_ready =0;
  }
  
  if (ethernet_requests > 10) delay(10000); // Reset the Nanode if more than 10 request attempts have been tried without a reply

}
//**********************************************************************************************************************

//-----------------------------------------------------------------------------------
// Ethernet callback
// receive reply and decode
//-----------------------------------------------------------------------------------
static void my_callback (byte status, word off, word len) {

  Serial.println("Server Reply");
  get_header_line(1, off);
  Serial.println(line_buf);
  Serial.println(strlen(line_buf));
  
  if (0 == strncmp(line_buf, "HTTP/1.1 200 OK", 15)) {
    
    get_header_line(2,off);      // Get the date and time from the header
    Serial.print("ok recv from server | ");    // Print out the date and time
    Serial.println(line_buf);    // Print out the date and time
       
    ethernet_requests = 0; ethernet_error = 0;
  }
}

Hola, creo que estas dando pasos demasiado grandes. Esta bien que te funcione las librerias por separado, es un buen comienzo, pero luego pasas a demasiado codigo que creo que no entiendes.

De la parte de TX, deberias limpiar el codigo de calculos de energia y verificar si la linea siguiente funciona

    send_rf_data(); // *SEND RF DATA* - see emontx_lib

Haz un programa muy simple que llame a las librerias adecuadas, olvidate por ahora de Emonlib y lo relacionado con Ethernet, simplemente mete valores al payload que vas a enviar así…

emontx.power4 = 12345;

Cuando empieces a recibir esto por el arduino RX entonces seguimos a√Īadiendo codigo.

en el lado RX. Quedate con este trozo, y elimina todo lo del Ethernet.

 //-----------------------------------------------------------------------------------------------------------------
  // 1) On RF receive
  //-----------------------------------------------------------------------------------------------------------------
 
  /* Set the receive buffer size to 2 bytes  -  change this to receive more data */
  uint8_t Buffer_Size = 2;
     
  /* Holds the received data */
  unsigned int Data;
     
  /* The receive buffer */
  uint8_t RxBuffer[Buffer_Size];

  /* Has a message been received? */
  if (vw_get_message(RxBuffer, &Buffer_Size)) // Non-blocking
  {
     /* If so, then turn on the LED connected to DIO 13
               to indicate this */
     digitalWrite(greenLED,HIGH);
       
     /* Store the received high and low byte data */
     Data = RxBuffer[0] << 8 | RxBuffer[1];

     /* Output this data to the UART */
     Serial.print("Analogue pin A0: ");
     Serial.println(Data);
       
     /* Turn off the LED on pin 13 to indicate that the
        data has now been received */
     digitalWrite(13, LOW);



     str.reset();                                                   // Reset csv string      
     str.println("rf_fail,0");                                      // RF received so no failure
     str.print("Data,");          str.println(Data);                // Add the data received
                                                                    //  Add more lines like this to send more data
                                                                    //  The format must be correct for the database receiving the data
     
     data_ready = 1;                                                // data is ready
     rf_error = 0;
  }

Prueba y pon tus dos nuevos programas aquí con tus resultados.
El motivo por el que no recibes mas respuestas es porque estas copiando y pegando codigo sin entenderlo todo. Por lo que los otros usuarios se encuentran con dos paginas de codigo que tendrian que ponerse a descifrar. Empieza de menos a mas.
suerte y ya nos cuentas.

Gracias Sergegsx

Creo que tienes razon, voy a probar lo que me dices.

Que queria preguntar otra cosilla del hardware, y es que como tu lo tienes montado... alimentas el arduino con el tansformador de 9v? hoy he echo una prueba y he visto que baja la medida 8v que creo que tocando la calibracion lo podria corregir. Como alimentais el arduino TX?

Gracias otra vez :slight_smile:

a que te refieres con lo de que baja la medida 8 V?

Yo alimento actualmente con 9Vdc a un switching regulator que pasa a 5 V. El rail de 2,5V lo genero con un LM358.
Otro proyecto lo alimento con 9Vac, de ahi tomo la medida de tensión de la vivienda y esta vez lo paso a un regulador lineal para obtener 5 V.

te recomiendo que por ahora lo alimentes con 9Vdc + regulador a 5V y te olvides de medir los 230Vac de la vivienda. Ya a√Īadiras eso mas adelante.

Me gusta tu idea. Mas tarde tengo que leer bien tu post. Es un poco grande y mi espa√Īol no es mu√≠ bueno.

Saludos.

EL codigo para el tx, creo que lo tengo. :slight_smile:

Por lo menos mando 4 valores por RF y los recivo bien con el ejemplo de multitransferencia que hay en la web OpenEnergyMonitor

os dejo el codigo por si, veis algo mal.

// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3
#include <VirtualWire.h>
#include "EmonLib.h"             // Include Emon Library
EnergyMonitor emon1;             // Create an instance
   // RF Wirless TX Connection 
  //------------------------------------------------------------
  int tx_pin=9;                            //connection for RF transmitter  
  //------------------------------------------------------------
  
 
  //------------------------------------------------------------
  // Timming Variables 
  //------------------------------------------------------------
  unsigned long previousMillis_power, previousMillis_temp;
  int power_postrate=30000;   //every 30s 
  //int temp_postrate=30000;  //every two min
  //------------------------------------------------------------
  
void setup()
{  
  Serial.begin(9600);
  //emonlib
  emon1.voltage(0, 170.26, 1.7);  // Voltage: input pin, calibration, phase_shift
  emon1.current(1, 111.1);       // Current: input pin, calibration.
  
  //------------------------------------------------------------
  // Setup the transmitter
  //------------------------------------------------------------
  vw_set_tx_pin(tx_pin);                      //Transmitter connected to pin 7
  vw_set_ptt_inverted(true);                 // Required for DR3100
  vw_setup(2000);	                     // Bits per
  //------------------------------------------------------------
  
}

void loop()
{
  emon1.calcVI(20,2000);         // Calculate all. No.of half wavelengths (crossings), time-out
  emon1.serialprint();           // Print out all variables (realpower, apparent power, Vrms, Irms, power factor)
  
  float realPower       = emon1.realPower;        //extract Real Power into variable
  float apparentPower   = emon1.apparentPower;    //extract Apparent Power into variable
  float powerFActor     = emon1.powerFactor;      //extract Power Factor into Variable
  float supplyVoltage   = emon1.Vrms;             //extract Vrms into Variable
  float Irms            = emon1.Irms;             //extract Irms into Variable
//------------------------------------------------------------
  // Send Data Via RF
  //------------------------------------------------------------    
  
  //define variables to send and convert float to integer
  int variableA = (int) supplyVoltage;         
  int variableB = (int) realPower ;
  int variableC = (int) powerFActor;
  int variableD = (int) Irms;
  
  
  char str_rf[30];                          //create string 
  
  itoa(variableA,str_rf,10);               //Convert to string
  strcat(str_rf,"A");                      //Add identifier character
  rfWrite(str_rf);                         //Send the string

  itoa(variableB,str_rf,10);               //Convert to string
  strcat(str_rf,"B");                      //Add identifier character
  rfWrite(str_rf);                         //Send the string
  
  itoa(variableC,str_rf,10);               //Convert to string
  strcat(str_rf,"C");                      //Add identifier character
  rfWrite(str_rf);                         //Send the string
  
  itoa(variableD,str_rf,10);               //Convert to string
  strcat(str_rf,"D");                      //Add identifier character
  rfWrite(str_rf);                         //Send the string

  //------------------------------------------------------------   
  



}

//**************************************************************************************************
// Fuctions 
//**************************************************************************************************

//-----------------------------------------------------------------------------------------------------------------------------------
// Send data via RF 
//---------------------------------------------------------------------------------------------------------------------------------- 
  void rfWrite(const char *msg)
{
  vw_send((uint8_t *)msg, strlen(msg));
  vw_wait_tx();                              // Wait until the whole message is gone
}
//----------------------------------------------------------------------------------------------------------------------------------

Ahora quiero empezar con el codigo RX, que la recepcion la tengo clara, el problema que creo que voy a tener en con como subir al EMONCMS las medidas. ¬ŅQue me recomiendas mandar Realpower o voltion y amperios?
Porque Esto no creo que funcione

if ((millis()-time60s)>60000)
  {
    time60s = millis(); // reset lastRF timer
    str.reset();
    str.print(basedir); str.print("/time/local.json?"); str.print("apikey="); str.print(apikey);
    Serial.println("Time request sent");
    ether.browseUrl(PSTR("") ,str.buf, website, my_callback);
  }

Lo he sacado de un ejemplo de openenergymonitor, pero no coincide con la ayuda de emoncms, o no lo entiendo?

Sobre la aliemtacion, Yo de momento hago como en el esquema de openenergymonitor, alimento el arduino con el usb y luego saco de sus 5v y gnd los 2,5v con las resistencias del esquema. vi que tu (creo) decias algo de probar alimentar el arduino usando el Transformador de 9vac y yo lo he probado y asi con la calibracion de no conectar nada mas que el esquema de openenergymonitor (apartir de ahora si te parece bien OEM) y si conecto un puente de diodos, condensador y reguladore de 5v la medida de 230V me dice que son 222V, pero bueno con recalibrar parece que me mide bien.
Con regulador lineal te refieres a un 7805?

cual de los 2 sistemas que tienes para sacar los 2,5v crees que es mas preciso?

Hola luisilva

luisilva yo lo saque de http://openenergymonitor.org/emon/buildingblocks/how-to-build-an-arduino-energy-monitor
Como digo mas arriba, y si sabes ingles, lo tendras mucho mas facil que yo. Porque cuando traduces con google‚Ķ pues se pierde mucho y si vas justo como yo en conocimientos de arduino‚Ķ pues lo que me pasa que llevo mas de un a√Īo dando le vueltas y hasta ahora no habia hecho mas de medir con el ejemplo de ese link. Ahora ya lo saco por pantalla lcd y lo puedo mandar por RF de los baratos. solo me falta recibirlo.

Creo que es muy util con el nuevo sistema de tarificacion el saber en que horas consumimos cuanta energia…

Gracias por vuestro interes.

¬°Una pregunta tonta! ¬ŅPorque el Arduino que tiene los sensores, no est√° conectado a internet y tienes otro para hacer esto? ¬ŅNo seria mas f√°cil, por lo menos hasta tener la medici√≥n y comunicaci√≥n con internet hecha, hacer esto de esta forma?

Hola luisilva

Pues bueno creo que es igual si lo hago primero en uno y luego los separo. hasta puede que sea mas trabajo el luego separarlo.

pero es que te comento que lo que quiero hacer parte de un proyecto de una web, entonces ya hay codigos y un esquema de como hacerlo. Yo solo no quiero usar el modulo RF que ellos usan, por precio y facilidad de conectar. el que yo uso cuesta 1‚ā¨ mas o menos y el que ellos usan se llama rfm12b y cuesta unos 6‚ā¨ eso si envia y recibe el mio solo envia y otro recibe , pero creo que no necesito mas.

un arduino que yo llamo tx tiene los sensores de corriente y el transformador para calcular el voltaje, este arduino lo normal es que se coloque dentro del cuadro de "fusibles" o magnetotermicos (por donde entra la corriente en casa) y normalmente este cuadro esta lejos del router. por eso la necesidad de 2 arduinos. uno en el cuadro y otro en el router.
Supongo que se podria usar uno arduino y ponerle wifi. pero este modulo es muy caro. Hay quien a conectado el arduino TX a un router modificado con openwrt. Pero yo enprincipio me he decantado por la versiom "original" pero sin el modulo rfm12b.

El espa√Īol se te da muy bien, pero cual es tu idioma materno?

saludos.

mirasu:
(…)
El espa√Īol se te da muy bien, pero cual es tu idioma materno?
(…)

¬ŅSe nota mucho, no? (‚ÄúUna pregunta tonta‚ÄĚ no me son√≥ muy bien) :smiley:
Soy Portugu√©s, pero estoy muy cerca de la frontera con Espa√Īa. Siempre he dicho que primero he visto ‚ÄúBarrio Sessamo‚ÄĚ y solo despu√©s (unos a√Īo mas tarde) he visto el mismo programa en Portugu√©s ‚ÄúRua Sesamo‚ÄĚ. Pensar y hablar lo llevo +/-, pero escribir creo que es bastante mas dif√≠cil, pero el corrector de firefox y el traductor de google me dan una ayuda.

Sobre tu pregunta:

¬ŅQue me recomiendas mandar Realpower o voltion y amperios?

yo enviar√≠a ‚ÄúRealpower‚ÄĚ, porque es solo un valor contra dos de ‚Äúvoltios y amperios‚ÄĚ. ¬ŅQue podr√≠as hacer con los 2 valores que no hagas con solo la potencia?

Saludos.

luisilva solo se que no eres espa√Īol por que lo dijiste tu al principio :smiley: sino no lo sabria. lo que me imagine que igual eras de latinoamerica, que igual hablan mas en ingles que espa√Īol. nose. pero solo curiosidad. :slight_smile:

Yo tambien pienso que es mejor realpower, pero como hay varias opciones... por ver si alguien con experiencia decia otra cosa :smiley:

Bueno a ver si termino el codigo de rx y lo subo.

Gracias!

Hola
Estoy un poco atascado, ayer perdi el dia intentando hacer funcionar el modulo enc28j60 que la ultima vez que lo use fue en un mega. Al final resulto que el pin CS no va al pin 10 como dicen muchos esquemas o tutoriales, sino al pin 8 como sale en las librerias. una vez parece que va bien. encuentro que el codigo de ejemplo para subir un valor a emoncms no me fucniona.
Coge los datos de la red por dhcp (ip,puerta y dns) pero cuando tiene que devolver por serial la ip del servidor emoncms.org, devuelve srv: 0.0.0.0 en el ordenador si me lo resueve bien. probe poner la ip der servidor a mano. y ya me sale srv: la ip. pero un asi no sube nada a emoncms

como podria ver por serial la URL que mando? para saber si usa la ip o intenta con el dominio.

Gracias !

/*
This is a basic web client demo sending test data to emoncms
It sends a couple of example variables in a semi-json like format: {power:252.4,temperature:15.4}
Try creating an account on emoncms.org then get the write api key and enter in line 51 replacing
the text YOURAPIKEY.
This example features both DCHP and DNS Lookup.
DHCP is where we ask the router for an ip address.
DNS is where we ask a Domain name server for the ip address of the server we want to send data to:
the domain name emoncms.org is linked to the ip address 213.138.101.177
Using DNS Lookup we can save having to remember these hard to remember strings of numbers.

-----------------------------------------
Part of the openenergymonitor.org project
Licence: GNU GPL V3
*/

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
unsigned long timer;

char website[] PROGMEM = "emoncms.org";

void setup ()
{
  Serial.begin(9600);
  Serial.println("03 - Basic Web Client");

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println( "Failed to access Ethernet controller");
    
  // DHCP Setup
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");

  ether.printIp("IP: ", ether.myip);
  ether.printIp("GW: ", ether.gwip);
  ether.printIp("DNS: ", ether.dnsip);

  // DNS Setup
  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
    
  ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if ((millis()-timer)>5000) {
    timer = millis();
    Serial.println("Request sent");
    
    // Send some test data to the server:
    ether.browseUrl(PSTR("/api/post.json?apikey=YOURAPIKEY&json="), "{power:252.4,temperature:15.4}", website, 0);
  }
}

Bueno como el enc28j60 parece que no quiere funcionar bien de momento hasta que llegue el nuevo enc28j60 lo he dejado en una pantalla lcd 16x2 inhalambrico para ver el consumo.

Puedo subir unas fotos si quereis. Igual miro montar la pantalla en una caja con un arduino mini y unas pilas :smiley: cuanto durara?

voy a abrir un nuevo post para preguntar sobre mi enc28j60 y este lo continuare cuando lo solucionerer.

Gracias

Bueno parece que el enc funciona a veces, creo que es un mal contacto de algun cable. De momento llevo 2 dias subiendo a emoncms sin cortes. pero claro no quiero ni apagar el arduino por si las moscas se estropea el invento otra vez :smiley:

ademas he dejado la pantalla lcd que tambien mola mucho.

Solo tengo un problema con un arduino mega que se calienta mucho cuando lo alimento con transformador de 12v. se calienta por encima de 50¬ļ la placa cerca del conector. y ademas no va el codigo. si pongo un blink si va. cosas que solo me pueden pasar a mi:-(

ya pondre una foto cuando sepa como hacerlo

que tienes conectado al arduino mega? ethernet? lcd?
Si alimentas con 12 V el regulador lineal se calienta mucho ya que tiene que bajar hasta 5V.
Utiliza un voltaje menor, o alimenta directamente con 5V regulados a el pin 5V

Hola!, yo hace un tiempo que tenia pensado meter una pinza para leer el paso de corriente por el diferencial de mi casa, el caso es que por estar en un proyecto u otro no he tenido tiempo. Hace 15 dias pedi la SCT 013 000 (0-100A In - 33mA Out) y la recibir ayer.

Anoche me lie a montar el Divisor de tension (10k) y la resistencia de carga (33ohm para 5v), lamentablemente no tengo una de 33ohm... :frowning:

Esta lectura la voy a insertar directamente en Souliss, para tener los graficos y el control remoto, un compa√Īero ya lo tiene correctamente integrado, pero el utiliza como resistencia de carga 2 resistencias de 100ohm en serie, es decir 200ohm, lo cual limita el rango de lectura a 17.algo Amperios, unos 4000w (perdon si los calculos no son exactos, estoy en el trabajo y no lo puedo mirar :() y como valor de calibracion en la funcion de la libreria en lugar de 111.1 establece un 10.

Tengo dudas sobre como funciona la calibracion, que creo que es precisamente mi problema, investigaré mas acerca de ello....

El caso es que yo he utilizado una resistencia de 220ohm y valor de calibracion 10 (porque he probado con una resistencia variable de 2k ajustada a 35ohm, pero no me fio... xD) y me da estos valores:

2.34 0.01
2.15 0.01
2.26 0.01
2.46 0.01
2.58 0.01
2.81 0.01
3.28 0.01
3.62 0.02
3.65 0.02
3.69 0.02
5.58 0.02
5.81 0.03
5.77 0.03
5.74 0.02
5.77 0.03
5.80 0.03
5.73 0.02
5.78 0.03
5.73 0.02

Los valores entre 2 y 3 son con un calefactor de 2000w con el enchufe desconectado, los valores superiores a 5 con el calefactor conectado.

Son valores normales? o es que yo no se leerlos? si las formulas no las tengo muy oxidadas 2000w/220v = 9.09A, no?

Aqui unas capturas para que veais como queda integrado en Souliss :slight_smile: (El voltaje era 217v en sus pruebas con el tester) y conecto un secador de pelo en 2 potencias.


Tambien tenemos ya integrado el modulo con attiny que envia los pulsos del contador a un nodo por RX. Es mas preciso, aunque lo ideal seria meterle un RTC o recibir la hora por NTP.

Bueno, gracias al que me haya leido el post entero :stuck_out_tongue:

Salu2 y buen Karma.

Nota para mi: Acabo de ver que en las fotos el compa√Īero pinza unicamente la fase.... Ser√° posible que sea tan zoquete que no haya pensado en eso?? Esta noche lo pruebo :stuck_out_tongue: Igualmente necesito saber como funciona el dato "calibration"... XD esta noche investigar√©.

Foto: https://10892483715139151254.googlegroups.com/attach/a2aeed6a20515fb4/Foto%201.JPG?part=0.2&view=1&vt=ANaJVrGjodX5yjR4ysH7E8qp_aFQB_RsHB1kjcIG16jOE5vvGseLQljS98ukejeceJDeKRSxoKNWcVbDb4tcVAnU6fdypthJN2HoNK1Tjt_SAyVDfiERf5w

Me auto-respondo =)

Nota IMPORTANTE "Conectar" el CT unicamente a la fase!! xDD

Con una resistencia de 220ohm se configura con un valor de 10.

Medido con equipos de 30 - 150 - 300 - 1000 - 2000w =)

Ahora a Souliss =) Facil y sencillo :stuck_out_tongue:

Salu2 y buen Karma

Hola Sergegsx

Al arduino le conecto un lcd 1602, un receptor rf barato en ebay y el enc28j60. Antes tenia varios problemas uno era un cable que no estaba bien y el otro es que parece que el arduino nano no aguanta los 111mA en su regulador a 3,3v del enc28j60. y solo tengo otro arduino con regulador a 3,3v y es el mega, ahora en el mega me va todo muy bien. Pero lo quiero pasar a un arduino mas peque√Īo, me gustaria usar un paperduino con un regulador con diodo zener y una resistencia de 22ohm pero se me calienta mucho la resistencia y el enc28j60 no tira.

En otro post me han dicho que el mega se calienta porque mis tranformadores son una kk, he probado varios de los que tengo por casa y uno de ellos de los que puedes elejir la salida entre 3 y 12v. asi que lo alimento por usb.

hola juanpintom

Me alegro que te vaya tan bien.

yo tanpoco tenia la resistencia de 33ohm asi que junte 2 y tengo 33 o 32ohm. luego el regulador lo hice con resistencias de 470kohm que las recomiendan en el foro, creo que consumen menos.

tu usas una resistencia de 220ohm? no te limitara el muestreo? supongo que si te va bien en todas esas potencias sera que no:-D
Por cierto no se si la pinza hay que ponerla en la fase, lo que si se es que si te da calores negativos hay que darle la vuelta a la pinza teniendo en cuenta la flecha que tiene.

en cuanto reciba el nuevo enc28j60 que pedi cuando pensaba que el mio estaba roto... me gustaria empezar a hacer algo con sourliss, desde que me lo ense√Īaste me gusto.

unas dudas que tengo :smiley:

Os ha cabido el montaje transmisor en la caja de magnetotermicos? sino como lo habeis solucionado?

hace poco contrate "la tarifa nocturna" y estoy pensando en adaptar el codigo a esta tarifa y que me guarde cada periodo por separado. Pienso en aprovechar la hora que devuelve el servidor. que os parece?

Me gustaria alimentar el enc28j60 con un diodo zener y una resistencia de 22ohm, pero la resistencia se me calienta mucho y el enc28j60 no va. creo que la resistencia es de poca potencia. hay alguna manera de aprovechar los diodos que compre? :frowning: para alimentar los 111mA del modulo?

Muchas gracias por la ayuda.

Os ha cabido el montaje transmisor en la caja de magnetotermicos? sino como lo habeis solucionado?

Yo no he montado nada aun... pero vaya, en un attiny cabe... :stuck_out_tongue:

tu usas una resistencia de 220ohm? no te limitara el muestreo?

Lo limita a 4000w 17A, pero le da mas precision, ya lo iré probando.

hace poco contrate "la tarifa nocturna" y estoy pensando en adaptar el codigo a esta tarifa y que me guarde cada periodo por separado. Pienso en aprovechar la hora que devuelve el servidor. que os parece?

Se estan planteando varias alternativas para meter un RTC, todo es cuestion de hacer pruebas, yo ahora mismo no tengo mucho tiempo, pero si te atreves... :stuck_out_tongue: Otra es hacerlo por NTP o subirlo a Xively, sera por opciones...

Me gustaria alimentar el enc28j60 con un diodo zener y una resistencia de 22ohm, pero la resistencia se me calienta mucho y el enc28j60 no va. creo que la resistencia es de poca potencia. hay alguna manera de aprovechar los diodos que compre? :frowning: para alimentar los 111mA del modulo?

El ENC yo lo tengo a 5v...

Salu2

Hola juanpintom

A ver si me pido un par de moculos RF y pruebo con un attiny seria la leche, aunque me extra√Īa porque en el foro no dicen nada de usarlo, yo lo probare pero si tu haces algun avance no dudes en comentarlo :smiley:

17A para mi es mas que suficiente. lo probare

sobre la TNocturna creo que si le meto un rtc me cargo el mega que ya va justo :smiley:
ademas ahora el servidor emoncms me devuelve la hora

static void my_callback (byte status, word off, word len) {

  Serial.println("Server Reply");
  get_header_line(1, off);
  Serial.println(line_buf);
  Serial.println(strlen(line_buf));
  
  if (0 == strncmp(line_buf, "HTTP/1.1 200 OK", 15)) {
    
    get_header_line(2,off);      // Get the date and time from the header
    Serial.print("ok recv from server | ");    // Print out the date and time
    Serial.println(line_buf);    // Print out the date and time
    
    // Decode date time string to get integers for hour, min, sec, day
    // We just search for the characters and hope they are in the right place
    char val[1];
    val[0] = line_buf[23]; val[1] = line_buf[24];
    int hour = atoi(val);
    val[0] = line_buf[26]; val[1] = line_buf[27];
    int minute = atoi(val);
    val[0] = line_buf[29]; val[1] = line_buf[30];
    int second = atoi(val);
    val[0] = line_buf[11]; val[1] = line_buf[12];
    int day = atoi(val);
    
    // Don't send all zeros, happens when server failes to returns reponce to avoide GLCD getting mistakenly set to midnight
    if (hour>0 || minute>0 || second>0) 
    {  
      delay(100);
    
//      char data[] = {'t',hour,minute,second};
//      int i = 0; while (!rf12_canSend() && i<10) {rf12_recvDone(); i++;}
//      rf12_sendStart(0, data, sizeof data);
//      rf12_sendWait(0);
    
   //   Serial.println("time sent to emonGLCD");
    }
    
    ethernet_requests = 0; ethernet_error = 0;
  }

mi idea es poner un if hora => 13 y Luego si es es mejor que 23 pues es hora puta… Vamos que lo tengo que mirar mucho. pero creo que se podra hacer. luego como representarlo en emoncms es otra cosa.

tio el enc28j60 lo tienes a 5v? He oido que hay algunos que admiten 5v porque llevan un regulador en la placa. pero pensaba que tu usabas diodos. cuando me llegue el otro igual pruebo aunque tambien he comprado diodos normales para poner en serie y bajar la tension a ver si asi va.

Gracias por contestar , un saludo