Joysticken har hittills hängt löst, så nu gjorde jag en "pendant".
IMG_20200320_121854.jpg
Det var meningen, att det skulle komma några tryckknappar på den också, men nu har elektronikbutiken stängt på obestämd tid, så det får bli till senare.
Eftersom jag f.n. använder endast 8 bevattningszoner (och därmed 8 fuktsensorer) har jag 8 analoga ingångar på två 4-ports moduler oanvända.
Jag tänkte då att jag använder 4 av dessa portar till att mäta de [4] olika matninsspänningarna. Då kan jag också koppla den nya volt/amperemetern direkt på batterispänningen (24 VDC) och då kommer jag ifrån [den irriterande] missvisningen som den mellanliggande dioden ger.
De övriga spänningarna tänkte jag avläsa i programmet och visa på systemets LCD-skärm.
Sagt och gjort!
AD-omvandlaren (PCF8591) tål bara 6 VDC ingång, så jag räknade och mätte upp lämpliga motstånd för att göra spänningsfördelare för respektive spänning (24, 12, 5 och 3.3V).
Så satte jag in en läsrutin i en lämplig meny (=> Systemstatus) och...
...men där har jag kört FAST!
Jag får inte läst rätt värde från PCF8591:an, men jag hittar inte felet. Det vansinniga är, att ifall jag har en s.g.s. identisk testrutin får jag rätt värden, men inte då samma rutin är inbakad i växthussystemets program.
Så här ser rutinen ut i växthussystemet (vissa parametrar och funktioner är satta tidigare i programmet, ex. I2C-bussen, Serialspeed, mm.):
Kod: Markera allt
void Menu23() { // Status
const byte resniva[6] = { 0, 10, 25, 50, 75, 100};
byte rv0, rv1, rv2, rv3;
float volt[4];
Serial.println("PCF8591 actual...");
Wire.beginTransmission(0x4A); //(AnSet[2]);
Wire.write(0x04);
Wire.endTransmission();
Wire.requestFrom(0x4A,5); //(AnSet[2], 5);
rv0 = Wire.read();
rv0 = Wire.read();
rv1 = Wire.read();
rv2 = Wire.read();
rv3 = Wire.read();
volt[0] = rv0 * 0.11171;
volt[1] = rv1 * 0.0556;
volt[2] = rv2 * 0.02272;
volt[3] = rv3 * 0.02025;
Serial.print(rv0); Serial.print(" "); Serial.print(volt[0]); Serial.println(" VDC");
Serial.print(rv1); Serial.print(" "); Serial.print(volt[1]); Serial.println(" VDC");
Serial.print(rv2); Serial.print(" "); Serial.print(volt[2]); Serial.println(" VDC");
Serial.print(rv3); Serial.print(" "); Serial.print(volt[3]); Serial.println(" VDC");
och så här ser testprogrammet ut:
Kod: Markera allt
#include "Wire.h"
#define PCF8591 (0x4A) // I2C bus address
byte rv0, rv1, rv2, rv3;
float volt[4];
void setup()
{
Wire.begin();
Serial.begin(115200);
}
void loop()
{
Serial.println("PCF8591 test...");
Wire.beginTransmission(0x4A);
Wire.write(0x04);
Wire.endTransmission();
Wire.requestFrom(0x4A, 5);
rv0=Wire.read();
rv0=Wire.read();
rv1=Wire.read();
rv2=Wire.read();
rv3=Wire.read();
volt[0] = rv0 * 0.11171;
volt[1] = rv1 * 0.0556;
volt[2] = rv2 * 0.02272;
volt[3] = rv3 * 0.02025;
Serial.print(rv0); Serial.print(" "); Serial.print(volt[0]); Serial.println(" VDC");
Serial.print(rv1); Serial.print(" "); Serial.print(volt[1]); Serial.println(" VDC");
Serial.print(rv2); Serial.print(" "); Serial.print(volt[2]); Serial.println(" VDC");
Serial.print(rv3); Serial.print(" "); Serial.print(volt[3]); Serial.println(" VDC");
Serial.println();
delay(10000);
}
Här är utskriften från respektive program. Första talet på raden är det lästa värdet från resp. AD (8-bitar), det andra talet är omvandlat till spänning. (omvandlingskoefficienten är förstås olika för resp. spänning).
Kod: Markera allt
PCF8591 actual...
192 21.45 VDC
192 10.68 VDC
192 4.36 VDC
192 3.89 VDC
PCF8591 test...
202 22.57 VDC
216 12.01 VDC
223 5.07 VDC
167 3.38 VDC
Alla fysiska komponenter är de samma och testen körs i själva växhussystemet, så ifall något annat inverkar, borde det rimligtvis påverka testet också.
Tilläggas bör, att växthusprogrammet inte någonstans försätter AD-modulerna i någon speciell mod, el. dyl.
Kan någon av er se felet? Jag får inget grepp om det!
Jag funderade också ifall det dynamiska minnet är slut, men jag tycker inte det verkar så.
Växthusprogrammet tar 27836 bytes (90%) och de globala variablerna 903 bytes (44%).
Nu är variablerna rvx och volt[x] definierade lokalt. Jag testade också med att definiera dom globala, men enda skillnaden var, att globala variablerna ökade till 45%.
Mätresultatet var detsamma.
Har någon några råd eller förslag?