Navigation

    • Register
    • Login
    • OpenHardware.io
    • Categories
    • Recent
    • Tags
    • Popular
    1. Home
    2. derrij
    3. Best
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    Best posts made by derrij

    • Momert 5848-9 bathroom scale (reading from lcd)

      Thanks to http://quo.vadis.stojkovic.ch/hacking-a-weighing-scale/ and http://troels.leegaard.org/misc/grundtal20047/ I hacked Momert 5848-9 bathroom scale http://momert.eu/index.php/en/products?page=shop.product_details&flypage=flypage.tpl&category_id=16&product_id=158

      Pin arrangement the same as on IKEA Grundtal scales http://troels.leegaard.org/misc/grundtal20047/grundtal20047.pdf

      Putting 3V to each lcd pin you can figure out what is each pin for. I used 13 lcd pins from 16. https://www.youtube.com/watch?v=yGe3wtwzqf0

      Some photos 20141008_133123.jpg 20141012_150321.jpg 20141012_150915.jpg

      CODE:
      #include <Sleep_n0m1.h>
      #include <SPI.h>
      #include <EEPROM.h>
      #include <RF24.h>
      #include <Sensor.h>

      	#define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
      	#define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
      	#define DI_ID 1                              // Id of the sensor child
      	#define SA_ID 2                              // Id of the sensor child
      	#define VI_ID 3                              // Id of the sensor child
      	#define ALL_ID 4                              // Id of the sensor child
      
      
      	#define DEBUG 1
      
      	int pa,pb,pc,pd;
      	int           lcdA=0,lcdB=0,lcdC=0,lcdD=0;
      	bool          lcd1,lcd2,lcd3,lcd4,lcd5,lcd6,lcd7,lcd8,lcd9;
      	unsigned int  SAn, SBn, SCn, SDn;
      	unsigned int  SA[9], SB[9], SC[9], SD[9];
      	bool          A[9], B[9], C[9], D[9];
      	double weight;                     
      	double oldweight=0;
      
      
      	Sensor gw;
      	Sleep sleep;
      
      	//calculate weight
      	int getDigit(int d)
      	{
      		// d=0,1,2,3
      		int i = 2*d+0;
      		int j = 2*d+1;
      		
      		if ( A[i] &&  A[j] && !B[i] &&  B[j] &&  C[i] &&  C[j] &&  D[i]) return 0; //ok
      		if (!A[i] && !A[j] && !B[i] &&  B[j] && !C[i] &&  C[j] && !D[i]) return 1; //ok
      		if (!A[i] &&  A[j] &&  B[i] &&  B[j] &&  C[i] && !C[j] &&  D[i]) return 2; //ok
      		if (!A[i] &&  A[j] &&  B[i] &&  B[j] && !C[i] &&  C[j] &&  D[i]) return 3; //ok
      		if ( A[i] && !A[j] &&  B[i] &&  B[j] && !C[i] &&  C[j] && !D[i]) return 4; //ok
      		if ( A[i] &&  A[j] &&  B[i] && !B[j] && !C[i] &&  C[j] &&  D[i]) return 5; //ok
      		if ( A[i] &&  A[j] &&  B[i] && !B[j] &&  C[i] &&  C[j] &&  D[i]) return 6; //ok
      		if (!A[i] &&  A[j] && !B[i] &&  B[j] && !C[i] &&  C[j] && !D[i]) return 7; //ok
      		if ( A[i] &&  A[j] &&  B[i] &&  B[j] &&  C[i] &&  C[j] &&  D[i]) return 8; //ok
      		if ( A[i] &&  A[j] &&  B[i] &&  B[j] && !C[i] &&  C[j] &&  D[i]) return 9; //ok
      		return 0;
      	}
      
      
      	void setup()  
      	{  
      	  gw.begin();
      
      	  // Send the sketch version information to the gateway and Controller
      	  gw.sendSketchInfo("Weight Meter", "1.0");
      
      	  pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
      	  // Register all sensors to gw (they will be created as child devices)
      	  gw.sendSensorPresentation(DI_ID, S_WEIGHT);       
      	  gw.sendSensorPresentation(SA_ID, S_WEIGHT); 
      	  gw.sendSensorPresentation(VI_ID, S_WEIGHT); 
      	  gw.sendSensorPresentation(ALL_ID, S_WEIGHT); 
      	}
      
      	void loop()     
      	{     
      
      	  getweightnow();
      
      	 
      	  #if DEBUG
      	  Serial.println("Sleeping.");
      	  #endif
      	  delay(400); //delay to allow serial to fully print before sleep
      	  gw.powerDown();
      	  sleep.pwrDownMode(); //set sleep mode
      	  sleep.sleepInterrupt(INTERRUPT,CHANGE);
      	}
      
      	void getweightnow() {
      	  
      			lcdA = analogRead(A0);
      			lcdB = analogRead(A1);
      			lcdC = analogRead(A2);
      			lcdD = analogRead(A3);
      		// waiting for display (interruption will continue from here)
      		#if DEBUG
      		   Serial.println("Stepped on scale");
      		#endif
      	  
      		// make sure that LCD is active
      	 
      	  
      		// starts measuring
      		#if DEBUG
      			 Serial.println("Mesuring");
      		#endif
      
      		SAn = SBn = SCn = SDn = 0;
      		for (int i=0; i<9; i++)
      			SA[i] = SB[i] = SC[i] = SD[i] = 0;
      		int i=0;
      	  //run while backplanes are active  
      	  while ((lcdA!=0 || lcdB!=0 || lcdC!=0 || lcdD!=0)) {
      			lcdA  = analogRead(A0);
      			lcdB  = analogRead(A1);
      			lcdC  = analogRead(A2);
      			lcdD  = analogRead(A3);
      			 
      			lcd1  = digitalRead(A4);
      			lcd2  = digitalRead(A5);
      			lcd3  = digitalRead(2);
      			lcd4  = digitalRead(3);
      			lcd5  = digitalRead(4);
      			lcd6  = digitalRead(5);
      			lcd7  = digitalRead(6);
      			lcd8  = digitalRead(7);
      			lcd9  = digitalRead(8);
      
      			// decode A, B, C and D signals to -1, 0, 1
      			pa = 0;
      			if (lcdA < 300) pa=-1; else if (lcdA > 600) pa=1;
      			pb = 0;
      			if (lcdB < 300) pb=-1; else if (lcdB > 600) pb=1;
      			pc = 0;
      			if (lcdC < 300) pc=-1; else if (lcdC > 600) pc=1;
      			pd = 0;
      			if (lcdD < 300) pd=-1; else if (lcdD > 600) pd=1;
      			lcdA = pa; lcdB = pb; lcdC = pc; lcdD = pd;
      	  
      			if (lcdA!=0 && lcdB==0 && lcdC==0 && lcdD==0 || 
      				lcdA==0 && lcdB!=0 && lcdC==0 && lcdD==0 || 
      				lcdA==0 && lcdB==0 && lcdC!=0 && lcdD==0 || 
      				lcdA==0 && lcdB==0 && lcdC==0 && lcdD!=0)
      			{
      				if (lcdA==1 || lcdB==1 || lcdC==1 || lcdD==1)
      				{
      					lcd1 = 1-lcd1;
      					lcd2 = 1-lcd2;
      					lcd3 = 1-lcd3;
      					lcd4 = 1-lcd4;
      					lcd5 = 1-lcd5;
      					lcd6 = 1-lcd6;
      					lcd7 = 1-lcd7;
      					lcd8 = 1-lcd8;
      					lcd9 = 1-lcd9;
      				}
      	  
      				if (lcdA != 0)
      				{
      					SA[0] += lcd1;
      					SA[1] += lcd2;
      					SA[2] += lcd3;
      					SA[3] += lcd4;
      					SA[4] += lcd5;
      					SA[5] += lcd6;
      					SA[6] += lcd7;
      					SA[7] += lcd8;
      					SA[8] += lcd9;
      					SAn++;
      				}
      				if (lcdB != 0)
      				{
      					SB[0] += lcd1;
      					SB[1] += lcd2;
      					SB[2] += lcd3;
      					SB[3] += lcd4;
      					SB[4] += lcd5;
      					SB[5] += lcd6;
      					SB[6] += lcd7;
      					SB[7] += lcd8;
      					SB[8] += lcd9;
      					SBn++;
      				}
      				if (lcdC!=0)
      				{
      					SC[0] += lcd1;
      					SC[1] += lcd2;
      					SC[2] += lcd3;
      					SC[3] += lcd4;
      					SC[4] += lcd5;
      					SC[5] += lcd6;
      					SC[6] += lcd7;
      					SC[7] += lcd8;
      					SC[8] += lcd9;
      					SCn++;
      				}
      				if (lcdD!=0)
      				{
      					SD[0] += lcd1;
      					SD[1] += lcd2;
      					SD[2] += lcd3;
      					SD[3] += lcd4;
      					SD[4] += lcd5;
      					SD[5] += lcd6;
      					SD[6] += lcd7;
      					SD[7] += lcd8;
      					SD[8] += lcd9;
      					SDn++;
      				}           
      	  
      				i++;
      			}
      	  
      		
      
      	  if (lcdA==-1 && lcdB==-1 && lcdC==-1  && lcdD==-1 && lcd9==0 && (SA[0]+SA[1]+SA[2]+SA[3]+SA[4]+SA[5]+SA[6]+SA[7]+SA[8]>0)) {
      
      	  
      		// measuring is done
      		#if DEBUG
      			   Serial.println("Done");
      		#endif
      	  
      		// finding the average of signals values during measuring period
      		// not 100% correct, but the fastest way I could think of
      		for (int i=0;i<9;i++)
      		{
      			A[i] = (1.0 * SA[i] / SAn >0.5);
      			B[i] = (1.0 * SB[i] / SBn >0.5);
      			C[i] = (1.0 * SC[i] / SCn >0.5);
      			D[i] = (1.0 * SD[i] / SDn >0.5);
      		}
      
      		// decoding
      		float weight = 100.0*getDigit(0) + 10.0*getDigit(1) + 1.0*getDigit(2) + 0.1*getDigit(3);
      	   
      		#if DEBUG
      		  Serial.print("Weight is: ");
      		  Serial.println(weight);
      		#endif
      		  if (weight != oldweight) {
      			gw.sendVariable(DI_ID, V_WEIGHT, weight,3);               // Send volume value to gw
      		#if DEBUG
      		  Serial.println("Sent");
      		#endif
      			oldweight = weight;
      		  } 
      	break;
      		
      		} //end of if
      	} //end of while  
      
      	}
      

      And now is the question S_WEIGHT sensor-type are working on MySensors Arduino Library (v1.3) and VERA Lite as controller. Or do i need *Sensor1.json *Sensor1.xml files for it working? Because when i included scales node to Vera and restarted Luup, after that all nodes stoped working. Only restoring VERA from backup are helped.

      posted in Hardware
      derrij
      derrij
    • RE: [SOLVED] MDRemote stop working in last beta

      @gohan yes

      posted in Domoticz
      derrij
      derrij
    • RE: Connect Serial Gateway to Openwrt routers TX RX pins

      MySensors and Domoticz are the best!
      I did not think it would be so easy.
      I did not have to make changes to the router's firmware.
      All i need set speed in serial gateway

      #define MY_BAUD_RATE 115200
      

      On router make

      ln -s /dev/ttyS0 /dev/ttyUSB1
      
      
      posted in Hardware
      derrij
      derrij