<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.opensourceecology.de/index.php?action=history&amp;feed=atom&amp;title=ZACmeter-Anwendungsprogram</id>
	<title>ZACmeter-Anwendungsprogram - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.opensourceecology.de/index.php?action=history&amp;feed=atom&amp;title=ZACmeter-Anwendungsprogram"/>
	<link rel="alternate" type="text/html" href="https://wiki.opensourceecology.de/index.php?title=ZACmeter-Anwendungsprogram&amp;action=history"/>
	<updated>2026-05-14T19:29:41Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Open Source Ecology - Germany</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://wiki.opensourceecology.de/index.php?title=ZACmeter-Anwendungsprogram&amp;diff=7970&amp;oldid=prev</id>
		<title>Case: Created page with &quot;&lt;source lang=&quot;cpp&quot;&gt;  #include &lt;Wire.h&gt;  #include &lt;LiquidCrystal_I2C.h&gt;  #include &lt;EtherCard.h&gt;  // ethernet interface mac address, must be unique on the LAN static byte mymac[...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.opensourceecology.de/index.php?title=ZACmeter-Anwendungsprogram&amp;diff=7970&amp;oldid=prev"/>
		<updated>2013-04-08T22:32:00Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;  #include &amp;lt;Wire.h&amp;gt;  #include &amp;lt;LiquidCrystal_I2C.h&amp;gt;  #include &amp;lt;EtherCard.h&amp;gt;  // ethernet interface mac address, must be unique on the LAN static byte mymac[...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt; &lt;br /&gt;
#include &amp;lt;LiquidCrystal_I2C.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;EtherCard.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// ethernet interface mac address, must be unique on the LAN&lt;br /&gt;
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };&lt;br /&gt;
static byte myip[] = { 192,168,178,4 };&lt;br /&gt;
&lt;br /&gt;
byte Ethernet::buffer[500];&lt;br /&gt;
BufferFiller bfill;&lt;br /&gt;
&lt;br /&gt;
// word len;&lt;br /&gt;
// word pos;&lt;br /&gt;
&lt;br /&gt;
LiquidCrystal_I2C lcd(0x20,8,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display&lt;br /&gt;
&lt;br /&gt;
const int s1 = 10;     // the number of the pushbutton pin&lt;br /&gt;
const int s2 = 9;     // the number of the pushbutton pin&lt;br /&gt;
&lt;br /&gt;
// Referenzwert zur Multiplikation mit den Werten der Analogports (0...1023), &lt;br /&gt;
// um auf die Voltzahl zu kommen (0...5). &lt;br /&gt;
// Ergibt sich aus 5/1024. (d.h., Systemspanung / Bit-Auflösung)&lt;br /&gt;
// z.B. const float referenzwert = 0.0048828125;	// Referenzwert in Volt&lt;br /&gt;
// oder const float referenzwert = 4.8828125;	        // Referenzwert in mV&lt;br /&gt;
const float Usys = 5.16;   // Systemspannung an AVR-NetIO mit PC-Netzteil&lt;br /&gt;
// const float Usys = 4.89;   // Systemspannung an Arduino-Mega mit USB-Stromversorgung&lt;br /&gt;
float referenzwert = Usys/1024*1000; // Referenzwert in mV&lt;br /&gt;
&lt;br /&gt;
#define  PINUbatt   13       // Analog PIN Batteriespannung&lt;br /&gt;
#define  PINUDS     14       // Analog PIN Spannungsabfall am FET (Drain-Source)&lt;br /&gt;
#define  PINRelais  15       // Digital PIN Relais oder MOSFET&lt;br /&gt;
#define  PINStart   9       // Digital PIN Startknopf &lt;br /&gt;
#define  PINStart2  10       // Digital PIN Startknopf &lt;br /&gt;
&lt;br /&gt;
#define  Umin 950           // mV Spannung bei der Entladung abgebrochen wird&lt;br /&gt;
#define  INTERVAL  2000     // Zeit fuer Schleife&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// div. Globals&lt;br /&gt;
long loopTime = INTERVAL;&lt;br /&gt;
long loopUsedTime = INTERVAL;&lt;br /&gt;
long loopStart = 0;&lt;br /&gt;
long uhrzeit = 0;&lt;br /&gt;
long verstrichen = 0;&lt;br /&gt;
float U = 0;&lt;br /&gt;
float Ufet = 0;&lt;br /&gt;
float Udiff = 0;&lt;br /&gt;
float Uopen = 0;&lt;br /&gt;
float I = 0;&lt;br /&gt;
float P = 0;&lt;br /&gt;
float Q = 0;&lt;br /&gt;
float Ah = 0;&lt;br /&gt;
float Rlast = 1.5; // Lastwiderstand zur Entladung&lt;br /&gt;
float Rbat = 0;  // Innenwiderstand der Batterie&lt;br /&gt;
&lt;br /&gt;
long loopCount = 0;&lt;br /&gt;
boolean start = false;&lt;br /&gt;
boolean ende = false;&lt;br /&gt;
&lt;br /&gt;
void setup()  {&lt;br /&gt;
  //Serial.begin(19200);&lt;br /&gt;
  pinMode(PINRelais, OUTPUT);&lt;br /&gt;
  pinMode(PINStart, INPUT); // Start Taster &lt;br /&gt;
  //digitalWrite(PINStart, HIGH); // je nachdem, ob High- oder Low-aktiver Button&lt;br /&gt;
  digitalWrite(PINStart, LOW);&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(PINRelais,LOW);   // Relais bzw. Mosfet aus &lt;br /&gt;
  &lt;br /&gt;
  lcd.init();                      // initialize the lcd &lt;br /&gt;
 &lt;br /&gt;
  if (ether.begin(sizeof Ethernet::buffer, mymac,28) == 0)&lt;br /&gt;
  {&lt;br /&gt;
    // Serial.println( &amp;quot;Failed to access Ethernet controller&amp;quot;);&lt;br /&gt;
    lcd.setCursor(0,0);&lt;br /&gt;
    lcd.print(&amp;quot;eth0 failed&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
    lcd.clear();&lt;br /&gt;
  }  &lt;br /&gt;
  ether.staticSetup(myip);&lt;br /&gt;
 &lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.setCursor(0,0);&lt;br /&gt;
  lcd.print(&amp;quot;Kap-tester V.005&amp;quot;);&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  lcd.print(&amp;quot;by OS 04/2013&amp;quot;);&lt;br /&gt;
  delay(2000);&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  &lt;br /&gt;
  Uopen = analogRead(PINUbatt)*referenzwert;       // in mV&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()  {&lt;br /&gt;
 &lt;br /&gt;
  // start = true;   // Für (Batterie-)Messung bis zum bitteren Ende, d.h. Tiefentladung&lt;br /&gt;
  &lt;br /&gt;
  // erstmal Spannung messen  - solange der Starttknopf nicht gedrueckt wurde - nach dem Test auch wieder hier rein...&lt;br /&gt;
  while (start==false) &lt;br /&gt;
  { &lt;br /&gt;
    U = analogRead(PINUbatt)*referenzwert;       // in mV&lt;br /&gt;
    Uopen = U;&lt;br /&gt;
    //print_ser();&lt;br /&gt;
    print_lcd();&lt;br /&gt;
    //if (digitalRead(PINStart)==LOW) {&lt;br /&gt;
    if (digitalRead(PINStart)==HIGH) {&lt;br /&gt;
    start = true;&lt;br /&gt;
    ende = false;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
  uhrzeit = millis();&lt;br /&gt;
  verstrichen = millis()-uhrzeit;&lt;br /&gt;
&lt;br /&gt;
  while(verstrichen &amp;lt; INTERVAL-10)&lt;br /&gt;
  {&lt;br /&gt;
    word len = ether.packetReceive();&lt;br /&gt;
    word pos = ether.packetLoop(len);  &lt;br /&gt;
    if (pos)  // check if valid tcp data is received&lt;br /&gt;
      ether.httpServerReply(homePage()); // send web page data&lt;br /&gt;
      &lt;br /&gt;
    verstrichen = millis()-uhrzeit;&lt;br /&gt;
  } // end of while  &lt;br /&gt;
   &lt;br /&gt;
  //delay(2000);&lt;br /&gt;
  } // end of while&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(PINRelais,HIGH);   // Relais ein  &lt;br /&gt;
  &lt;br /&gt;
  loopStart = millis();&lt;br /&gt;
  &lt;br /&gt;
  U = analogRead(PINUbatt)*referenzwert;      // in mV&lt;br /&gt;
  Ufet = analogRead(PINUDS)*referenzwert;     // in mV&lt;br /&gt;
  Udiff = U-Ufet;&lt;br /&gt;
  &lt;br /&gt;
  //I = Udiff/1.5;     // in mA&lt;br /&gt;
  //I = U-Ufet/1.5;    // in mA  Achtung: Falsche Schreibweise !!! Punkt vor Strichrechnung !!!&lt;br /&gt;
  I = Udiff/Rlast;   // in mA&lt;br /&gt;
&lt;br /&gt;
  // Leistung&lt;br /&gt;
  P = (I*U)/1000;   // in mW&lt;br /&gt;
  Q += P * loopTime / 3600 / 1000;         // in mWh&lt;br /&gt;
  &lt;br /&gt;
  // Kapazität in mAh&lt;br /&gt;
  Ah += I * loopTime / 3600 / 1000;          // in mAh&lt;br /&gt;
  &lt;br /&gt;
  // Innenwiderstand der Batterie&lt;br /&gt;
  Rbat = (Uopen - U) / I;&lt;br /&gt;
  &lt;br /&gt;
  //print_ser();&lt;br /&gt;
  print_lcd();&lt;br /&gt;
  &lt;br /&gt;
  if(U &amp;lt;= Umin) {                     // wenn Batteriespannung unter eingest. Mindestspannung faellt&lt;br /&gt;
    digitalWrite(PINRelais,LOW);      // Test abbrechen&lt;br /&gt;
    start = false;&lt;br /&gt;
    //Serial.println(&amp;quot;Stop&amp;quot;);&lt;br /&gt;
    ende = true;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
  loopCount++;&lt;br /&gt;
  loopUsedTime = millis()-loopStart;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
  while(loopUsedTime &amp;lt; INTERVAL-10)&lt;br /&gt;
  {&lt;br /&gt;
    word len = ether.packetReceive();&lt;br /&gt;
    word pos = ether.packetLoop(len);  &lt;br /&gt;
    if (pos)  // check if valid tcp data is received&lt;br /&gt;
      ether.httpServerReply(homePage()); // send web page data&lt;br /&gt;
      &lt;br /&gt;
    loopUsedTime = millis()-loopStart;&lt;br /&gt;
  } // end of while  &lt;br /&gt;
  &lt;br /&gt;
  loopTime = millis() - loopStart;&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void print_lcd()  {&lt;br /&gt;
  lcd.clear();&lt;br /&gt;
  lcd.print(U/1000,2);    // Spannung in Volt anzeigen&lt;br /&gt;
  lcd.print(&amp;quot;V&amp;quot;);&lt;br /&gt;
  lcd.setCursor(6,0);&lt;br /&gt;
  format_print(I);&lt;br /&gt;
  lcd.print(&amp;quot;mA&amp;quot;); &lt;br /&gt;
  lcd.setCursor(13,0);&lt;br /&gt;
  if (start==false &amp;amp;&amp;amp; ende == false) lcd.print(&amp;quot;STA&amp;quot;);   //  ST - Startknopf druecken&lt;br /&gt;
  if (start==true) lcd.print(&amp;quot;RUN&amp;quot;);                     //  RU - Test runnig...&lt;br /&gt;
  if (ende==true) lcd.print(&amp;quot; END&amp;quot;);                      //  E  - Test Ende&lt;br /&gt;
  lcd.setCursor(0,1);&lt;br /&gt;
  format_print(Q);&lt;br /&gt;
  lcd.print(&amp;quot;mWh&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
/*  lcd.setCursor(10,1);&lt;br /&gt;
  //lcd.print(Ufet/1000,4);&lt;br /&gt;
  lcd.print(Udiff/1000,4);&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  lcd.setCursor(11,1);&lt;br /&gt;
  lcd.print(loopCount/(60000/INTERVAL));                &lt;br /&gt;
  lcd.print(&amp;quot;:&amp;quot;);&lt;br /&gt;
  if(((loopCount%(60000/INTERVAL))*INTERVAL/1000)&amp;lt;10)  lcd.print(&amp;quot;0&amp;quot;);&lt;br /&gt;
  lcd.print((loopCount%(60000/INTERVAL))*INTERVAL/1000);  &lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
void format_print (float value){ // in Ausgabe passende Anzahl Spaces einfuegen - 4stellige Zahl&lt;br /&gt;
  if (value &amp;lt; 1000)lcd.print(&amp;quot; &amp;quot;);&lt;br /&gt;
  if (value &amp;lt; 100) lcd.print(&amp;quot; &amp;quot;);&lt;br /&gt;
  if (value &amp;lt; 10)  lcd.print(&amp;quot; &amp;quot;);&lt;br /&gt;
  lcd.print(value,0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//void print_ser()  {&lt;br /&gt;
//  Serial.print(loopCount/(60000/INTERVAL));&lt;br /&gt;
//  Serial.print(&amp;quot;:&amp;quot;);&lt;br /&gt;
//  if(((loopCount%(60000/INTERVAL))*INTERVAL/1000)&amp;lt;10)  Serial.print(&amp;quot;0&amp;quot;);&lt;br /&gt;
//  Serial.print((loopCount%(60000/INTERVAL))*INTERVAL/1000);&lt;br /&gt;
//  Serial.print(&amp;quot;    &amp;quot;);&lt;br /&gt;
//  Serial.print((int)U);                       Serial.print(&amp;quot; mV   &amp;quot;);&lt;br /&gt;
//  Serial.print((int)Ufet);                    Serial.print(&amp;quot; mV   &amp;quot;);&lt;br /&gt;
//  Serial.print((int)I);                       Serial.print(&amp;quot; mA   &amp;quot;);&lt;br /&gt;
//  Serial.print((int)P);                       Serial.print(&amp;quot; mW       &amp;quot;);&lt;br /&gt;
//  Serial.print((int)Q);                       Serial.println(&amp;quot; mAh&amp;quot;);&lt;br /&gt;
//}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
static word homePage() {&lt;br /&gt;
  long t = millis() / 1000;&lt;br /&gt;
  word h = t / 3600;&lt;br /&gt;
  byte m = (t / 60) % 60;&lt;br /&gt;
  byte s = t % 60;&lt;br /&gt;
  &lt;br /&gt;
  word Up = U;&lt;br /&gt;
  word Ip = I;&lt;br /&gt;
  word Qp = Q;&lt;br /&gt;
  word Ap = Ah;&lt;br /&gt;
  word Rp = Rbat;&lt;br /&gt;
  &lt;br /&gt;
  bfill = ether.tcpOffset();&lt;br /&gt;
  bfill.emit_p(PSTR(&lt;br /&gt;
    &amp;quot;HTTP/1.0 200 OK\r\n&amp;quot;&lt;br /&gt;
    &amp;quot;Content-Type: text/html\r\n&amp;quot;&lt;br /&gt;
    &amp;quot;Pragma: no-cache\r\n&amp;quot;&lt;br /&gt;
    &amp;quot;\r\n&amp;quot;&lt;br /&gt;
    &amp;quot;&amp;lt;meta http-equiv='refresh' content='10'/&amp;gt;&amp;quot;&lt;br /&gt;
    &amp;quot;&amp;lt;title&amp;gt;Kapazitaetslogger&amp;lt;/title&amp;gt;&amp;quot; &lt;br /&gt;
    // &amp;quot;&amp;lt;h1&amp;gt;$D$D:$D$D:$D$D &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; $DmV $DmA $DmAh&amp;lt;/h1&amp;gt;&amp;quot;),&lt;br /&gt;
    &amp;quot;&amp;lt;h1&amp;gt;$D$D:$D$D:$D$D $D $D $D $D $D &amp;lt;/h1&amp;gt;&amp;quot;),&lt;br /&gt;
      h/10, h%10, m/10, m%10, s/10, s%10, Up, Ip, Qp, Ap, Rp);&lt;br /&gt;
  return bfill.position();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Case</name></author>
	</entry>
</feed>