Na een heel weekend prutsen, ben ik behoorlijk de wanhoop nabij. Het leek allemaal zo eenvoudig...
Wat wil ik bereiken? 1 waarde uitlezen via P1 uitgang van mijn nieuwe Sagemcom S211 slimme meter. Welke waarde? De huidige teruglevering (vaak aangeduid als "mEAT") = wat ik op dit moment terugsteek op het net. Er hoeft helemaal niets weggeschreven te worden naar een cloud, gewoon die éne waarde binnenhalen. Op basis van die waarde wil ik in 2de instantie een relay aansturen.
Ik heb de video ESP8266-based P1-port sensor sending data to Domoticz - YouTube nauwgezet gevolgd. Ja, dit gaat veel verder - waardes versturen via internet, maar momenteel krijg ik zelfs niet 1 waarde te zien. Obstakels die ik al verholpen heb = "no matching function for call to softwareserial::softwareserial int, int, bool, int" bij het compilen. Dit kon ik oplossen door de esp8266 Arduino boards package version te downgraden tot een versie lager dan versie 2.6.0.
De code laadt momenteel in mijn nodemcu, de kabel is gemaakt zoals in de video en aangesloten zoals in de video, maar klopt dit = geen enkele weerstand, transistor of wat dan ook??
Wat hoop ik = dat iemand, een goede ziel, me aan een "eenvoudig" script kan helpen zodat ik mijn huidig verbruik kan uitlezen met mijn nodemcu. Graag ook een bevestiging of de schakeling uit de video ok is. RJ11/12 kabel = 1 (niet aangesloten), 2 (naar VIN), 3 (naar GND), 4 (niet aangesloten), 5 (naar D2), 6 (niet aangesloten). Het bordje wordt gevoed vanaf mijn computer met een USB kabel naar de USB-ingang. De VIN stuurt 5V naar P1 van mijn digitale meter. GND - GND nodemcu. 5 rechtstreeks naar D2 (klopt dit? Ik dacht dat D2 3,3V wou = in de video wordt gewerkt met WeMos die eveneens 3,3V wil). Alles op 115200 baudrate.
Alvast hartelijk dank! Ik denk dat een oplossing voor dit probleem veel mensen kan vooruithelpen, nu in België de digitale meter uitgerold wordt.
"Hoe activeer of deactiveer ik de gebruikerspoorten van mijn digitale meter?
Om je gebruikerspoorten te openen, of daarna opnieuw te sluiten, moet je een aanvraag indienen. De P1- en S1-poorten worden altijd samen geactiveerd of gedesactiveerd.
Dank voor uw antwoord. Terechte opmerking, maar dat had ik inderdaad gedaan. Poort staat open (en schuifbalk naar rechts) en ook de pijl staat op de digitale meter zichtbaar.
Misschien vraag ik heel veel ineens. En werk ik beter in stukjes.
1: Hoe sluit ik mijn Nodemcu aan op de digitale meter. De kabel RJ11/12 is gemaakt (variant met 4 draden). Rechtstreeks op de Nodemcu (of Arduino UNO: heb ik ook liggen). Geen weerstanden noch transistors nodig? De YouTubevideo laat uitschijnen van niet.
2: Wat is de makkelijkste code om op de seriële monitor te kunnen lezen wat de digitale meter verstuurt?
Ik heb (helaas?) geen slimme meter en heb me nooit verdiept in de materie. Ik kan alleen lezen wat anderen schreven maar dat biedt geen meerwaarde. Je kan dus enkel vertrouwen op wat ze zeggen.
Het is meestal een open-collector output. Dan is er een transistor en een paar weerstanden nodig. Soms is het nodig om 5V op de RTS pin te zetten, terwijl 3.3V nodig is voor de transistor.
Stuur dat telegram eerst eens naar de Serial Monitor, dan weet je dat je iets ontvangt.
Ik denk dat ik toch 5V aanlever. Mijn NodeMCU wordt gevoed vanaf computer-USB. De VIN geeft 5V naar slimme meter.
Ik vind het voorstel om eerst alles naar Serial Monitor te sturen goed. Hoe kan ik (als ik enkel de drie draden aankoppel zoals nu het geval is), de volledige boodschap naar de Serial Monitor sturen in het absolute minimum regels code? De voorbeeldcodes die ik vind, willen alles meteen naar een cloud of een database doorsturen, terwijl ik eigenlijk enkel de output wil zien op mijn seriële monitor.
Diegene met het Youtube filmpje, heeft zijn code op Github, daar zie ik in BelgianSmartMeterToDomoticz.ino dat de SoftwareSerial op de ESP8266 op deze manier wordt gebruikt:
#define MAXLINELENGTH 4096 // longest normal line is 47 char (+3 for \r\n\0)
#define SERIAL_RX 2 // pin for SoftwareSerial RX
SoftwareSerial mySerial(SERIAL_RX, -1, true, MAXLINELENGTH); // (RX, TX. inverted, buffer)
En in setup staat:
mySerial.begin(115200);
Beide seriele poorten hebben natuurlijk een .begin(baudrate) nodig.
Het lijkt me beter om ook de Serial Port naar de computer op 115200 te zetten. Je kunt in setup() alvast een Serial.println( "hallo"); doen, dan weet je dat het werkt.
Hoe het zit met het signaal inverteren begrijp ik nog niet.
Heb je voldoende informatie ? Als het niet werkt, dan graag de hele sketch laten zien en is de P1-poort aangezet zoals @ArdLab_Gent schreef ?
De code die ik gebruikte op een Arduino UNO deze keer (want weet niet eens of een NODEMCU-digitale poort signalen geleverd door een 5V device aankan...) is de volgende:
Klinkt misschien dom, maar ik ben al blij dat er elke seconde iets (totale onzin weliswaar) binnenkomt. Ik neem aan dat dit data is die aangeleverd wordt door P1. Die staat zeker aan.
Waaraan zou de onzin te wijten zijn? Zou ik toch ergens iets van hardware moeten tussen de meter en de arduino zetten (om te inverteren) of is dat een raar idee? Een weerstand van 1k Ohm of zelfs 10k Ohm geeft dezelfde onzin als geen weerstand.
Meestal duidt zulke "onzin" op een verkeerde baudrate, of op een geïnverteerd signaal.
Dat zijn dingen die Koepel ook al aangaf, en de baudrate heb je in ieder geval al naar zijn tips ingesteld.
Je kunt eens gaan zoeken in de AltSoftSerial documentatie of die het inverteren van de data kan afhandelen (de vaste seriële poort van de Arduino schijnt dat wel te ondersteunen, of andere controllers dat ook kunnen weet ik niet).
Wanneer je dat niet via software kunt oplossen, zul je het hardwarematig moeten doen (dan heb je een (extra) transistor nodig).
Als ik nu dit schema toepas http://domoticx.com/p1-poort-slimme-meter-uitlezen-hardware/, maar met een 2N3904 (EBC) transistor (heb de transistor BC547 = EBC niet liggen), en ik draai de transistor 180 graden, zou het dan toch moeten werken? Helaas is dat niet het geval. Waar loopt het fout?
Ondertussen zelf nog heel wat opgezocht. Het signaal moet inderdaad geïnverteerd worden en de transistor die ik gebruikte kan dit helaas niet. Dus bij een Chinees kwaliteitshuis meteen 7404 IC gekocht. Hopelijk werkt het daarmee wel. Wordt vervolgd...
De 2N3904 is een gewone NPN transistor. Kun je dat proberen ?
Je kunt dat schema van domoticx gebruiken. Die diodes en condensator heb ik niet. Ik heb R1 = 2k2, R2 = 4k7, R3 = 4k7, Q1 = BC547B. Ook heb ik 5V naar R1 en 3.3V naar R3.
Met een Serial.println( "hallo"); in setup() heb je meer informatie. Als je dat ziet, dan werkt dat deel.
EBC transistoren bestaan niet, maar men zal over het algemeen wel weten wat je daarmee bedoelt.
Je zou inderdaad het best het schema van dhr. Otten aanhouden.
Je kunt de diodes en de condensator overslaan zoals Koepel ook gedaan heeft.
De diodes beveiligen tegen bijvoorbeeld overspanning maar de kans daarop is hier heel klein.
De condensator filtert korte stoorpulsen er uit, en kan bij een langere kabel wel nuttig zijn.
Zoals je ook aan Koepel's antwoord ziet, kun je een beetje spelen met de waardes van de weerstanden en heb je dus ruimte wanneer je niet precies de juiste waardes hebt.
De genoemde waardes 1K, 2K2, 4K7 en 10 K moet iedere hobbyist eigenlijk wel in huis hebben en 12 K past in diezelfde reeks
In jouw bewoordingen is de BC547 een CBE transistor en de 2N3904 een EBC transitor.
Daarmee zou je 'm inderdaad op z'n kop kunnen plaatsen (met de bolle kant naar je toe in plaats van de platte kant), en zou het een aardig eind moeten werken.
Omdat je dit als een schakelaar gebruikt en niet als een versterker, kun je wat afwijken met die weerstanden.
Om hiervoor een IC zoals die 7404 te gebruiken is dikke overkill en wat mij betreft slaat dat nergens op.
Heb je de FET liggen (BS 170, die heb ik zelf nog nooit gebruikt), dan kun je je wat weerstanden uitsparen zoals je ziet.
Natuurlijk volstaat dan iedere N-channel FET die je met een lage spanning (5 volt) volledig open kunt sturen.
Bedankt voor alle reacties. Ondertussen (door al jullie input!!) weer een grote stap verder. Ik kan met een Arduino UNO alles uitlezen! Ik heb dit schema gebruikt: Bekijk image
Helaas... Die NodeMCU geeft maar de eerste drie lijnen weer... Daar moest ik de SoftwareSerial bibiliotheek gebruiken ipv de AltSoftSerial-bibliotheek die ik op mijn Arduino draai. Zou dat daaraan liggen? Of eerder aan de snelheid van die NodeMCU (misschien kan dat plaatje ineens niet zoveel data ontvangen.
Hartelijk dank aan iedereen die me al geholpen heeft!
De SoftwareSerial op een Uno belast de hele Uno, maar het werkt met 115200 baud. De AltSoftSerial is minder belastend, maar kan zo'n hoge baudrate niet aan (ik las dat het verbeterd was, maar dat heb ik nog niet getest).
Voor zover ik weet is de beste oplossing een SoftwareSerial op de NodeMCU (ESP8266), waar je mee begon. De ingangen van een ESP8266 zijn min of meer 5V-tolerant, dus ze gaan niet stuk met een signaal van 5V. Als dat niet werkt, dan is er misschien iets anders aan de hand.
Had je problemen met de AltSoftSerial op een NodeMCU ? Ik wist niet eens dat die library op een NodeMCU gebruikt kon worden.
Arduino UNO = AltSoftSerial = draaide op 115200 baud.
NodeMCU = SoftwareSerial = krijg maar de eerste drie regels binnen.
Vraag = Zijn er voor de NodeMCU andere oplossingen?
Of moet ik ergens een waarde veranderen zodat alles kan binnenkomen?
Dank u voor alle reacties!
Daar staan 2 en een halve COM (UART) poorten vermeld (in lichtblauw).
RXD1 ontbreekt, vandaar de halve.
Ik heb geen idee of dit klopt en of je dat als hardware COM poorten kunt gebruiken, maar als dat zo is dan kun je je een hoop gedoe besparen met softwarematige oplossingen.
Verder is de controller in dat ding veel krachtiger dan die in de Arduino UNO zit.
Zo is ie 5 tot 10 maal zo snel (kloksnelheid, dat is niet per se verwerkingssnelheid), 32 bit in plaats van 8 bit, en heel veel meer geheugen.
Daarom kan ik me niet voorstellen dat dat ding dit niet aan zou kunnen.
Natuurlijk kan ik niet spreken voor de mogelijkheden en /of beperkingen die in de softwareserial oplossing zitten.