24V DC- & 230 Volt AC mini-windgenerator installatie

Aangeschaft om mee te experimenteren: Een mini windgenerator met 24V, 3 fasen en 400 Watt maximale opbrengst.  Inclusief regelaar om op een 24V accu aan te sluiten.

Daarachter komt de 24V DC naar 230V AC  2000 Watt , met het lichtnet gesynchroniseerde inverter.

Daarmee kan ik in huis alles aansluiten, behalve de grootverbruikers.  Verlichting is natuurlijk geen probleem, en de laptop voeden ook niet.  Voor de rest moeten we alles nog proberen, dat hoort ook zo bij een experimentele opzet.

De miniturbine komt op de nok van het dak met een verticale steigerbuis , tussen de huizen in en maakt geen herrie.  Het ontwerp van de Savonius turbine windvanger is daar op afgestemd.

 

Als test worden ook de 5 oorspronkelijke ‘schelp’-achtige rotorbladen gemonteerd, waarvan zowel geluid- als energieproductie wordt gemeten.

De 3-fase mini generator wordt met de regelaar (rechtsonder) geremd wanneer er te veel stroom wordt opgewekt…. . De montageplaat (rechtsboven) past op een 28mm buis en wordt aan deze buis gelast.  Dat past vervolgens in een steviger standaard diameter masttype.
De montageplaat voor de verticale mini savonius windvanger
Diameter van de montageplaat is ca 15 centimeter

De buitenpijp wordt verticaal op het dak net boven mijn Velux dakraam geplaatst , zo hoog mogelijk tegen de nokbalk aan,.

VOORBEELD van een mastinstallatie OP het dak. Dit wordt ook mijn manier van opstellen. De beugel is besteld.
Overzicht van het schuine dak met zonnepanelen en dakramen. Het gele vlakje geeft aan waar de dakbeugel voor de windrotor komt.

https://www.durasat.de/out/media/14473_DUR-line-Herkules_Produktinfo(3).pdf

De geaarde 3-fasekabel gaat door de mast door het dak naar binnen en de aarding van de mast en de gehele installatie komt rechtstreeks aan de al aanwezige aardinstallatie van de zonnepanelen.

De regelaar en de gesloten accu komt in de afgesloten beluchte CV ruimte op zolder.  Daar wordt de nieuwe windinstallatie aangesloten op de bestaande huisinstallatie, met een fasegestuurde omschakelaar.

De zonnepanelen (met een output aan 230V AC) gaan de 24V accu ook laden wanneer de windinstallatie onvoldoende oplevert en vice versa.

Meerdere holle samengestelde buizen samenvoegen met Openscad curvedPipe libs

OPEN curvedPipe for pipeconnector 4 into 1 FLAT 2023 05 01 V4 dev a.SCAD

OPEN curvedPipe for pipeconnector 4 into 1 FLAT 2023 05 01 V4 dev a.STL

 

Kijkje in de binnenkant.  De instellingen van Openscad moeten behoorlijk omhoog v.w.b. de CSG limiet om de cutouts aan te kunnen qua renderen.

Video van WhatsApp op 2023-05-02 om 23.08.14

snelle draft met 0.3mm LH en 220mms/ geprint op de Voron 2.4 50% scaled
in oranje ASA op de Voron 2.4 op 50% scaling
2 in 1 met dikke wanden 25% scaled, ASA op Voron 2.4. en 8.5 mm buiten diameter

Pipeconnector 2 into 1 all tight_hollow 2023 05 03 V4 dev b STL download

NB: Ik heb er voor gekozen om de 3 libs in de main code op te nemen zodat ik waar nodig nog makkelijk kan wijzigen zoals alles omzetten van child naar children.

 

Pipeconnector 3 into 1 all hollow 2023 05 26 V5 dev d 

 

STL file download voor windturbine, genereer zelf stroom op je dak

Vertical wind turbine Jantec.nl 2023 04 22 V2 DEVb

STL file om met je 3d printer uit te printen, ca 20 cm breed en ca 20cm hoog!

Er kan een 8mm bout of draadeind van boven naar onder door om vast te maken op bijvoorbeeld een oude dynamo uit een auto, of op een DC generator., of op een stappenmotor.

Plaats het op je dak en je kan (wanneer het waait) een accu opladen of binnen je licht gebruiken!

De 24V DC- & 230 Volt AC mini-windgenerator installatie:

En dit is waar de turbine op komt met 2x12V = 24V accu’s en een 24V naar 230 V inverter.

De 3-fase generator wordt met de regelaar (rechtsonder) geremd wanneer er te veel stroom wordt opgewekt…. . De montageplaat (rechtsboven) past op een 28mm buis en wordt aan de buis gelast.

En deze “Wind1500W Solar1500W, Auto 12V 24V, External Wind-Solar Hybrid” controller heb ik ervoor aangeschaft, omdat deze zowel de zonnepanelen als de windmolen bedient (als er voldoende wind is schakelt de controller over op wind, anders gebruikt hij de zonnepanelen):

5 Printbare STL files voor een tafellampje met waxinelicht

In deze versie heeft de waxinelichthouder een lagere open bolvorm, zodat hij kan worden gebruikt met een waxinelichtje.

Verderop staan de 4 versies van de recht uitlopende theelichthouder die ook goed geschikt zijn voor gebruik met een waxinelichtje.

Een elektrisch waxinelichtje is natuurlijk ook heel geschikt.

Een houder voor een elektrisch waxinelichtje met een hogere naar binnen lopende rand staat in het andere artikel.  Die versie is niet geschikt voor een waxinelichtje met een vlam, want een vlam kan de hogere, meer naar binnen staande rand vervormen.

Tea light chandelear convex and sphere Jantec.nl 2023 04 18 V9 STL DOWNLOAD

Versie 1;  Cylinder waxinelichthouder extra hoog

Tea light chandelear straight very high size Jantec.nl 2023 04 20 V2b STL DOWNLOAD 

 

Versie : Hoog

Tea light chandelear straight high size Jantec.nl 2023 04 20 V2b STL DOWNLOAD 

 

Versie 3: Middel

Tea light chandelear straight medium size Jantec.nl 2023 04 20 V2b STL DOWNLOAD 

 

Versie 4: Kort

Tea light chandelear straight low size Jantec.nl 2023 04 20 V2b STL DOWNLOAD 

 

VID-20230418-WA0001

Houder voor elektrisch waxinelicht STL printbare file voor 3d printer

Tea light chandelear simple convex and less shaved top of thinned sphere Jantec.nl 2023 04 16 V8 STL DOWNLOAD

     

 

Deze houder voor een elektrisch waxinelichtje met een hogere naar binnen lopende rand is niet geschikt voor een waxinelichtje met een vlam want een vlam kan de hogere, meer naar binnen staande rand vervormen.

STL ontwerpen die beter geschikt zijn voor originele waxinelichtjes met een vlam staan in het artikel:  5 Printbare STL files voor een tafellampje met waxinelicht

 

mobiele diesel heater in koffer met 12V lithium accu en PSU

Al een tijdje ben ik bezig met het verzamelen van onderdelen voor een standalone Vevor diesel heater voor in de garage of onderweg.

Het past allemaal netjes in (en aan) de TOM CASE koffer, het kan ruim 10 uur zonder opladen werken en gebruikt gewone dieselolie.

Naast de primaire luchtverwarming heb ik als extra een warmtewisselaar opgenomen in de uitlaat, zie bijgaande foto’s van de eerste opzet van de bouw:

De warmtewisselaar levert als dat nodig is warm circulatiewater voor een externe radiatorunit met ventilator.  De 12 Volt pompunit zit in de koffer, en deze pompunit gaat automatisch draaien wanneer het water warm is.

Er komt natuurlijk nog het een en ander bij, zoals:

  • 12V power supply en l;ader voor de lithium-ion accu
  • aan- en afvoer van lucht van de verwarming
  • aan- en afvoer van water voor de extra verwarming (van de warmtewisselaar)
  • pomp voor het verwarmingscircuit van de warmtewisselaar
  • externe radiator (en fan)  in het warntewisselaar circuit
  • glasvezel bescherming tegen overtollige hitte van de uitlaat
  • LCD bediening op de zijkant van de case
  • volt- en ampere meter van de 12V schakeling
  • 230V inlet en aan-uit schakelaar
  • Heel veel demping en isolatie
  • Dieselpomp, -filter en -leidingen

De 10 liter dieseltank is al op het deksel van de behuizing gemonteerd, de brandstofleiding komt met een aansluiting bovenin de tank met een aanzuigleiding naar beneden, voorzien van een grof inlaatfilter in de tank.

Boven: Het met ASA geprinte verloopstuk voor de luchtuitlaat

de pomp onder ca 30 graden geplaatst
Bovenaanzicht met de losjes geplaatste belangrijkste onderdelen
RFechter zijkant met het LCD, netspanningsinlet inclusief schakelaar, luchtinlaat en gasuitlaat. DE perforatrie met de gaatjes zorgt voor de doorstroming van koele lucht langs de uitlaat en dergelijke
De aan- uit schakelaar van de heater (12V switch)
De tank (hier liggend, maar normaal staat de koffer natuurlijk rechtop)
IN heb gekozen om het aanzuigpunt bovenin te maken en met een koperen leiding naar onder de diesel aan te zuigen. Dit voorkomt mogelijke diesel lekkage wanneer e.e.a. niet in gebruik is
Hier kun je nog een keer de routering van de aanzuig- en afvoer van de heater zien met de warmtewisselaar in de uitlaat opgenomen.
Het aanzuigpijpje dat helemaal naar beneden loopt in de dieseltank
Topaanzicht (De heater koffer ligt hier natuurlijk maar bij normaal gebruik staat de koffer met handvat aan de bovenkant)

 

 

Dubbele magnetische parkerende extruders I3 Bear Duet2wifi bouw en Config files

Mijn dual carriage I3-bear gebaseerde 3d printer werkt erg goed.

Op deze pagina deel ik mijn laatste configuratiebestanden, mijn bouwervaringen zoals de gebruikte STL’s , schema’s enzovoort.

Veel plezier ermee!

Wees je ervan bewust dat de TOOL-instellingen voor de carriages in config.g zijn ingesteld inclusief relatieve X, Y, Z waarden voor deze build, dus zet dit NIET in je slicer!

En- je hebt minstens RRF3.3.1 nodig voor reprap FW en voor DWC.

De sensorloze homing vereist ook kennis van configuratie instellingen en het goede nieuws is dat de Duet2wifi dit allemaal beheerd via de reprap firmware.

Geen schakelaars nodig of complexe jumper instellingen!

Tip voor het printen van de onderdelen: Ik heb ABS gebruikt voor alle onderdelen. Gebruik minstens een printer met gekalibreerde XYZ waarden voor je specifieke filament. Ik heb alles op mijn Voron 2.4 geprint.

Print eerst een testcube en pas eventueel de instellingen van je slicer aan, zoals voorkrimpen van het eindresultaat enz.

Doe je dit niet, begin dan niet aan deze bouw.

Het is een voorwaarde om de 3 carriages soepel te kunnen laten bewegen op beide horizontale assen.

Daarom moet de beweging vrij zijn van onnodige wrijving.

En – als je sensorloze homing gebruikt, kan elke extra wrijving op elke sensorloze homing-as leiden tot onbedoelde stilstand.

Ik heb een ‘druppel’stop toegevoegd aan de linker en rechter X-carriage, gemaakt van een dunne vertinde plaatje blik. Het is zo geplaatst dat er een beetje spanning op de spuitmondtip komt te staan in de parkeerstand.

Het werkt echt heel goed!

De config.g voor deze bouw en de Duet2wifi is HIER

De Sys directory voor de bouw met dubbele slede en Duet2wifi is HIER

De Macros directory voor de bouw met dubbele slede en Duet2wifi is HIER

Het bouwplan voor het 2040 extrusieframe is HIER

2.1 version Prusa i3 MK3/MK3S Bear Z Extended 459mm Black kit 2040  Extrusion Anodized After Cut Prusa i3 MK3 Bear Profile Frame|3D Printer  Parts & Accessories| - AliExpress

 De STL-bestanden voor de X-as carriages zijn HIER

Alle andere benodigde STL-bestanden voor de printer staan HIER

De behuizing van de Duet en de 4,3 inch Paneldue zijn HIER

De pagina van de werkende printer is HIER

De bouwplannen voor de elektronica en Duet2wifi bedradingsschema’s zijn HIER

Doneer alsjeblieft $1 aan mijn paypal account als je (delen van) mijn ontwikkelde materialen gebruikt zodat ik leuke dingen kan blijven delen om te downloadennate $1 to my paypal account

GRA-AFCH NixieClockShield_NCS318_V1_94_TZ.ino met Time zone en zomer/wintertijd add-on met voorbeeld

Ik heb de timzone.lib plus arduino-additionele code toegevoegd aan de open-source code zoals GRA-AFCH die heeft gemaakt voor hun IN-18 nixie klok met Arduino Mega : NixieClockShield_NCS318_V1_94_TZ.

Hiermee synchroniseert de NIXIE klok via een aan te sluiten standaard GPS module met UTC (stond al in de code) en vervolgens met de juiste tijdzone, inclusief automatische verschuiving voor zomer- en wintertijd! (wat geheel nieuw is!)

Zie de werkende versie onder:

Het is nu gecodeerd voor West-Europa en een voorbeeld staat in de code voor een US tijdzone, andere kunnen worden afgeleid uit de voorbeelden die bij de nieuw toegevoegde timezone.lib zitten! #include <Timezone.h>//https://github.com/JChristensen/Timezone

Beschikbare tijdzones:

// Australia Eastern Time Zone (Sydney, Melbourne)
TimeChangeRule aEDT = {“AEDT”, First, Sun, Oct, 2, 660}; // UTC + 11 hours
TimeChangeRule aEST = {“AEST”, First, Sun, Apr, 3, 600}; // UTC + 10 hours
Timezone ausET(aEDT, aEST);

// Moscow Standard Time (MSK, does not observe DST)
TimeChangeRule msk = {“MSK”, Last, Sun, Mar, 1, 180};
Timezone tzMSK(msk);

// Central European Time (Frankfurt, Paris)
TimeChangeRule CEST = {“CEST”, Last, Sun, Mar, 2, 120}; // Central European Summer Time
TimeChangeRule CET = {“CET “, Last, Sun, Oct, 3, 60}; // Central European Standard Time
Timezone CE(CEST, CET);

// United Kingdom (London, Belfast)
TimeChangeRule BST = {“BST”, Last, Sun, Mar, 1, 60}; // British Summer Time
TimeChangeRule GMT = {“GMT”, Last, Sun, Oct, 2, 0}; // Standard Time
Timezone UK(BST, GMT);

// UTC
TimeChangeRule utcRule = {“UTC”, Last, Sun, Mar, 1, 0}; // UTC
Timezone UTC(utcRule);

// US Eastern Time Zone (New York, Detroit)
TimeChangeRule usEDT = {“EDT”, Second, Sun, Mar, 2, -240}; // Eastern Daylight Time = UTC – 4 hours
TimeChangeRule usEST = {“EST”, First, Sun, Nov, 2, -300}; // Eastern Standard Time = UTC – 5 hours
Timezone usET(usEDT, usEST);

// US Central Time Zone (Chicago, Houston)
TimeChangeRule usCDT = {“CDT”, Second, Sun, Mar, 2, -300};
TimeChangeRule usCST = {“CST”, First, Sun, Nov, 2, -360};
Timezone usCT(usCDT, usCST);

// US Mountain Time Zone (Denver, Salt Lake City)
TimeChangeRule usMDT = {“MDT”, Second, Sun, Mar, 2, -360};
TimeChangeRule usMST = {“MST”, First, Sun, Nov, 2, -420};
Timezone usMT(usMDT, usMST);

// Arizona is US Mountain Time Zone but does not use DST
Timezone usAZ(usMST);

// US Pacific Time Zone (Las Vegas, Los Angeles)
TimeChangeRule usPDT = {“PDT”, Second, Sun, Mar, 2, -420};
TimeChangeRule usPST = {“PST”, First, Sun, Nov, 2, -480};
Timezone usPT(usPDT, usPST);

De benodigde arduino libraries staan op de GRA-AFCH Github pagina’s hier:

https://github.com/afch/NixieClock

of download alleen de Libraries

Het werkt echt goed, zie het gezipte bestand hieronder of de arduino code verderop:

NixieClockShield_NCS318_V1_94_TZ.ino

NixieClockShield_NCS318_V1_94_TZ.ino:

const String FirmwareVersion = “0196TZ”;
const char HardwareVersion[] PROGMEM = {“NCS318/568 FW 1.94TZ 2021_04_04 Jantec.nl add-on for Timezones for HW 1.x HV5122 or HV5222”};

//// This ‘TZ’ firmware addition delivers automated Summer/Winter time changes based on your local time zone settings ////
//// Jantec.nl 2023-04-04 The Netherlands, Amsterdam. Please share and re-use! ////
//// This can and may be used in any CLOCK program, with possibly specific minor alteration, due to different libraries and do on ////
//// All of my add-ons are specified in the code! Cheers, Jantec.nl, NL ////
//// The approach here is to automatically change the EEPROM hours setting according to the SUMMER/WINTER timescheme ////
//// meaning: Put in the register: a) the time zone (=normal winter time) versus UTC and b) at the switching times the summer ‘+1’ change versus ‘normal’wintertime ///
//// If the user changes the hours setting, this will be overruled at every programmed time change related to summer/ winter time
//Format _X.XXX_
//NIXIE CLOCK SHIELD NCS318/568 for HW 1.x by GRA & AFCH (fominalec@gmail.com)
//1.94 26.02.2021
//Added: Сhecking the presence of a gps receiver when turned on.
//Return to the previous gps parser
//1.92 21.01.2021
//Added: defines for GPS receiver types
//1.91 29.07.2020
//The driver has been changed to support BOTH HV5122 and HV5222 registers (switching using resistor R5222 Arduino pin No. 8)
//1.90 08.06.2020
//Fixed: GPS timezone issue: added breakTime(now(), tm) to adjustTime function at Time.cpp
//1.89 03.04.2020
//Dots sync with seconds
//1.88 26.03.2020
//GPS synchronization algorithm has been changed (again)
//1.86 23.02.2020
//GPS synchronization algorithm changed
//1.85.3 23.02.2020
//Added: DS3231 internal temperature sensor self test: 5 beeps if fail.
//1.85.2 21.02.2020
//Fixed: Bug with time zones more than +-9
// GPS parser has been replaced by NEOGPS
//1.85.1 05.01.2020
//Value of “HardwareVersion” was changed to NCS318/568
//1.85 14.06.2019
//indication is working inside interrupt (only for Arduino Mega), driver v1.3 is required
//Added: support programmable leds ws2812b
//Some performance optimizations
//1.84 08.04.2018
//LEDs functions moved to external file
//LEDs freezing while music (or sound) played.
//SPI Setup moved driver’s file
//1.83 02.08.2018 (Driver v 1.1 is required)
//Fixed: Temp. reading speed fixed
//Fixed: Dots mixed up (driver was updated to v. 1.1)
//Fixed: RGB LEDs reading from EEPROM
//Fixed: Check for entering data from GPS in range
//1.82 18.07.2018 Dual Date Format
//1.81 18.02.2018 Temp. sensor present analyze
//1.80 06.08.2017
//Added: Date and Time GPS synchronization
//1.70 30.07.2017
//Added IR remote control support (Sony RM-X151) (“MODE”, “UP”, “DOWN”)
//1.60 24_07_2017
//Added: Temperature reading mode in menu and slot machine transaction
//1.0.31 27_04_2017
//Added: antipoisoning effect – slot machine
//1.021 31.01.2017
//Added: time synchronizing each 10 seconds
//Fixed: not correct time reading from RTC while start up
//1.02 17.10.2016
//Fixed: RGB color controls
//Update to Arduino IDE 1.6.12 (Time.h replaced to TimeLib.h)
//1.01
//Added RGB LEDs lock(by UP and Down Buttons)
//Added Down and Up buttons pause and resume self testing
//25.09.2016 update to HW ver 1.1
//25.05.2016

//#define tubes8
#define tubes6
//#define tubes4

#include <SPI.h>
#include <Wire.h>
#include <ClickButton.h>
#include <TimeLib.h>
#ifndef GRA_AND_AFCH_TIME_LIB_MOD
#error The “Time (TimeLib)” library modified by GRA and AFCH must be used!
#endif

//// THIS IS NEW, related to TIMEZONE add-on:
#include <Timezone.h>//https://github.com/JChristensen/Timezone
//Central European Time (Frankfurt, Paris)
TimeChangeRule myDST = {“CEST”, Last, Sun, Mar, 26, 120}; //Central European Summer Time//Daylight time = UTC +2 hours
TimeChangeRule mySTD = {“CET “, Last, Sun, Oct, 3, 60}; //Central European Standard Time (Winter)//Daylight time = UTC +1 hour
Timezone myTZ(myDST, mySTD);
//ADD AND REPLACE THE ABOVE FOR ANY OTHER REQUIRED TIMEZONE FROM THE EXAMPLES IN JChistensen’s exaples folders
// US Eastern Time Zone (New York, Detroit)
//TimeChangeRule myDST = {“EDT”, Second, Sun, Mar, 2, -240}; //Daylight time = UTC – 4 hours
//TimeChangeRule mySTD = {“EST”, First, Sun, Nov, 2, -300}; //Daylight time = UTC – 4 hours
//Timezone myTZ(myDST, mySTD);
TimeChangeRule *tcr; //pointer to the time change rule, use to get the TZ abbrev
time_t utc;
//// end of this add-on for TIMEZONE

#include <Tone.h>
#include <EEPROM.h>
#include “doIndication318_HW1.x.h”
#include <OneWire.h>
//IR remote control /////////// START /////////////////////////////
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

#define GPS_SYNC_INTERVAL 1800000 // in milliseconds
//#define GPS_SYNC_INTERVAL 180000 //3 minutes
unsigned long Last_Time_GPS_Sync = 0;
//bool GPS_Sync_Flag = false;
//uint32_t GPS_Sync_Interval=120000; // 2 minutes
uint32_t GPS_Sync_Interval = 60000; // first try = 1 minute
uint32_t MillsNow=0;
#define TIME_TO_TRY 60000 //1 minute
bool AttMsgWasShowed=false;

#define GPS_BUFFER_LENGTH 83

char GPS_Package[GPS_BUFFER_LENGTH];
byte GPS_position = 0;

struct GPS_DATE_TIME
{
byte GPS_hours;
byte GPS_minutes;
byte GPS_seconds;
byte GPS_day;
byte GPS_mounth;
int GPS_year;
bool GPS_Valid_Data = false;
unsigned long GPS_Data_Parsed_time;
};

GPS_DATE_TIME GPS_Date_Time;

#define PreZero(digit) ((abs(digit)<10)?”0″+String(abs(digit)):String(abs(digit)))
#include <IRremote.h>
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results IRresults;
// buttons codes for remote controller Sony RM-X151
#define IR_BUTTON_UP_CODE 0x6621
#define IR_BUTTON_DOWN_CODE 0x2621
#define IR_BUTTON_MODE_CODE 0x7121

class IRButtonState
{
public:
int PAUSE_BETWEEN_PACKETS = 50;
int PACKETS_QTY_IN_LONG_PRESS = 18;

private:
bool Flag = 0;
byte CNT_packets = 0;
unsigned long lastPacketTime = 0;
bool START_TIMER = false;
int _buttonCode;

public: IRButtonState::IRButtonState(int buttonCode)
{
_buttonCode = buttonCode;
}

public: int IRButtonState::checkButtonState(int receivedCode)
{
if (((millis() – lastPacketTime) > PAUSE_BETWEEN_PACKETS) && (START_TIMER == true))
{
START_TIMER = false;
if (CNT_packets >= 2) {
Flag = 0;
CNT_packets = 0;
START_TIMER = false;
return 1;
}
else {
Flag = 0;
CNT_packets = 0;
return 0;
}
}
else
{
if (receivedCode == _buttonCode) { Flag = 1;}
else
{
if (!(Flag == 1)) {return 0;}
else
{
if (!(receivedCode == 0xFFFFFFFF)) {return 0;}
}
}
CNT_packets++;
lastPacketTime = millis();
START_TIMER = true;
if (CNT_packets >= PACKETS_QTY_IN_LONG_PRESS) {
Flag = 0;
CNT_packets = 0;
START_TIMER = false;
return -1;
}
else {return 0;}
}
}
};

IRButtonState IRModeButton(IR_BUTTON_MODE_CODE);
IRButtonState IRUpButton(IR_BUTTON_UP_CODE);
IRButtonState IRDownButton(IR_BUTTON_DOWN_CODE);
#endif

int ModeButtonState = 0;
int UpButtonState = 0;
int DownButtonState = 0;

//IR remote control /////////// START /////////////////////////////

/*#define GPS_BUFFER_LENGTH 83

char GPS_Package[GPS_BUFFER_LENGTH];
byte GPS_position=0;

struct GPS_DATE_TIME
{
byte GPS_hours;
byte GPS_minutes;
byte GPS_seconds;
byte GPS_day;
byte GPS_mounth;
int GPS_year;
bool GPS_Valid_Data=false;
unsigned long GPS_Data_Parsed_time;
};
*/
//GPS_DATE_TIME GPS_Date_Time;

unsigned long GPS_Data_Parsed_time;

boolean UD, LD; // DOTS control;

byte data[12];
byte addr[8];
int celsius, fahrenheit;

#define RedLedPin 9 //MCU WDM output for red LEDs 9-g
#define GreenLedPin 6 //MCU WDM output for green LEDs 6-b
#define BlueLedPin 3 //MCU WDM output for blue LEDs 3-r
#define pinSet A0
#define pinUp A2
#define pinDown A1
//#define pinBuzzer 2
const byte pinBuzzer = 2; // pomenyal
#define pinUpperDots 12 //HIGH value light a dots
#define pinLowerDots 8 //HIGH value light a dots
#define pinTemp 7
bool RTC_present;
#define US_DateFormat 1
#define EU_DateFormat 0
//bool DateFormat=EU_DateFormat;

OneWire ds(pinTemp);
bool TempPresent = false;
#define CELSIUS 0
#define FAHRENHEIT 1

String stringToDisplay = “000000”; // Content of this string will be displayed on tubes (must be 6 chars length)
int menuPosition = 0;
// 0 – time
// 1 – date
// 2 – alarm
// 3 – 12/24 hours mode
// 4 – Temperature
// 5 – TimeZone* (Only for Ardiono Mega)

byte blinkMask = B00000000; //bit mask for blinkin digits (1 – blink, 0 – constant light)
int blankMask = B00000000; //bit mask for digits (1 – off, 0 – on)

byte dotPattern = B00000000; //bit mask for separeting dots (1 – on, 0 – off)
//B10000000 – upper dots
//B01000000 – lower dots

#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527
int RTC_hours, RTC_minutes, RTC_seconds, RTC_day, RTC_month, RTC_year, RTC_day_of_week;

#define TimeIndex 0
#define DateIndex 1
#define AlarmIndex 2
#define hModeIndex 3
#define TemperatureIndex 4
#define TimeZoneIndex 5
#define TimeHoursIndex 6
#define TimeMintuesIndex 7
#define TimeSecondsIndex 8
#define DateFormatIndex 9
#define DateDayIndex 10
#define DateMonthIndex 11
#define DateYearIndex 12
#define AlarmHourIndex 13
#define AlarmMinuteIndex 14
#define AlarmSecondIndex 15
#define Alarm01 16
#define hModeValueIndex 17
#define DegreesFormatIndex 18
#define HoursOffsetIndex 19

#define FirstParent TimeIndex
#define LastParent TimeZoneIndex
#define SettingsCount (HoursOffsetIndex+1)
#define NoParent 0
#define NoChild 0

//——————————-0——–1——–2——-3——–4——–5——–6——–7——–8——–9———-10——-11———12———13——-14——-15———16———17——–18———-19
// names: Time, Date, Alarm, 12/24, Temperature,TimeZone,hours, mintues, seconds, DateFormat, day, month, year, hour, minute, second alarm01 hour_format Deg.FormIndex HoursOffset
// 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
int parent[SettingsCount] = {NoParent, NoParent, NoParent, NoParent,NoParent,NoParent,1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 6};
int firstChild[SettingsCount] = {6, 9, 13, 17, 18, 19, 0, 0, 0, NoChild, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int lastChild[SettingsCount] = { 8, 12, 16, 17, 18, 19, 0, 0, 0, NoChild, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int value[SettingsCount] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, EU_DateFormat, 0, 0, 0, 0, 0, 0, 0, 24, 0, 2};
int maxValue[SettingsCount] = { 0, 0, 0, 0, 0, 0, 23, 59, 59, US_DateFormat, 31, 12, 99, 23, 59, 59, 1, 24, FAHRENHEIT, 14};
int minValue[SettingsCount] = { 0, 0, 0, 12, 0, 0, 00, 00, 00, EU_DateFormat, 1, 1, 00, 00, 00, 00, 0, 12, CELSIUS, -12};
int blinkPattern[SettingsCount] = {
B00000000, //0
B00000000, //1
B00000000, //2
B00000000, //3
B00000000, //4
B00000000, //5
B00000011, //6
B00001100, //7
B00110000, //8
B00111111, //9
B00000011, //10
B00001100, //11
B00110000, //12
B00000011, //13
B00001100, //14
B00110000, //15
B11000000, //16
B00001100, //17
B00111111, //18
B00000011, //19
};

bool editMode = false;

long downTime = 0;
long upTime = 0;
const long settingDelay = 150;
bool BlinkUp = false;
bool BlinkDown = false;
unsigned long enteringEditModeTime = 0;
bool RGBLedsOn = true;
#define RGBLEDsEEPROMAddress 0
#define HourFormatEEPROMAddress 1
#define AlarmTimeEEPROMAddress 2 //3,4,5
#define AlarmArmedEEPROMAddress 6
#define LEDsLockEEPROMAddress 7
#define LEDsRedValueEEPROMAddress 8
#define LEDsGreenValueEEPROMAddress 9
#define LEDsBlueValueEEPROMAddress 10
#define DegreesFormatEEPROMAddress 11
#define HoursOffsetEEPROMAddress 12
#define DateFormatEEPROMAddress 13

//buttons pins declarations
ClickButton setButton(pinSet, LOW, CLICKBTN_PULLUP);
ClickButton upButton(pinUp, LOW, CLICKBTN_PULLUP);
ClickButton downButton(pinDown, LOW, CLICKBTN_PULLUP);
///////////////////

Tone tone1;
#define isdigit(n) (n >= ‘0’ && n <= ‘9’)
//char *song = “MissionImp:d=16,o=6,b=95:32d,32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f,32p,a#5,g5,2e,d#,8d”;
char *song = “PinkPanther:d=4,o=5,b=160:8d#,8e,2p,8f#,8g,2p,8d#,8e,16p,8f#,8g,16p,8c6,8b,16p,8d#,8e,16p,8b,2a#,2p,16a,16g,16e,16d,2e”;
//char *song=”VanessaMae:d=4,o=6,b=70:32c7,32b,16c7,32g,32p,32g,32p,32d#,32p,32d#,32p,32c,32p,32c,32p,32c7,32b,16c7,32g#,32p,32g#,32p,32f,32p,16f,32c,32p,32c,32p,32c7,32b,16c7,32g,32p,32g,32p,32d#,32p,32d#,32p,32c,32p,32c,32p,32g,32f,32d#,32d,32c,32d,32d#,32c,32d#,32f,16g,8p,16d7,32c7,32d7,32a#,32d7,32a,32d7,32g,32d7,32d7,32p,32d7,32p,32d7,32p,16d7,32c7,32d7,32a#,32d7,32a,32d7,32g,32d7,32d7,32p,32d7,32p,32d7,32p,32g,32f,32d#,32d,32c,32d,32d#,32c,32d#,32f,16c”;
//char *song=”DasBoot:d=4,o=5,b=100:d#.4,8d4,8c4,8d4,8d#4,8g4,a#.4,8a4,8g4,8a4,8a#4,8d,2f.,p,f.4,8e4,8d4,8e4,8f4,8a4,c.,8b4,8a4,8b4,8c,8e,2g.,2p”;
//char *song=”Scatman:d=4,o=5,b=200:8b,16b,32p,8b,16b,32p,8b,2d6,16p,16c#.6,16p.,8d6,16p,16c#6,8b,16p,8f#,2p.,16c#6,8p,16d.6,16p.,16c#6,16b,8p,8f#,2p,32p,2d6,16p,16c#6,8p,16d.6,16p.,16c#6,16a.,16p.,8e,2p.,16c#6,8p,16d.6,16p.,16c#6,16b,8p,8b,16b,32p,8b,16b,32p,8b,2d6,16p,16c#.6,16p.,8d6,16p,16c#6,8b,16p,8f#,2p.,16c#6,8p,16d.6,16p.,16c#6,16b,8p,8f#,2p,32p,2d6,16p,16c#6,8p,16d.6,16p.,16c#6,16a.,16p.,8e,2p.,16c#6,8p,16d.6,16p.,16c#6,16a,8p,8e,2p,32p,16f#.6,16p.,16b.,16p.”;
//char *song=”Popcorn:d=4,o=5,b=160:8c6,8a#,8c6,8g,8d#,8g,c,8c6,8a#,8c6,8g,8d#,8g,c,8c6,8d6,8d#6,16c6,8d#6,16c6,8d#6,8d6,16a#,8d6,16a#,8d6,8c6,8a#,8g,8a#,c6″;
//char *song=”WeWishYou:d=4,o=5,b=200:d,g,8g,8a,8g,8f#,e,e,e,a,8a,8b,8a,8g,f#,d,d,b,8b,8c6,8b,8a,g,e,d,e,a,f#,2g,d,g,8g,8a,8g,8f#,e,e,e,a,8a,8b,8a,8g,f#,d,d,b,8b,8c6,8b,8a,g,e,d,e,a,f#,1g,d,g,g,g,2f#,f#,g,f#,e,2d,a,b,8a,8a,8g,8g,d6,d,d,e,a,f#,2g”;
#define OCTAVE_OFFSET 0
char *p;

int notes[] = { 0,
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};

int fireforks[] = {0, 0, 1, //1
-1, 0, 0, //2
0, 1, 0, //3
0, 0, -1, //4
1, 0, 0, //5
0, -1, 0
}; //array with RGB rules (0 – do nothing, -1 – decrese, +1 – increse

void setRTCDateTime(byte h, byte m, byte s, byte d, byte mon, byte y, byte w = 1);

int functionDownButton = 0;
int functionUpButton = 0;
bool LEDsLock = false;

//antipoisoning transaction
bool modeChangedByUser = false;
bool transactionInProgress = false; //antipoisoning transaction
#define timeModePeriod 60000
#define dateModePeriod 5000
long modesChangePeriod = timeModePeriod;
//end of antipoisoning transaction

bool GPS_sync_flag=false;

extern const int LEDsDelay;

/*******************************************************************************************************
Init Programm
*******************************************************************************************************/
void setup()
{
Wire.begin();
//setRTCDateTime(23,40,00,25,7,15,1);

Serial.begin(115200);
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
Serial1.begin(9600);
digitalWrite(19, HIGH);
#endif

 

 

if (EEPROM.read(HourFormatEEPROMAddress) != 12) value[hModeValueIndex] = 24; else value[hModeValueIndex] = 12;
if (EEPROM.read(RGBLEDsEEPROMAddress) != 0) RGBLedsOn = true; else RGBLedsOn = false;
if (EEPROM.read(AlarmTimeEEPROMAddress) == 255) value[AlarmHourIndex] = 0; else value[AlarmHourIndex] = EEPROM.read(AlarmTimeEEPROMAddress);
if (EEPROM.read(AlarmTimeEEPROMAddress + 1) == 255) value[AlarmMinuteIndex] = 0; else value[AlarmMinuteIndex] = EEPROM.read(AlarmTimeEEPROMAddress + 1);
if (EEPROM.read(AlarmTimeEEPROMAddress + 2) == 255) value[AlarmSecondIndex] = 0; else value[AlarmSecondIndex] = EEPROM.read(AlarmTimeEEPROMAddress + 2);
if (EEPROM.read(AlarmArmedEEPROMAddress) == 255) value[Alarm01] = 0; else value[Alarm01] = EEPROM.read(AlarmArmedEEPROMAddress);
if (EEPROM.read(LEDsLockEEPROMAddress) == 255) LEDsLock = false; else LEDsLock = EEPROM.read(LEDsLockEEPROMAddress);
if (EEPROM.read(DegreesFormatEEPROMAddress) == 255) value[DegreesFormatIndex] = CELSIUS; else value[DegreesFormatIndex] = EEPROM.read(DegreesFormatEEPROMAddress);
if (EEPROM.read(HoursOffsetEEPROMAddress) == 255) value[HoursOffsetIndex] = value[HoursOffsetIndex]; else value[HoursOffsetIndex] = EEPROM.read(HoursOffsetEEPROMAddress) + minValue[HoursOffsetIndex];

//// needed to set this HoursOffsetIndex variable to 0 since we will use the timezone lib (local timezone and summer/winter time add-ons by Jantec.nl)
value[HoursOffsetIndex] = 0;
EEPROM.write(HoursOffsetEEPROMAddress, 0);

if (EEPROM.read(DateFormatEEPROMAddress) == 255) value[DateFormatIndex] = value[DateFormatIndex]; else value[DateFormatIndex] = EEPROM.read(DateFormatEEPROMAddress);

//Serial.print(F(“led lock=”));
//Serial.println(LEDsLock);

pinMode(RedLedPin, OUTPUT);
pinMode(GreenLedPin, OUTPUT);
pinMode(BlueLedPin, OUTPUT);

tone1.begin(pinBuzzer);
song = parseSong(song);

pinMode(LEpin, OUTPUT);

// SPI setup
SPISetup();
LEDsSetup();
//buttons pins inits
pinMode(pinSet, INPUT_PULLUP);
pinMode(pinUp, INPUT_PULLUP);
pinMode(pinDown, INPUT_PULLUP);
////////////////////////////
pinMode(pinBuzzer, OUTPUT);

//buttons objects inits
setButton.debounceTime = 20; // Debounce timer in ms
setButton.multiclickTime = 30; // Time limit for multi clicks
setButton.longClickTime = 2000; // time until “held-down clicks” register

upButton.debounceTime = 20; // Debounce timer in ms
upButton.multiclickTime = 30; // Time limit for multi clicks
upButton.longClickTime = 2000; // time until “held-down clicks” register

downButton.debounceTime = 20; // Debounce timer in ms
downButton.multiclickTime = 30; // Time limit for multi clicks
downButton.longClickTime = 2000; // time until “held-down clicks” register

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
timerSetup();
#endif
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
doTest();
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (LEDsLock == 1)
{
setLEDsFromEEPROM();
}
getRTCTime();
byte prevSeconds = RTC_seconds;
unsigned long RTC_ReadingStartTime = millis();
RTC_present = true;
while (prevSeconds == RTC_seconds)
{
getRTCTime();
//Serial.println(RTC_seconds);
if ((millis() – RTC_ReadingStartTime) > 3000)
{
#ifdef DEBUG
Serial.println(F(“Warning! RTC DON’T RESPOND!”));
#endif
RTC_present = false;
break;
}
}
setTime(RTC_hours, RTC_minutes, RTC_seconds, RTC_day, RTC_month, RTC_year);

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
irrecv.blink13(false);
irrecv.enableIRIn(); // Start the receiver
#endif

//// add-ons for TIMEZONE
time_t utc = now();
time_t local = myTZ.toLocal(utc, &tcr);
Serial.println();
printDateTime(utc, “UTC”);
printDateTime(local, tcr -> abbrev);
delay(1000);//was 10000
//// end of add-ons for TIMEZONE

}

int rotator = 0; //index in array with RGB “rules” (increse by one on each 255 cycles)
int cycle = 0; //cycles counter
int RedLight = 255;
int GreenLight = 0;
int BlueLight = 0;
unsigned long prevTime = 0; // time of lase tube was lit
unsigned long prevTime4FireWorks = 0; //time of last RGB changed
//int minuteL=0; //младшая цифра минут

/***************************************************************************************************************
MAIN Programm
***************************************************************************************************************/
void loop() {

if (((millis() % 10000) == 0) && (RTC_present)) //synchronize with RTC every 10 seconds
{
getRTCTime();

setTime(RTC_hours, RTC_minutes, RTC_seconds, RTC_day, RTC_month, RTC_year);
// 4 lines of time zone & winter/summer time additions by Jantec.nl 2023 0404
time_t utc = now();
time_t local = myTZ.toLocal(utc, &tcr);
setTime(myTZ.toLocal(utc, &tcr));
EEPROM.write(DateFormatEEPROMAddress, value[myTZ.toLocal(utc, &tcr)]);

//Serial.println(F(“Sync”));
}

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

MillsNow=millis();
if ((MillsNow – Last_Time_GPS_Sync) > GPS_Sync_Interval)
{
//GPS_Sync_Interval = GPS_SYNC_INTERVAL; // <—-!
//GPS_Sync_Flag = 0;
if (AttMsgWasShowed==false)
{
Serial.println(F(“Attempt to sync with GPS.”));
AttMsgWasShowed=true;
}
GetDataFromSerial1();
//SyncWithGPS();
}
if ((MillsNow – Last_Time_GPS_Sync) > GPS_Sync_Interval + TIME_TO_TRY)
{
Last_Time_GPS_Sync=MillsNow; //if it is not possible to synchronize within the allotted time TIME_TO_TRY, then we postpone attempts to the next time interval.
//GPS_Sync_Flag = 1;
//GPS_Sync_Interval = GPS_SYNC_INTERVAL;
Serial.println(F(“All attempts were unsuccessful.”));
AttMsgWasShowed=false;
}

IRresults.value = 0;
if (irrecv.decode(&IRresults)) {
Serial.println(IRresults.value, HEX);
irrecv.resume(); // Receive the next value
}

ModeButtonState = IRModeButton.checkButtonState(IRresults.value);
if (ModeButtonState == 1) Serial.println(F(“Mode short”));
if (ModeButtonState == -1) Serial.println(F(“Mode long….”));

UpButtonState = IRUpButton.checkButtonState(IRresults.value);
if (UpButtonState == 1) Serial.println(F(“Up short”));
if (UpButtonState == -1) Serial.println(F(“Up long….”));

DownButtonState = IRDownButton.checkButtonState(IRresults.value);
if (DownButtonState == 1) Serial.println(F(“Down short”));
if (DownButtonState == -1) Serial.println(F(“Down long….”));

#else
ModeButtonState=0;
UpButtonState=0;
DownButtonState=0;
#endif

p = playmusic(p);

if ((millis() – prevTime4FireWorks) > LEDsDelay)
{
rotateFireWorks(); //change color (by 1 step)
prevTime4FireWorks = millis();
}

if ((menuPosition == TimeIndex) || (modeChangedByUser == false) ) modesChanger();
#if defined (__AVR_ATmega328P__)
doIndication();
#endif

setButton.Update();
upButton.Update();
downButton.Update();
if (editMode == false)
{
blinkMask = B00000000;

} else if ((millis() – enteringEditModeTime) > 60000)
{
editMode = false;
menuPosition = firstChild[menuPosition];
blinkMask = blinkPattern[menuPosition];
}
if ((setButton.clicks > 0) || (ModeButtonState == 1)) //short click
{
modeChangedByUser = true;
p = 0; //shut off music )))
tone1.play(1000, 100);
enteringEditModeTime = millis();
/*if (value[DateFormatIndex] == US_DateFormat)
{
//if (menuPosition == )
} else */
menuPosition = menuPosition + 1;
#if defined (__AVR_ATmega328P__)
if (menuPosition == TimeZoneIndex) menuPosition++;// skip TimeZone for Arduino Uno
#endif
if (menuPosition == LastParent + 1) menuPosition = TimeIndex;
/*Serial.print(F(“menuPosition=”));
Serial.println(menuPosition);
Serial.print(F(“value=”));
Serial.println(value[menuPosition]);*/

blinkMask = blinkPattern[menuPosition];
if ((parent[menuPosition – 1] != 0) and (lastChild[parent[menuPosition – 1] – 1] == (menuPosition – 1))) //exit from edit mode
{
if ((parent[menuPosition – 1] – 1 == 1) && (!isValidDate()))
{
menuPosition = DateDayIndex;
return;
}
editMode = false;
menuPosition = parent[menuPosition – 1] – 1;
if (menuPosition == TimeIndex) setTime(value[TimeHoursIndex], value[TimeMintuesIndex], value[TimeSecondsIndex], day(), month(), year());
if (menuPosition == DateIndex)
{
#ifdef DEBUG
Serial.print(F(“Day:”));
Serial.println(value[DateDayIndex]);
Serial.print(F(“Month:”));
Serial.println(value[DateMonthIndex]);
#endif
setTime(hour(), minute(), second(), value[DateDayIndex], value[DateMonthIndex], 2000 + value[DateYearIndex]);
EEPROM.write(DateFormatEEPROMAddress, value[DateFormatIndex]);
}
if (menuPosition == AlarmIndex) {
EEPROM.write(AlarmTimeEEPROMAddress, value[AlarmHourIndex]);
EEPROM.write(AlarmTimeEEPROMAddress + 1, value[AlarmMinuteIndex]);
EEPROM.write(AlarmTimeEEPROMAddress + 2, value[AlarmSecondIndex]);
EEPROM.write(AlarmArmedEEPROMAddress, value[Alarm01]);
};
if (menuPosition == hModeIndex) EEPROM.write(HourFormatEEPROMAddress, value[hModeValueIndex]);
if (menuPosition == TemperatureIndex)
{
EEPROM.write(DegreesFormatEEPROMAddress, value[DegreesFormatIndex]);
}
if (menuPosition == TimeZoneIndex) EEPROM.write(HoursOffsetEEPROMAddress, value[HoursOffsetIndex] – minValue[HoursOffsetIndex]);
//if (menuPosition == hModeIndex) EEPROM.write(HourFormatEEPROMAddress, value[hModeValueIndex]);
setRTCDateTime(hour(), minute(), second(), day(), month(), year() % 1000, 1);
return;
} //end exit from edit mode
/*Serial.print(“menu pos=”);
Serial.println(menuPosition);
Serial.print(“DateFormat”);
Serial.println(value[DateFormatIndex]);*/
if ((menuPosition != HoursOffsetIndex) &&
(menuPosition != DateFormatIndex) &&
(menuPosition != DateDayIndex)) value[menuPosition] = extractDigits(blinkMask);
}
if ((setButton.clicks < 0) || (ModeButtonState == -1)) //long click
{
tone1.play(1000, 100);
if (!editMode)
{
enteringEditModeTime = millis();
if (menuPosition == TimeIndex) stringToDisplay = PreZero(hour()) + PreZero(minute()) + PreZero(second()); //temporary enabled 24 hour format while settings
}
if (menuPosition == DateIndex)
{
// Serial.println(“DateEdit”);
value[DateDayIndex] = day();
value[DateMonthIndex] = month();
value[DateYearIndex] = year() % 1000;
if (value[DateFormatIndex] == EU_DateFormat) stringToDisplay=PreZero(value[DateDayIndex])+PreZero(value[DateMonthIndex])+PreZero(value[DateYearIndex]);
else stringToDisplay=PreZero(value[DateMonthIndex])+PreZero(value[DateDayIndex])+PreZero(value[DateYearIndex]);
//Serial.print(“str=”);
// Serial.println(stringToDisplay);
}
menuPosition = firstChild[menuPosition];
if (menuPosition == AlarmHourIndex) {
value[Alarm01] = 1; /*digitalWrite(pinUpperDots, HIGH);*/dotPattern = B10000000;
}
editMode = !editMode;
blinkMask = blinkPattern[menuPosition];
if ((menuPosition != DegreesFormatIndex) &&
(menuPosition != HoursOffsetIndex) &&
(menuPosition != DateFormatIndex))
value[menuPosition] = extractDigits(blinkMask);
/*Serial.print(F(“menuPosition=”));
Serial.println(menuPosition);
Serial.print(F(“value=”));
Serial.println(value[menuPosition]); */
}

if (upButton.clicks != 0) functionUpButton = upButton.clicks;

if ((upButton.clicks > 0) || (UpButtonState == 1))
{
modeChangedByUser = true;
p = 0; //shut off music )))
tone1.play(1000, 100);
incrementValue();
if (!editMode)
{
LEDsLock = false;
EEPROM.write(LEDsLockEEPROMAddress, 0);
}
}

if (functionUpButton == -1 && upButton.depressed == true)
{
BlinkUp = false;
if (editMode == true)
{
if ( (millis() – upTime) > settingDelay)
{
upTime = millis();// + settingDelay;
incrementValue();
}
}
} else BlinkUp = true;

if (downButton.clicks != 0) functionDownButton = downButton.clicks;

if ((downButton.clicks > 0) || (DownButtonState == 1))
{
modeChangedByUser = true;
p = 0; //shut off music )))
tone1.play(1000, 100);
dicrementValue();
if (!editMode)
{
LEDsLock = true;
EEPROM.write(LEDsLockEEPROMAddress, 1);
EEPROM.write(LEDsRedValueEEPROMAddress, RedLight);
EEPROM.write(LEDsGreenValueEEPROMAddress, GreenLight);
EEPROM.write(LEDsBlueValueEEPROMAddress, BlueLight);
/*Serial.println(F(“Store to EEPROM:”));
Serial.print(F(“RED=”));
Serial.println(RedLight);
Serial.print(F(“GREEN=”));
Serial.println(GreenLight);
Serial.print(F(“Blue=”));
Serial.println(BlueLight);*/
}
}

if (functionDownButton == -1 && downButton.depressed == true)
{
BlinkDown = false;
if (editMode == true)
{
if ( (millis() – downTime) > settingDelay)
{
downTime = millis();// + settingDelay;
dicrementValue();
}
}
} else BlinkDown = true;

if (!editMode)
{
if ((upButton.clicks < 0) || (UpButtonState == -1))
{
tone1.play(1000, 100);
RGBLedsOn = true;
EEPROM.write(RGBLEDsEEPROMAddress, 1);
#ifdef DEBUG
Serial.println(F(“RGB=on”));
#endif
setLEDsFromEEPROM();
}
if ((downButton.clicks < 0) || (DownButtonState == -1))
{
tone1.play(1000, 100);
RGBLedsOn = false;
EEPROM.write(RGBLEDsEEPROMAddress, 0);
#ifdef DEBUG
Serial.println(F(“RGB=off”));
#endif
}
}

static bool updateDateTime = false;
float curTemp=0;
switch (menuPosition)
{
case TimeIndex: //time mode
if (!transactionInProgress) stringToDisplay = updateDisplayString();
doDotBlink();
checkAlarmTime();
blankMask = B00000000;
break;
case DateIndex: //date mode
if (!transactionInProgress) stringToDisplay = updateDateString();
dotPattern = B01000000; //turn on lower dots
checkAlarmTime();
blankMask = B00000000;
break;
case AlarmIndex: //alarm mode
//stringToDisplay=”000000″;
//unsigned long execTime;
//execTime=micros();
stringToDisplay = PreZero(value[AlarmHourIndex]) + PreZero(value[AlarmMinuteIndex]) + PreZero(value[AlarmSecondIndex]);
blankMask = B00000000;
if (value[Alarm01] == 1) dotPattern = B10000000; //turn on upper dots
else
{
dotPattern = B00000000; //turn off upper dots
}
//execTime=micros()-execTime;
//Serial.println(execTime);
checkAlarmTime();
break;
case hModeIndex: //12/24 hours mode
stringToDisplay = “00” + String(value[hModeValueIndex]) + “00”;
blankMask = B00110011;
dotPattern = B00000000; //turn off all dots
checkAlarmTime();
break;
case TemperatureIndex: //missed break
case DegreesFormatIndex:

if (!transactionInProgress)
{
curTemp=getTemperature(value[DegreesFormatIndex]);
stringToDisplay = updateTemperatureString(curTemp);
if (value[DegreesFormatIndex] == CELSIUS)
{
blankMask = B00110001;
dotPattern = B01000000;
}
else
{
blankMask = B00100011;
dotPattern = B00000000;
}
}

if (curTemp < 0) dotPattern |= B10000000;
else dotPattern &= B01111111;
break;
case TimeZoneIndex:
case HoursOffsetIndex:
stringToDisplay = String(PreZero(value[HoursOffsetIndex])) + “0000”;
blankMask = B00001111;
if (value[HoursOffsetIndex]>=0) dotPattern = B00000000; //turn off all dots
else dotPattern = B10000000; //turn on upper dots
break;
case DateFormatIndex:
if (value[DateFormatIndex] == EU_DateFormat)
{
stringToDisplay=”311299″;
blinkPattern[DateDayIndex]=B00000011;
blinkPattern[DateMonthIndex]=B00001100;
}
else
{
stringToDisplay=”123199″;
blinkPattern[DateDayIndex]=B00001100;
blinkPattern[DateMonthIndex]=B00000011;
}
break;
case DateDayIndex:
case DateMonthIndex:
case DateYearIndex:
if (value[DateFormatIndex] == EU_DateFormat) stringToDisplay=PreZero(value[DateDayIndex])+PreZero(value[DateMonthIndex])+PreZero(value[DateYearIndex]);
else stringToDisplay=PreZero(value[DateMonthIndex])+PreZero(value[DateDayIndex])+PreZero(value[DateYearIndex]);
break;
}
// IRresults.value=0;
}
#if defined (__AVR_ATmega328P__)
String PreZero(int digit)
{
digit=abs(digit);
if (digit < 10) return String(“0”) + String(digit);
//if (digit < 10) return “0” + String(digit);
else return String(digit);
}
#endif

String updateDisplayString()
{
static int prevS=-1;

if (second()!=prevS)
{
prevS=second();
return getTimeNow();
} else return stringToDisplay;
}

String getTimeNow()
{
if (value[hModeValueIndex] == 24) return PreZero(hour()) + PreZero(minute()) + PreZero(second());
else return PreZero(hourFormat12()) + PreZero(minute()) + PreZero(second());
}
//// add-on void for TIMEZONE ////////////////////////////////////////////////////////////
// format and print a time_t value, with a time zone appended.
void printDateTime(time_t t, const char *tz)
{
char buf[32];
char m[4]; // temporary storage for month string (DateStrings.cpp uses shared buffer)
strcpy(m, monthShortStr(month(t)));
sprintf(buf, “%.2d:%.2d:%.2d %s %.2d %s %d %s”,
hour(t), minute(t), second(t), dayShortStr(weekday(t)), day(t), m, year(t), tz);
Serial.println(buf);
}
/////// Jantec.nl 2023-04-04 The Netherlands, Amsterdam. Please share and re-use! ////////
void doTest()
{
Serial.print(F(“Firmware version: “));
Serial.println(FirmwareVersion.substring(1,2)+”.”+FirmwareVersion.substring(2,5));
for (byte k = 0; k < strlen_P(HardwareVersion); k++) {
Serial.print((char)pgm_read_byte_near(HardwareVersion + k));
}
Serial.println();
#ifdef DEBUG
Serial.println(F(“Start Test”));
#endif

p=song;
parseSong(p);
//p=0; //need to be deleted

LEDsTest();
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
if (Serial1.available() > 20) Serial.println(F(“GPS detected”));
else Serial.println(F(“GPS NOT detected!”));
#endif

#ifdef tubes8
String testStringArray[11]={“00000000″,”11111111″,”22222222″,”33333333″,”44444444″,”55555555″,”66666666″,”77777777″,”88888888″,”99999999″,””};
testStringArray[10]=FirmwareVersion+”00″;
#endif
#ifdef tubes6
String testStringArray[11]={“000000″,”111111″,”222222″,”333333″,”444444″,”555555″,”666666″,”777777″,”888888″,”999999″,””};
testStringArray[10]=FirmwareVersion;
#endif

int dlay=500;
bool test=1;
byte strIndex=-1;
unsigned long startOfTest=millis()+1000; //disable delaying in first iteration
bool digitsLock=false;
while (test)
{
if (digitalRead(pinDown)==0) digitsLock=true;
if (digitalRead(pinUp)==0) digitsLock=false;

if ((millis()-startOfTest)>dlay)
{
startOfTest=millis();
if (!digitsLock) strIndex=strIndex+1;
if (strIndex==10) dlay=2000;
if (strIndex>10) { test=false; strIndex=10;}

stringToDisplay=testStringArray[strIndex];
#ifdef DEBUG
Serial.println(stringToDisplay);
#endif
}
#if defined (__AVR_ATmega328P__)
doIndication();
#endif
}

if ( !ds.search(addr))
{
#ifdef DEBUG
Serial.println(F(“Temp. sensor not found.”));
#endif
} else TempPresent=true;

testDS3231TempSensor();

#ifdef DEBUG
Serial.println(F(“Stop Test”));
#endif
// while(1);
}

void doDotBlink()
{
if (second()%2 == 0) dotPattern = B11000000;
else dotPattern = B00000000;
}

void setRTCDateTime(byte h, byte m, byte s, byte d, byte mon, byte y, byte w)
{
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); //stop Oscillator

Wire.write(decToBcd(s));
Wire.write(decToBcd(m));
Wire.write(decToBcd(h));
Wire.write(decToBcd(w));
Wire.write(decToBcd(d));
Wire.write(decToBcd(mon));
Wire.write(decToBcd(y));

Wire.write(zero); //start

Wire.endTransmission();

}

byte decToBcd(byte val) {
// Convert normal decimal numbers to binary coded decimal
return ( (val / 10 * 16) + (val % 10) );
}

byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val / 16 * 10) + (val % 16) );
}

void getRTCTime()
{
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 7);

RTC_seconds = bcdToDec(Wire.read());
RTC_minutes = bcdToDec(Wire.read());
RTC_hours = bcdToDec(Wire.read() & 0b111111); //24 hour time
RTC_day_of_week = bcdToDec(Wire.read()); //0-6 -> sunday – Saturday
RTC_day = bcdToDec(Wire.read());
RTC_month = bcdToDec(Wire.read());
RTC_year = bcdToDec(Wire.read());
}

int extractDigits(byte b)
{
String tmp = “1”;

if (b == B00000011)
{
tmp = stringToDisplay.substring(0, 2);
}
if (b == B00001100)
{
tmp = stringToDisplay.substring(2, 4);
}
if (b == B00110000)
{
tmp = stringToDisplay.substring(4);
}
return tmp.toInt();
}

void injectDigits(byte b, int value)
{
if (b == B00000011) stringToDisplay = PreZero(value) + stringToDisplay.substring(2);
if (b == B00001100) stringToDisplay = stringToDisplay.substring(0, 2) + PreZero(value) + stringToDisplay.substring(4);
if (b == B00110000) stringToDisplay = stringToDisplay.substring(0, 4) + PreZero(value);
}

bool isValidDate()
{
int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (value[DateYearIndex] % 4 == 0) days[1] = 29;
if (value[DateDayIndex] > days[value[DateMonthIndex] – 1]) return false;
else return true;

}

byte default_dur = 4;
byte default_oct = 6;
int bpm = 63;
int num;
long wholenote;
long duration;
byte note;
byte scale;
char* parseSong(char *p)
{
// Absolutely no error checking in here
// format: d=N,o=N,b=NNN:
// find the start (skip name, etc)

while (*p != ‘:’) p++; // ignore name
p++; // skip ‘:’

// get default duration
if (*p == ‘d’)
{
p++; p++; // skip “d=”
num = 0;
while (isdigit(*p))
{
num = (num * 10) + (*p++ – ‘0’);
}
if (num > 0) default_dur = num;
p++; // skip comma
}

// get default octave
if (*p == ‘o’)
{
p++; p++; // skip “o=”
num = *p++ – ‘0’;
if (num >= 3 && num <= 7) default_oct = num;
p++; // skip comma
}

// get BPM
if (*p == ‘b’)
{
p++; p++; // skip “b=”
num = 0;
while (isdigit(*p))
{
num = (num * 10) + (*p++ – ‘0’);
}
bpm = num;
p++; // skip colon
}

// BPM usually expresses the number of quarter notes per minute
wholenote = (60 * 1000L / bpm) * 4; // this is the time for whole note (in milliseconds)
return p;
}

// now begin note loop
static unsigned long lastTimeNotePlaying = 0;
char* playmusic(char *p)
{
if (*p == 0)
{
return p;
}
if (millis() – lastTimeNotePlaying > duration)
lastTimeNotePlaying = millis();
else return p;
// first, get note duration, if available
num = 0;
while (isdigit(*p))
{
num = (num * 10) + (*p++ – ‘0’);
}

if (num) duration = wholenote / num;
else duration = wholenote / default_dur; // we will need to check if we are a dotted note after

// now get the note
note = 0;

switch (*p)
{
case ‘c’:
note = 1;
break;
case ‘d’:
note = 3;
break;
case ‘e’:
note = 5;
break;
case ‘f’:
note = 6;
break;
case ‘g’:
note = 8;
break;
case ‘a’:
note = 10;
break;
case ‘b’:
note = 12;
break;
case ‘p’:
default:
note = 0;
}
p++;

// now, get optional ‘#’ sharp
if (*p == ‘#’)
{
note++;
p++;
}

// now, get optional ‘.’ dotted note
if (*p == ‘.’)
{
duration += duration / 2;
p++;
}

// now, get scale
if (isdigit(*p))
{
scale = *p – ‘0’;
p++;
}
else
{
scale = default_oct;
}

scale += OCTAVE_OFFSET;

if (*p == ‘,’)
p++; // skip comma for next note (or we may be at the end)

// now play the note

if (note)
{
tone1.play(notes[(scale – 4) * 12 + note], duration);
if (millis() – lastTimeNotePlaying > duration)
lastTimeNotePlaying = millis();
else return p;
tone1.stop();
}
else
{
return p;
}
#ifdef DEBUG
Serial.println(F(“Incorrect Song Format!”));
#endif
return 0; //error
}

void incrementValue()
{
enteringEditModeTime = millis();
if (editMode == true)
{
if (menuPosition != hModeValueIndex) // 12/24 hour mode menu position
value[menuPosition] = value[menuPosition] + 1; else value[menuPosition] = value[menuPosition] + 12;
if (value[menuPosition] > maxValue[menuPosition]) value[menuPosition] = minValue[menuPosition];
if (menuPosition == Alarm01)
{
if (value[menuPosition] == 1) /*digitalWrite(pinUpperDots, HIGH);*/dotPattern = B10000000; //turn on upper dots
/*else digitalWrite(pinUpperDots, LOW); */ dotPattern = B00000000; //turn off all dots
}
if (menuPosition!=DateFormatIndex) injectDigits(blinkMask, value[menuPosition]);
/*Serial.print(“value=”);
Serial.println(value[menuPosition]);*/
}
}

void dicrementValue()
{
enteringEditModeTime = millis();
if (editMode == true)
{
if (menuPosition != hModeValueIndex) value[menuPosition] = value[menuPosition] – 1; else value[menuPosition] = value[menuPosition] – 12;
if (value[menuPosition] < minValue[menuPosition]) value[menuPosition] = maxValue[menuPosition];
if (menuPosition == Alarm01)
{
if (value[menuPosition] == 1) /*digitalWrite(pinUpperDots, HIGH);*/ dotPattern = B10000000; //turn on upper dots
else /*digitalWrite(pinUpperDots, LOW);*/ dotPattern = B00000000; //turn off all dots
}
if (menuPosition!=DateFormatIndex) injectDigits(blinkMask, value[menuPosition]);
/*Serial.print(“value=”);
Serial.println(value[menuPosition]);*/
}
}

bool Alarm1SecondBlock = false;
unsigned long lastTimeAlarmTriggired = 0;
void checkAlarmTime()
{
if (value[Alarm01] == 0) return;
if ((Alarm1SecondBlock == true) && ((millis() – lastTimeAlarmTriggired) > 1000)) Alarm1SecondBlock = false;
if (Alarm1SecondBlock == true) return;
if ((hour() == value[AlarmHourIndex]) && (minute() == value[AlarmMinuteIndex]) && (second() == value[AlarmSecondIndex]))
{
lastTimeAlarmTriggired = millis();
Alarm1SecondBlock = true;
#ifdef DEBUG
Serial.println(F(“Wake up, Neo!”));
#endif
p = song;
}
}

void modesChanger()
{
if (editMode == true) return;
static unsigned long lastTimeModeChanged = millis();
static unsigned long lastTimeAntiPoisoningIterate = millis();
static int transnumber = 0;
if ((millis() – lastTimeModeChanged) > modesChangePeriod)
{
lastTimeModeChanged = millis();
if (transnumber == 0) {
menuPosition = DateIndex;
modesChangePeriod = dateModePeriod;
}
if (transnumber == 1) {
menuPosition = TemperatureIndex;
modesChangePeriod = dateModePeriod;
if (!TempPresent) transnumber = 2;
}
if (transnumber == 2) {
menuPosition = TimeIndex;
modesChangePeriod = timeModePeriod;
}
transnumber++;
if (transnumber > 2) transnumber = 0;

if (modeChangedByUser == true)
{
menuPosition = TimeIndex;
}
modeChangedByUser = false;
}
if ((millis() – lastTimeModeChanged) < 2000)
{
if ((millis() – lastTimeAntiPoisoningIterate) > 100)
{
lastTimeAntiPoisoningIterate = millis();
if (TempPresent)
{
if (menuPosition == TimeIndex) stringToDisplay = antiPoisoning2(updateTemperatureString(getTemperature(value[DegreesFormatIndex])), getTimeNow());
if (menuPosition == DateIndex) stringToDisplay = antiPoisoning2(getTimeNow(), PreZero(day()) + PreZero(month()) + PreZero(year() % 1000) );
if (menuPosition == TemperatureIndex) stringToDisplay = antiPoisoning2(PreZero(day()) + PreZero(month()) + PreZero(year() % 1000), updateTemperatureString(getTemperature(value[DegreesFormatIndex])));
} else
{
if (menuPosition == TimeIndex) stringToDisplay = antiPoisoning2(PreZero(day()) + PreZero(month()) + PreZero(year() % 1000), getTimeNow());
if (menuPosition == DateIndex) stringToDisplay = antiPoisoning2(getTimeNow(), PreZero(day()) + PreZero(month()) + PreZero(year() % 1000) );
}
// Serial.println(“StrTDInToModeChng=”+stringToDisplay);
}
} else
{
transactionInProgress = false;
}
}

String antiPoisoning2(String fromStr, String toStr)
{
//static bool transactionInProgress=false;
//byte fromDigits[6];
static byte toDigits[6];
static byte currentDigits[6];
static byte iterationCounter = 0;
if (!transactionInProgress)
{
transactionInProgress = true;
blankMask = B00000000;
for (int i = 0; i < 6; i++)
{
currentDigits[i] = fromStr.substring(i, i + 1).toInt();
toDigits[i] = toStr.substring(i, i + 1).toInt();
}
}
for (int i = 0; i < 6; i++)
{
if (iterationCounter < 10) currentDigits[i]++;
else if (currentDigits[i] != toDigits[i]) currentDigits[i]++;
if (currentDigits[i] == 10) currentDigits[i] = 0;
}
iterationCounter++;
if (iterationCounter == 20)
{
iterationCounter = 0;
transactionInProgress = false;
}
String tmpStr;
for (int i = 0; i < 6; i++)
tmpStr += currentDigits[i];
return tmpStr;
}

String updateDateString()
{
static unsigned long lastTimeDateUpdate = millis()+1001;
static String DateString = PreZero(day()) + PreZero(month()) + PreZero(year() % 1000);
static byte prevoiusDateFormatWas=value[DateFormatIndex];
if (((millis() – lastTimeDateUpdate) > 1000) || (prevoiusDateFormatWas != value[DateFormatIndex]))
{
lastTimeDateUpdate = millis();
if (value[DateFormatIndex]==EU_DateFormat) DateString = PreZero(day()) + PreZero(month()) + PreZero(year() % 1000);
else DateString = PreZero(month()) + PreZero(day()) + PreZero(year() % 1000);
}
return DateString;
}

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

void SyncWithGPS()
{
if ((millis() – GPS_Date_Time.GPS_Data_Parsed_time) > 3000) {
Serial.println(F(“Parsed data to old”));
return;
}
Serial.println(F(“Updating time from GPS…”));
Serial.println(GPS_Date_Time.GPS_hours);
Serial.println(GPS_Date_Time.GPS_minutes);
Serial.println(GPS_Date_Time.GPS_seconds);

setTime(GPS_Date_Time.GPS_hours, GPS_Date_Time.GPS_minutes, GPS_Date_Time.GPS_seconds, GPS_Date_Time.GPS_day, GPS_Date_Time.GPS_mounth, GPS_Date_Time.GPS_year % 1000);
adjustTime((long)value[HoursOffsetIndex] * 3600);
setRTCDateTime(hour(), minute(), second(), day(), month(), year() % 1000, 1);
Last_Time_GPS_Sync = MillsNow;
GPS_Sync_Interval = GPS_SYNC_INTERVAL;
AttMsgWasShowed=false;

//// TIMEZONE add-ons
while (!Serial) ; // wait until Arduino Serial Monitor opens
//setSyncProvider(RTC.get); // the function to get the time from the RTC
//if(timeStatus()!= timeSet)
// Serial.println(“Unable to sync with the RTC”);
//else
// Serial.println(“RTC has set the system time”);

time_t utc = now();
time_t local = myTZ.toLocal(utc, &tcr);
Serial.println();
printDateTime(utc, “UTC”);
printDateTime(local, tcr -> abbrev);

setTime(myTZ.toLocal(utc, &tcr));
EEPROM.write(DateFormatEEPROMAddress, value[myTZ.toLocal(utc, &tcr)]);
//Serial.println(EEPROM.read(HourFormatEEPROMAddress));// check whether the new timezon’s winter /summer time is put in memory
//setTime(hour(), minute(), second(), value[DateDayIndex], value[DateMonthIndex], 2000 + value[DateYearIndex]);
//EEPROM.write(DateFormatEEPROMAddress, value[DateFormatIndex]);

//// End of TIMEZONE add-ons

 

}

void GetDataFromSerial1()
{
if (Serial1.available()) { // If anything comes in Serial1 (pin 19)
byte GPS_incoming_byte;
GPS_incoming_byte = Serial1.read();
//Serial.write(GPS_incoming_byte);
GPS_Package[GPS_position] = GPS_incoming_byte;
GPS_position++;
if (GPS_position == GPS_BUFFER_LENGTH – 1)
{
GPS_position = 0;
// Serial.println(“more then BUFFER_LENGTH!!!!”);
}
if (GPS_incoming_byte == 0x0A)
{
GPS_Package[GPS_position] = 0;
GPS_position = 0;
if (ControlCheckSum()) {
if (GPS_Parse_DateTime()) SyncWithGPS();
}

}
}
}

bool GPS_Parse_DateTime()
{
bool GPSsignal = false;
if (!((GPS_Package[0] == ‘$’)
&& (GPS_Package[3] == ‘R’)
&& (GPS_Package[4] == ‘M’)
&& (GPS_Package[5] == ‘C’))) {
return false;
}
else
{
// Serial.println(“RMC!!!”);
}
//Serial.print(“hh: “);
int hh = (GPS_Package[7] – 48) * 10 + GPS_Package[8] – 48;
//Serial.println(hh);
int mm = (GPS_Package[9] – 48) * 10 + GPS_Package[10] – 48;
//Serial.print(“mm: “);
//Serial.println(mm);
int ss = (GPS_Package[11] – 48) * 10 + GPS_Package[12] – 48;
//Serial.print(“ss: “);
//Serial.println(ss);

byte GPSDatePos = 0;
int CommasCounter = 0;
for (int i = 12; i < GPS_BUFFER_LENGTH ; i++)
{
if (GPS_Package[i] == ‘,’)
{
CommasCounter++;
if (CommasCounter == 8)
{
GPSDatePos = i + 1;
break;
}
}
}
//Serial.print(“dd: “);
int dd = (GPS_Package[GPSDatePos] – 48) * 10 + GPS_Package[GPSDatePos + 1] – 48;
//Serial.println(dd);
int MM = (GPS_Package[GPSDatePos + 2] – 48) * 10 + GPS_Package[GPSDatePos + 3] – 48;
//Serial.print(“MM: “);
//Serial.println(MM);
int yyyy = 2000 + (GPS_Package[GPSDatePos + 4] – 48) * 10 + GPS_Package[GPSDatePos + 5] – 48;
//Serial.print(“yyyy: “);
//Serial.println(yyyy);
//if ((hh<0) || (mm<0) || (ss<0) || (dd<0) || (MM<0) || (yyyy<0)) return false;
if ( !inRange( yyyy, 2018, 2038 ) ||
!inRange( MM, 1, 12 ) ||
!inRange( dd, 1, 31 ) ||
!inRange( hh, 0, 23 ) ||
!inRange( mm, 0, 59 ) ||
!inRange( ss, 0, 59 ) ) return false;
else
{
GPS_Date_Time.GPS_hours = hh;
GPS_Date_Time.GPS_minutes = mm;
GPS_Date_Time.GPS_seconds = ss;
GPS_Date_Time.GPS_day = dd;
GPS_Date_Time.GPS_mounth = MM;
GPS_Date_Time.GPS_year = yyyy;
GPS_Date_Time.GPS_Data_Parsed_time = millis();
//Serial.println(“Precision TIME HAS BEEN ACCURED!!!!!!!!!”);
//GPS_Package[0]=0x0A;
return 1;
}
}

uint8_t ControlCheckSum()
{
uint8_t CheckSum = 0, MessageCheckSum = 0; // check sum
uint16_t i = 1; // 1 sybol left from ‘$’

while (GPS_Package[i] != ‘*’)
{
CheckSum ^= GPS_Package[i];
if (++i == GPS_BUFFER_LENGTH) {
//Serial.println(F(“End of the line not found”)); // end of line not found
return 0;
}
}

if (GPS_Package[++i] > 0x40) MessageCheckSum = (GPS_Package[i] – 0x37) << 4; // ASCII codes to DEC convertation
else MessageCheckSum = (GPS_Package[i] – 0x30) << 4;
if (GPS_Package[++i] > 0x40) MessageCheckSum += (GPS_Package[i] – 0x37);
else MessageCheckSum += (GPS_Package[i] – 0x30);

if (MessageCheckSum != CheckSum) {
//Serial.println(F(“wrong checksum”)); // wrong checksum
return 0;
}
//Serial.println(“Checksum is ok”);
return 1; // all ok!
}

boolean inRange( int no, int low, int high )
{
if ( no < low || no > high )
{
Serial.println(F(“Date or Time not in range”));
//Serial.println(String(no) + “:” + String (low) + “-” + String(high));
return false;
}
return true;
}

#endif

String updateTemperatureString(float fDegrees)
{
static unsigned long lastTimeTemperatureString=millis()+1100;
static String strTemp =”000000″;
if ((millis() – lastTimeTemperatureString) > 1000)
{
//Serial.println(F(“Updating temp. str.”));
lastTimeTemperatureString = millis();
int iDegrees = round(fDegrees);
if (value[DegreesFormatIndex] == CELSIUS)
{
strTemp = “0” + String(abs(iDegrees)) + “0”;
if (abs(iDegrees) < 1000) strTemp = “00” + String(abs(iDegrees)) + “0”;
if (abs(iDegrees) < 100) strTemp = “000” + String(abs(iDegrees)) + “0”;
if (abs(iDegrees) < 10) strTemp = “0000” + String(abs(iDegrees)) + “0”;
}else
{
strTemp = “0” + String(abs(iDegrees)) + “0”;
if (abs(iDegrees) < 1000) strTemp = “00” + String(abs(iDegrees)/10) + “00”;
if (abs(iDegrees) < 100) strTemp = “000” + String(abs(iDegrees)/10) + “00”;
if (abs(iDegrees) < 10) strTemp = “0000” + String(abs(iDegrees)/10) + “00”;
}

#ifdef tubes8
strTemp= “”+strTemp+”00”;
#endif
return strTemp;
}
return strTemp;
}

float getTemperature (boolean bTempFormat)
{
static float fDegrees;
static int iterator=0;
static byte TempRawData[2];
/*unsigned long execTime=0;
execTime=micros();*/
switch (iterator)
{
case 0: ds.reset(); break;
case 1: ds.write(0xCC, 0); break; //skip ROM command
case 2: ds.write(0x44, 0); break; //send make convert to all devices
case 3: ds.reset(); break;
case 4: ds.write(0xCC, 0); break; //skip ROM command
case 5: ds.write(0xBE, 0); break; //send request to all devices
case 6: TempRawData[0] = ds.read(); break;
case 7: TempRawData[1] = ds.read(); break;
default: break;
}

if (iterator == 7)
{
int16_t raw = (TempRawData[1] << 8) | TempRawData[0];
if (raw == -1) raw = 0;
float celsius = (float)raw / 16.0;
//celsius = celsius + (float)value[TempAdjustIndex]/10;//users adjustment

if (!bTempFormat) fDegrees = celsius * 10;
else fDegrees = (celsius * 1.8 + 32.0) * 10;
}
/*execTime=micros()-execTime;
Serial.print(iterator);
Serial.println(execTime);*/
iterator++;
if (iterator==8) iterator=0;
return fDegrees;
}

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ISR(TIMER4_COMPA_vect)
{
sei();
doIndication();
}

void timerSetup()
{
//timer3 setup for calling doIndication function
TCCR4A = 0; //control registers reset (WGM21, WGM20)
TCCR4B = 0; //control registers reset
TCCR4B = (1 << CS12)|(1 << CS10)|(1 << WGM12); //prescaler 1024 and CTC mode
//OCR5A = 31; //2 mS
TCNT4=0; //reset counter to 0
OCR4A = 46; //3mS
//OCR4A = 92; //6mS
TIMSK4 = (1 << OCIE1A);//TIMER3_COMPA_vect interrupt enable
sei();
}
#endif

void testDS3231TempSensor()
{
int8_t DS3231InternalTemperature=0;
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0x11);
Wire.endTransmission();

Wire.requestFrom(DS1307_ADDRESS, 2);
DS3231InternalTemperature=Wire.read();
Serial.print(F(“DS3231_T=”));
Serial.println(DS3231InternalTemperature);
if ((DS3231InternalTemperature<5) || (DS3231InternalTemperature>60))
{
Serial.println(F(“Faulty DS3231!”));
for (int i=0; i<5; i++)
{
tone1.play(1000, 1000);
delay(2000);
}
}
}

BYD Atto 3 trekhaak te bestellen bij Burghof trekhaken

Er staat bij mijn Atto 3 V1 dus geen toegestaan trekgewicht op het kenteken.

Dat is in Nieuw Zeeland en Australië bijvoorbeeld wel op tijd geregeld.

Hier komt dat volgens BYD naar verwachting pas in Q2-Q3 2023 op het kenteken van een nieuwe Atto 3 maar dan is het voor mij wel te laat.

UPDATE 2023-05-13: Bericht ontvangen vanuit een Atto3 rijder uit België dat de BYD Ato3 definitief GEEN homologatie krijgt voor een trekhaak, zowel in NL als in BE niet. Dat betekent waarschijnlijk dat in Europa nergens homologatie voor de trekhaak zal komen.  In België komt tevens GEEN homologatie voor een trekhaak voor fietsdrager.  In Nederland is de regelgeving niet helemaal duidelijk maar worden trekhaken die zijn goedgekeurd conform Tüv (DE) norm, gedoogd als trekhaak voor fietsdragers op auto’s zonder trekhaak homologatie.

Mijn kenteken is van midden november 2022 en ligt al vast, de homologatie is daarvoor sowieso al zonder trekhaak geweest.

De oplossing voor mij is gevonden: Voor de fietsdrager dan in ieder geval.

Burghof trekhaken uit Arnhem heeft een trekhaak voor de Atto3 ontwikkeld, uitsluitend geschikt voor gebruik met een fietsdrager of voor het plaatsen van een bagagebox.

Mijn wagen is hiervoor eind maart gebruikt om een BOSSTOW trekhaak te maken die past op de Atto3, en  deze is eind april leverbaar bij Burghof trekhaken.

De trekhaak is verticaal afneembaar, uitgevoerd met slot en is leverbaar inclusief kabelset en montage-instructies.

Zoals verwacht kreeg ik een Duits Tüv-toelatingspapier bij de trekhaak waarop staat dat de trekhaak alleen bedoeld is voor het monteren van een fietsendrager of een trekhaakbox met een maximale verticale kogeldruk van 60kg.  Vandaar  de pin in de kop van de trekhaak.

Niettemin is de BOSSTOW trekhaak als geheel in staat om 11,6 kiloNewton te trekken  (1160 kg), wat veel meer is dan de door BYD (in NZ) toegestane 750 kg, en de verticale druk van de BOSSTOW trekhaak mag volgens de BOSSTOW sticker op de afneembare trekhaak worden gebruikt tot een maximale kogeldruk van 140 kg.

Je kan de BYD ATTO3  trekhaak (voor gebruik met fietsendrager of bagagebox) bestellen bij Burghof op hun website en deze laten installeren bij één van Burghof’s installatiepartners:

UPDATE 20230523:

Onderstaand is een knipsel van de RDW site weergegeven over het keuren in Lelystad om een verhoging van het trekgewicht te laten vaststellen.

Ik blijf alles in het werk stellen om mijn Bosstow Tüv erkende trekhaak officieel te maken!  Puntje 2 kan natuurlijk nog moeilijk worden. en ik heb de vraag alvast maar bij BYD neergelegd.

Ook al is de trekhaak a.g.v. de beperking in gebruik door de missende homologatie op de COC van de Atto3 op de papieren van Bosstow als fitsendrager trekhaak geclassificeerd, is de constructie van de trekhaak veel steviger dan nodig voor de fietsdrager functie.

Dat is nl. zichtbaar op het typeplaatje van de trekhaak zoals boven weergegeven.

De D-value is 11.6 kN en de verticale toegestane maximale kogeldruk is 140kg.

 

Mazda 3 2004 hatchback vervangen voorspatborden

Voorschermen vervangen en in Mazda  kleur A75 gezet:

Rechts op de foto zie je de onderkant van het spatbord, helemaal rot door het blad dat zich onderin ophoopt..

Wielen eraf en op de autobokken gezet.

Spatborden eraf en daarna de kokerbalk en dorpel gerepareerd (zie ander artikel)

 

Roestschade onderaan

Roestschade spatbordrand

Roestschade andere kant

2 nieuwe voorschermen besteld

2k epoxy etchprimer (MIPA)

2 lagen A75 (Mazda) metallic basislak.  Deze droogt mat op.

Met 600 waterproof tussendoor geschuurd en gereinigd, daarna weer rode basislak

En daarna 2 lagen 2K clearcoat en een verdunde wetcoat eroverheen

2 dagen uitharden

Rechts alles in de ML gezet, ook de kokerbalken waaronder die in de motorruimte.  Daarna de spatborden er op, koplampen monteren, voorbumper weer monteren, modderkuipen er weer in.  Daarna de bescherm strips  onder de dorpels er weer op enzovoorts.

Klaar, na het reinigen en in de was zetten van de auto.

Mazda 3 2004 hatchback reparatie kokerbalk en dorpel

De rechter dorpel en daarachter de dragende kokerbalk hersteld:

Roestschade rechter dorpel en daarachter ook aan de kokerbalk. Zie ook helemaal rechts de verroeste onderkant van het rechter voorscherm.

In de dorpels en in de kokerbalken alles over de hele lengte afgewerkt met de hogedruk tectylspuit met ML oplossing.  (Beide kanten)

Dit komt onder de kunststof afwerk/beschermstrip maar toch even in de juiste kleur gespoten.

De kokers, dorpels binnenzijde en alle open delen aan de onderkant zijn in de ML gespoten.

Startmotor Traction Avant (12 Volt) reparatie met nieuwe koolborstel

En opeens wilde de Traction Avant niet meer starten.

Het ging al een paar keer wat moeizaam, alsof de accu leeg was maar die was netjes vol.

En opeens alleen nog maar een klik in  plaats van een draaiende startmotor.

Ik heb een Paris-Rhône 12V ID-startmotor in mijn Traction Avant

-welke past op het vliegwiel van mijn ooit in de TA gemonteerde lange slag Citroën ID (DW) motor.

Zie de foto hieronder,  De startmotor zit onder het uitlaatspruitstuk van deze motor, op dezelfde originele plek als bij de Traction Avant 11D motor.

De startmotor kun je ook onderlangs verwijderen, maar terugzetten gaat echt gemakkelijker langs de bovenkant. Tenzij je een brug hebt natuurlijk.

Ik heb als mogelijke noodvoorziening nog wel even de originele Traction Avant 6Volt startmotor gemonteerd maar deze grijpt dus niet aan in het Citroën ID vliegwiel.  Dus maar weer snel verwijderd.

De reparatie:

Wanneer je aan de achterkant van de 12 Volt Paris-Rhône startmotor  de twee M6 moeren en borgplaatjes  verwijderd schuif je daarna de aluminium achterzijde inclusief de beide koolborstelhouders er een stukje vanaf.

De koolborstel aan de ankerzijde (+) was de boosdoener, deze is behoorlijk scheef afgesleten.  Het lijkt er op dat één van de aansluitdraden net iets te weinig ruimte had om de borstel recht te laten bewegen.

Vervolgens heb ik de koolborstels gemeten en besteld.

De startmotor is verder nog in prima conditie, ook de rotor en collector zien er goed uit.

De koolborstels zijn qua maat hetzelfde (ca. 7×17,8 mm) , en ze hebben dezelfde soort gesoldeerde draadaansluitingen.

Uiteindelijk was het alleen nodig de koolborstel aan de ankerzijde te vervangen, de andere koolborstel die aan de minus ligt, is nauwelijks afgesleten.

Boven met de voorgesoldeerde draden alvast gemonteerd, en onder NA het solderen,  na montage van de koolborstel in de koolborstelhouder.

De rotor was helemaal vlak dus afdraaien leek me niet zinvol.

Na het schoonmaken en monteren heb ik alles eerst met een kleine motoraccu  getest, alles een beetje vet gegeven, de achterkant geborgd met de 2 borgplaatjes en heb ik de startmotor weer ingebouwd in de TA.

Direct starten en alles weer OK!

 

BYD Atto3 – reservewiel onderin de kofferbak

Boven zie je de vulling van de ruimte onderin de kofferbak van de Atto3.

Ik rijd graag met een thuisbrenger rond, omdat ik nogal eens op bouwplaatsen rijd en tot nu heb ik daar 2x een schade aan een band door gehad.  En zo’n schade is niet altijd op te lossen met een vloeistof reparatiekit.

Het wordt een thuisbrenger die ook wordt gebruikt bij een Toyota RAV4 :  165/80/17 band en een 5X114.3X60.1, 17 inch velg met dezelfde omtrek, steek en center gat als de BYD Atto3.  De RAV4 is nog een stukje zwaarder dan de Atto3, dus moet dat goed gaan.

De ruimte voor een thuisbrenger is onderin de ruimte voor een eventueel reservewiel maar 57 centimeter in diameter.

Een en ander betekent dat het reservewiel iets hoger komt te liggen, op een montagebeugel.  Onder het reservewiel is dan plek voor de krik en dergelijke.

De afdekking van de kofferbak had 2 standen, en deze plank onderin de kofferbak komt hierdoor maar op één mogelijke montagediepte,  dus in de hoogste stand.

En zó ligt de gbrote reserveband er dus in: Onder de afdekplank.  Er is nog een hydraulische potkrik bijgekomen en een kruissleutel.  Mocht het ooit nodig zijn is het in ieder geval een complete set. Niet de mooiste manier, maar het werkt wel. De plank die bij de auto wordt geleverd kan probleemloos in de bovenste positie worden geplaatst.

Om de band naar beneden te houden, heb ik een montagebeugel gemaakt van vierkant ijzeren buis 20-20-2mm met 3 gaten: 2 om hem met M6-moeren vast te zetten aan 2 van de 4 reeds beschikbare M6-bouten met schroefdraad en 1 gat in het midden van het vierkant voor een M10-bout die naar boven steekt.

De M10 bout gaat door 1 van de boutgaten van de velg. met een sluitring en een vleugelmoer aan de bovenkant van de velg.

Ik heb de M10 bout in het midden van het vierkante staal gelast en het achterste deel bijna gelijk gemaakt met het vierkante staal.

Daarna heb ik de beugel op de vloer van de kofferbak gemonteerd met 6mm gebogen M6 IKEA moeren die ik nog had liggen van een oud dubbel kinderbed.

Deze moeren zijn ongeveer 15 mm lang met een grote platte kop aan de bovenkant en een Inbus-inzetstuk in de bovenkant. Dit is ideaal, omdat de M6 stalen boutuiteinden die uit de kofferbak steken maar ongeveer 18mm lang zijn en niet door de 20mm vierkante buis steken.

BTW: ik heb de voorste (vanaf de opening van de kofferbak gezien) 2 niet gebruikte staande M6 bouten ingekort tot de hoogte dat er elk één M6 moer op past, kan handig zijn in de toekomst.

Nadat het reservewiel was gemonteerd en vastgezet met de sluitring en M10 vleugelmoer op de beugel, gebruikte ik de tas die bij het verwijderbare deel van de trekhaak zit om alle losse onderdelen in op te bergen.

Kerstster deur/raamhanger Arduino nano en WS2812 LEDS en LDR

Geprint op de Voron2.4-300 met wit PETG filament.

De ster bestaat uit 5 gelijke delen. Je moet de 5 delen printen, de LED’s er doorheen voeren en daarna de draden er ergens uit laten komen.  De punten kun je na het monteren en testen aan elkaar lijmen met hotglue of superglue.

De 3 draden van de WS2812 LED string soldeer je aan de Arduino Nano (5V aan 5V, Gnd aan Gnd en de Data IN van de LED string soldeer je aan D3 of D5 van de Arduino Nano.  That’s it!   Daarna kun je de Arduino aan je PC koppelen met een data USB kabel en kun je de code downloaden van mijn website.

undefined

IK houd het meestal gemakkelijk en gebruik een telefoonlader met een USB kabel, die past in de Arduino nano.  Dan soldeer je de 3 draden van je WS2812 leds aan VIN (+), GND (-) en D5 (data).  Optioneel kun je een LDR (lichtgevoelige weerstand) aansluiten op A0 en Gnd.

In mijn latere ontwerpen heb ik dus een LDR toegevoegd tussen A0 en Gnd.  Met een stukje extra code is de intensiteit van de ster nu automatisch afgestemd op het omgevingslicht.  Daarnaast heb ik een aantal extra lichteffecten gemaakt.

 

Als je de Arduino IDE nog niet hebt, download dan de app van de Microsoft website (Arduino IDE).

Zorg dat je mijn Arduino code download en open dit met de Arduino IDE APP> Waarschijnlijk moet de APP de arduino INO file nog herplaatsen in een nieuwe directory maar dat hoort vanzelf te gaan. Zo niet, doe dat dan zelf even.

Selecteer in de Arduino IDE de juiste microprocessor (Arduino Nano)..  Vervolgens de juiste versie processor (groot of klein geheugen) en de oude of nieuwe bootloader.  Deze keuzes zijn afhankelijk van het soort Nano dat je hebt gekocht of nog had liggen.  Daarna kies je de juiste poort (USB) voor je Nano.

Om te testen of je verbinding hebt tussen IDE en Nano , kun je opvragen of de Arduino IDE je Nano kan lezen.  Pas hierna kun je de Nano gaan laden met het gecomplieerde programma.

Succes!

De Arduino code zonder LDR staat HIER.

De arduino code MET LDR staat HIER:

De STL file voor de 76cm ster staat HIER.  Deze moet je 5x printen en in elkaar lijmen.  De LEDS kun je binnen door elk segment voeren.  Dat is een beetje puzzelen maar echt mogelijk.  Zie het voorbeeld:

BYD Atto3 over op all-weather banden Bridgestone 235/50 R18 101H XL (GAN) Weather Control A005

Opeens sneeuwt het in Nederland, krap een week nadat mijn BYD Atto 3 op 14-11-2022 is geleverd.  De wagen is met prima Continental zomerbanden geleverd:

 

Maar ik heb gen zin in bandenwissels 2x per jaar dus worden het bij de wagen passende all-weather banden.

Na wat onderzoek heb ik gekozen voor all-weather banden met dezelfde maat als de zomerbanden waar de Atto3  mee is geleverd: 235/50/18.

In verband met het gewicht van de auto (1725 kg) zijn stevige banden nodig, niet zo zeer  vanwege de maximum snelheid van 160 km/h.

Het zijn dus deze all-seasons banden geworden:  Bridgestone 235/50 R18 101H XL (GAN) Weather Control A005.  De nieuwe banden komen op de originele velgen en de Continental zomerbanden gaan voorlopig de opslag in.

De energieklasse van de Bridgestone all-weathers komt op klasse A, regen- en sneeuwbestendigheid komt op B en het geluid komt op 72dB.

Deze banden hebben een sneeuwvlok als merkje op de band dus je mag er in ieder geval ook ’s winters ook mee in Duitsland rijden.

Na de montage (13-12-2022) eerst maar eens zien hoe deze banden bevallen,

Na ruim 3 maanden met de all-weather banden te hebben gereden kan ik mijn ervaring delen: gewoon top.

Er is al een paar keer ijs en ijzel geweest en daar zijn de Bridgestones perfect op ingesteld.

Remmen is goed en vooral bochten bij nat en koud weer is perfect!

Het blijft natuurlijk altijd mijn eigen beleving, de Bridgestone zomerbanden zijn ook OK, maar ik rijd altijd al met zomer/winterbanden of all-weathers.  Dus ben ik gewend aan optimale grip bij wintercondities.  Dat is in ieder geval wat mij betreft goed gelukt!

Laadaansluiting via verlengkabel en aansluitbox naar wallbox copper

Ik heb een wallbox copper laadstation voor een elektrische wagen met load balancer dat ik zowel in de garage gebruik als aan de voorkant van het huis met 11kW laden via krachtstroom.

Aan de voorkant van het huis ligt een openbare stoep en parkeren is beschikbaar voor iedereen.  Meestal is er geen plek om de auto voor de deur te parkeren als ik thuis kom.

Als ik in de garage wil laden moet ik eerst de oude auto buiten parkeren zodat de EV er in kan om te laden.  Omdat ik altijd overdag thuis werk kan ik op die momenten altijd de auto voor de deur parkeren om te laden. Maar de gemeente Woerden heeft in haar bestaande besluit over haar laadbeleid uit 2017 o.a. opgenomen dat het niet is toegestaan om over de stoep een laadkabel te leggen.  Andere opties voor thuisladen zoals een laadgoot in de tegels of andere oplossingen zijn ook (nog) niet toegestaan. Uitgangspunt van het gemeentebeleid is openbaar laden vanuit door gebruikers gedreven aanvragen.   Dat heb ik gedaan via een aanvraag bij de door de gemeente gekozen partij, en dat heeft na 9 maanden nog steeds tot niets geleid.  Er zijn allerlei redenen zoals het volle stroomnet en het doorlopen van bezwaarprocedures waardoor het aanleggen van publieke laadpunten niet erg snel  mogelijk is. maar bij mij thuis was het binnen 2 weken met Stedin geregeld.  Nu kan ik thuis gewoon met 11kW laden.  Maar het gemeentebeleid staat dat aan de openbare weg niet toe.

Dus laad ik openbaar wanneer het kan of in de garage.  Ik hoop dat de gemeente onder druk van haar bewoners uiteindelijk wel alternatieven zal toestaan om laadkabels veilig over de openbare stoep te gebruiken.  Er is nogal wat politieke druk om hierin te bewegen.  Het bestaande laadbeleid van gemeente Woerden is van voor de tijd dat er EV’s in groeiende aantallen beschikbaar zijn, dus het is sowieso tijd om hierin qua visie te gaan veranderen.

Zoals inmiddels uit gebruikerservaringen duidelijk is, zal het aanschaffen van EV’s aanzienlijk worden gestimuleerd wanneer er thuislaadoplossingen beschikbaar komen inclusief oplossingen voor aansluiten van je EV aan je thuislader via de openbare ruimte. In een groeiend aantal gemeenten is dit al geregeld, zij het meestal op basis van tijdelijke proeven.

Om de EV thuis te kunnen laden heb ik alvast de volgende zaken uitgevoerd:

Eerst heb ik de meterkast vervangen met een 3-fase meterkast met zekeringautomaten.

Daarna heb ik ook nog een krachtstroomkabel aangelegd naar de garage, inclusief de verbinding tussen wallbox copper enerzijds en load balancer en internet anderzijds, beide via een eigen CAT-6 kabel.

Vervolgens heb ik op de voorgevel een kastje gemaakt met een verlengd aansluitpunt van de wallbox copper.

Vanaf het aansluitkastjes kan de kabel naar de auto worden gelegd.  Over de kabel komt onderstaande kabelmat te liggen.  In de mat zit een holle ruimte in het midden, in de lengterichting zodat de kabel daar netjes onder kan liggen.

En de bovenstaande wallbox copper kan ik nu dus monteren::

1) OF in de meterkast  wanneer de auto voor staat,

2) OF in de garage  wanneer de auto op ‘eigen grond’ in de garage kan laden.

Harley Davidson livewire (elektrisch) gespot in Amsterdam, vermomd als Zündapp

Gisteren liep ik langs een elektrische Harley Davidson, vemomd als een Zündapp.

Boven zie je een originele (HD) livewire

Zie de foto’s van het vermomde exemplaar hieronder:

De motor is (volgens het kenteken) geregistreerd als volgt:

HD Livewire , vanaf 14-5-2021 geregistreerd in NL.

0.42 kW/kg

60kW.

143 kg rijklaar gewicht

Max snelheid 177 km/hr.

Catalogusprijs Eur 34.000.

 

 

Krachtstroom in mantelbuis naar garage aanleggen 40/32mm

De garage achter het huis ligt ca. 6 meter van het huis.

Tussen garage en huis is 2 jaar geleden een terras met lichtgrijze betontegels aangelegd.

Om de elektrische auto te kunnen laden wil ik graag een krachtstroomaansluiting in de garage hebben, en een verbinding tussen de laadbox in de garage en de load balancer in de meterkast.

De meterkast zit aan de voorkant van het huis, de afstand tussen meterkast en de hoek van de garage waar de kabels naar binnen gaan is ongeveer 15 meter.

Ik heb dit klusje lang uitgesteld, maar nu de wagen bijna wordt geleverd moet het toch een keer gebeuren.  Gelukkig heb ik alle spullen al liggen, en ook de benodigde manmtel-beschermingsbuis met een buitendiameter van 40mm en een binnendiameter van 32 mm ligt al klaar.  de beschermbuis is aan de binnenkant gewoon helemaal glad, en aan de buitenkant gegroefd.

Eerst ben ik onder in de kruipruimte gaan zoeken naar de gemakkelijkste manier om een bestaand gat te gebruiken voor de beschermingsbuis.   Helemaal rechts achterin zit al een gat , gecombineerd met de beluchting van de kruipruimte waar 2 CV leidingen en 1 waterleiding doorheen lopen en nog heel wat ruimte over is aan de rechterkant:

Buiten heb ik op de juiste plek de tegels verwijderd:

De leidingen vrij gemaakt:

En heb ik de bestaande leidingen een beetje meer bij elkaar geknepen zodat de beschermingsbuis er naast ruim door het bestaande gat naar binnen kan worden gestoken:

Vervolgens heb ik aan de zijkant van de tuin alle eerste tegels eruit gehaald en een smalle sleuf gegraven naar de garage.

Binnen in de garage heb ik zover mogelijk in de hoek met een 42 mm holle betonboor  schuin naar beneden een gat geboord en de beschermbuis naar binnen gevoerd:

Daarna al het zand terug geveegd in de sleuf, aangestampt met de kopzijde van een een eiken 5″/ 3″ balk en opnieuw de tegels teruggelegd.  Dat ging eigenlijk heel gemakkelijk met een vuistje en een rubberkop erop voorzichtig aanslaan zodat er geen beweging meer in de tegel zit.

Onder in de kruipruimte heb ik vervolgens de beschermbuis naar voren gehaald:

De beschermbuis is ingevoerd in de voet van de meterkast.  Gelukkig was er nog een invoer vrij:

Onderin de meterkast ziet het er dan zo uit:

Daarna heb ik met de nylon trekdraad mijn 20 meter lange stalen trekveer ingetrokken en nu wacht ik nog op de levering van de 5x6mm2 kabel die ik samen met de twee benodigde CAT-5 kabels in de beschermbuis ga trekken:

Rijksmuseum Amsterdam, 8 oktober 2022

E3D toolchanger 4xHemera direct drive eerste 4-kleuren PLA benchy & 3d world

De boeg van de benchy , het witte rechter deel aan de onderkant zakt een beetje in.

De oplossing was om het hotbed op 10 graden lager in te stellen, en niet meer op 70 graden te starten met het bed.

Dus: Starten met 60 graden en na de eerste laag gelijk naar 50 graden.

Daarnaast heb ik de Benchy 180 graden omgedraaid zodat de koele lucht aan de linkerkant de boeg beter koelt.

Nu is hij qua kleurwisselingen helemaal mooi geworden.

Geprint met 0,2 mm laaghoogte en een maximale printsnelheid van 120 mm/s.

Nog niet perfect maar daar komen we nog wel!

 

E3D toolchanger: Afstellen van de tool pickups met reprap global variables en macro’s

Nadat ik de homing schakelaars voor X en Y op de E3D toolchanger had geïnstalleerd, had ik eindelijk een fatsoenlijk startpunt om de pickup en parking van het gereedschap af te stellen.

Oorspronkelijk gebruikte ik sensorloze homing, maar dit veroorzaakte wisselende offset-waarden van de X- en Y-posities van de machine. Het gereedschap kon dus niet consequent worden opgepakt of thuisgebracht na een reset.

Nu werkt alles prima en veranderen de X-Y waarden niet meer na een reset.

Wat ik dis was om eerst wat macro’s te maken voor een eenmalige instelling van de X en Y positie van de 4 gereedschappen voor de positionering van de gereedschapskop.  Als je dit niet doet, moet je elke keer dat je de waarde van X wilt veranderen, alle X waarden handmatig veranderen in 8 macro’s.

Dit is gedaan met een aantal globale variabelen.  Nadat deze in een macro zijn gedefinieerd, moeten ze worden aangeroepen voordat ze worden gebruikt.  In Config.g heb ik een verwijzing gemaakt om de macro van de globals.g macro aan te roepen, zodat deze telkens wordt uitgevoerd als je de Duet opstart.

In config.g heb ik na de Tool definities de M98 code toegevoegd om de globale definitie van de gebruikte variabelen te starten:

M98 P”0:/sys/globals.g” ; Maak globale variabelen aan in deze globals.g macro

Dit macrobestand ziet er in mijn geval als volgt uit en wees u ervan bewust dat de werkelijke variabelen per machine zullen verschillen, maar dit kan u een uitgangspunt geven:

global T0_X_dock=-12.3 ; X-Parkeerpositie van gereedschap 0
global T0_Y_dock=225.2 ; Y-Parkeerpositie van gereedschap 0
global T1_X_dock=80 ; X-Parkeerpositie van gereedschap 1
global T1_Y_dock=225.9 ; Y-Parkeerpositie van gereedschap 1
global T2_X_dock=212 ; X-Parkeerpositie van gereedschap 2
global T2_Y_dock=226 ; Y-Parkeerpositie van gereedschap 2
global T3_X_dock=304.7 ; X-Parkeerpositie van gereedschap 3
global T3_Y_dock=225,4 ; Y-Parkeerpositie van gereedschap 3

De bestanden tfree 1-3 en tpre 1-3 zien er dan zo uit voor T0, en je kunt de anderen maken door gewoon T1 , T2 of T3 in te vullen waar nu T0 staat:

; tfree0.g
; aangeroepen wanneer gereedschap 0 is bevrijd
G91
G1 Z4 F1000
G90
;Purge nozzle
;M98 P”purge.g”
;Move In
G53 G1 X{global.T0_X_dock} Y150 F50000
G53 G1 X{global.T0_X_dock} Y200 F50000
G53 G1 X{global.T0_X_dock} Y220 F50000
G53 G1 X{global.T0_X_dock} Y{global.T0_Y_dock} F1000
G53 G1 Y{global.T0_Y_dock} F1000
;Koppeling openen
M98 P”Coupler – Unlock.g”
;ventilator uit
M106 S0
;Move Out
G53 G1 {global.T0_X_dock} Y175 F50000

;tpre0.g
;opgeroepen voordat gereedschap 0 is geselecteerd
;Koppeling ontgrendelen
M98 P”Coupler – Unlock.g”
;Verplaatsen naar locatie
G1 X{global.T0_X_dock} Y200 F50000 ; was X-10.5
;Naar binnen
G1 X{global.T0_X_dock} Y220 F50000
;Verzamelen
G1 X{global.T0_X_dock} Y229.2 F1000 ;was f2500
G1 Y{global.T0_Y_dock} F1000
;Koppeling sluiten
M98 P”Coupler – Lock.g”
WAARSCHUWING! WAARSCHUWING! WAARSCHUWING! WAARSCHUWING! WAARSCHUWING! WAARSCHUWING! WAARSCHUWING! WAARSCHUWING! WAARSCHUWING! WAARSCHUWING! WAARSCHUWING! WAARSCHUWING!
Als u niet-standaardlengte hotends gebruikt, moet u ervoor zorgen dat het bed voldoende is verlaagd VOORDAT u het gereedschap loskoppelt!
G91
G1 Z10 F1000
G90
;Verplaatsen
G1 X{global.T0_X_dock} Y150 F10000; was 4000

En ik heb wat macro’s gemaakt om te controleren waar de gereedschapskop staat, recht voor de gereedschappen T0-T3:

; fit_T0.g
;aangeroepen om het gereedschap vlak voor het dock te plaatsen
G91
G1 Z4 F1000
G1 Y-10 F2000
G90
G53 G1 X150 Y100 F20000
;Naar binnen
G53 G1 X{global.T0_X_dock} Y150 F10000
G53 G1 X{global.T0_X_dock} Y200 F10000
G53 G1 X{global.T0_X_dock} Y220 F10000

Als u wilt controleren of u de juiste wijzigingen in globals.g hebt aangebracht, moet u weten dat de nieuwe waarden in de variabelenmacro globals.g pas worden gelezen als u opnieuw opstart.  [Als u de waarden op een andere manier wilt herdefiniëren zonder opnieuw op te starten, hebt u een ander type aanroepfunctie nodig].

Fysieke X- en Y- homing schakelaars op mijn E3D toolchanger

Mijn E3D toolchanger bleek steeds wat af te wijken van de exacte X-Y locaties elke keer dat ik een homing van de machine uitvoerde,.

Dit werd duidelijk nadat ik probeerde de exacte posities van de pickup van het gereedschap af te stellen, nadat ik had gehomed.

Elke keer als ik de pick-up posities opnieuw afstelde, werkte hij goed en de volgende dag was hij net weer een beetje anders. Dan stemde ik hem opnieuw af, en na een dag zat hij er weer naast.  Niet veel, maar slechts 0,1 mm of iets meer.  Maar het gaf wel problemen met het wisselen van de Tools.

Dus- na wat lezen vond ik dat anderen dit probleem ook hadden en kwam met een oplossing: Gewoon een paar goede X- en Y-homeschakelaars plaatsen!

Ik vond zelfs de te printen 3d-onderdelen voor de montage van deze schakelaars. Bedankt hiervoor, mensen!

De schakelaars zijn van hetzelfde type als voor de Z-schakelaar.

X-axis end switch

Y-axis end switch

Ik heb de mounts in PETG carbon geprint op mijn Prusa mini en beide schakelaars op de E3D toolchanger gemonteerd.

Hierna heb ik config. g en de homing files aangepast, zie hiervoor de rest van mijn post:

CONFIG.G CHANGES

; Endstops
M574 X1 S1 P”xstop” ; X min active high endstop switch
M574 Y1 S1 P”ystop” ; Y min active high endstop switch
M574 C0 ; no C endstop
M574 Z0 P”nil” ; no Z endstop switch, free up Z endstop input as Z endstop switch. (I changed  this part for correct working with RRF3.3+)

NEW HOMING FILES:

; homex.g
; called to home the x axis

M98 P”homey.g” ; Home Y always before homing X

G91 ; use relative positioning

G1 H2 Z3 F5000 ; lift Z 3mm
G1 H1 X-400 F15000 ; move left 400mm, stopping at the endstop
G1 X5 F15000 ; move away from end
G1 H1 X-400 F2000 ; move left 400mm, stopping at the endstop
G1 X2 F2000 ; move away from end
G1 H2 Z-3 F1200 ; lower Z

G90 ; back to absolute positioning

; homeall.g
; called to home all axes;

M98 P”homec.g” ; Home C (ToolHead)

M98 P”homex.g” ; Home X

M98 P”homez.g” ; Home Z

G1 X150 Y-49 Z20 F15000 ; Park

; homey.g
; called to home the Y axis

G91 ; use relative positioning

G1 H2 Z3 F5000 ; lift Z 3mm BED DOWN
G1 H1 Y-400 F15000 ; move to the front 400mm, stopping at the endstop
G1 Y5 F15000 ; move away from end
G1 H1 Y-400 F2000 ; move to the front 400mm, stopping at the endstop
G1 Y2 F2000 ; move away from end
G1 H2 Z-3 F1200 ; move Z BED UP

G90 ; back to absolute positioning

Z homing did not change and remains as is:

; homez.g
; called to home the Z axis
M98 P”Coupler – Unlock.g” ; Open Coupler
G91 ; Relative mode
G1 H2 Z5 F5000 ; Lower the bed
G90 ; back to absolute positioning
G1 X150 Y100 F50000 ; Position the endstop above the bed centre
M558 F1000 ; speed to 1000
G30 ; probe x 1
M558 F300 ; speed to 300
G30 ; probe x 1

Stroomverbruik thuis managen met AR12DX meetmodulen / lastafschakelaars / prioriteitsschakelaars in de groepenkast

Na mijn installatie van twee 400 Volt krachtgroepen waarvan één voor laden van de elektrische auto en één voor de instant doorstroomboiler (om te douchen zonder gas) kwam ik in de knel met het stroomverbruik op een standaard 3×25 Ampère huisaansluiting.

Voor het laden van de auto was een gemakkelijke oplossing: Een load-balancer in de meterkast installeren of ernaast met een koppeling naar de slimme stroom meter van de netbeheerder  (een en ander afhankelijk van het gekozen merk laad-doos/paal) .  Vervolgens communiceert de load-balancer met de laadpaal hoeveel stroom er beschikbaar is voor laden van de auto.  Altijd goed zo.

Voor de krachtgroep van de doorstroomboiler was het moeilijker. Dit apparaat gebruikt 11 kW over 3 fasen verdeeld. Omdat we ook op 2 fasen koken en een warmtepomp gaan bestellen, wordt de belasting per fase mogelijk meer dan de geleverde 25 Ampère ofwel 5750 Watt.  Maal drie is dan 17250 Watt.

Je kan natuurlijk allerlei dingen afspreken met de medebewoners zoals niet douchen wanneer je kookt of wanneer de warmtepomp aan gaat.

Maar om er zeker van te zijn dat je verbruik niet opeens te hoog is kun je ook een technische oplossing maken die in je bestaande meterkast past.  Misschien passen de benodigde schakelmodules zelf wel in je bestaande groepenkast.   Bij mij paste het toevallig allemaal wel, omdat ik net een nieuwe groepenkast heb geplaatst voor de 400V krachtgroep om de elektrische auto te laden,.

De benodigde modules die je in de meterkast kan monteren zijn meetmodules die, wanneer je meer dan een instelbare waarde stroomverbruik van een bepaalde groep hebt, een schakelcontact kunnen bekrachtigen.  Via dat contact kun je dan een relais sturen dat ik in mijn geval tussen de voedingsaansluiting van de doorstroomboiler krachtgroep heb geplaatst.

Dat relais dat in de boileraansluiting is opgenomen, ie van het type Normal Connect, dus in de niet-actieve stand staat de doorstroomboiler gewoon onder spanning.

Als er van ten minste één  meetmodule een contact activeert, wordt het relais in de boileraansluiting geactiveerd en schakelt deze de doorstroomboiler UIT.

Technische_fiche_AR12DX

Ik heb in de 3 groepen L1, L2 en L3 ieder 1 stuks AR12DX schakel/meetmodule opgenomen en daar heb ik achtereenvolgens de volgende veelgebruikende ‘met prio’-groepen  aangesloten:

  1. Vaatwasser met elektrische keukenkraan (1-fase doorstroomboiler);
  2. Woonkamer, eerste verdieping, wasmachine en warmtepompdroger;
  3. Tweede kookgroep (onze 2-fase kookplaat kan ook op 1 fase werken).

Deze 3 groepen blijven altijd gewoon (dat heet in dit geval ‘met prio’) aan, ze bepalen alleen dat de douche-doorstroomboiler niet kan werken als er een bepaald vermogen op één van deze 3 groepen wordt overschreden.

De meet/schakelmodules zijn nl. instelbaar op afvalhysteresis (op 0 zetten voor deze situatie met gewoon contactrelais) en stroom.  De stroom waarop het contact wordt geactiveerd is instelbaar.  Dat is vooral bij groep 2) fijn, want bij gewoon TV kijken of verlichting aan wil je nog niet dat de schakelaar om gaat.

Ik heb de stroom van de tweede meet/schakelmodule op 5 Ampère gezet, van nummer 1 en 2 staat de stroominstelling op 1,5 Ampère.

Ik ben nog op zoek naar een 3-fase NC SSR, 400V 40A.  Als ik die heb vervang ik het relais.  Dat relais werkt erg goed maar het is ook erg luid.  De meterkast zit in de gangkast tegen de keuken.  De groepenkast zit op een houten plaat op het gipsen muurtje aan de andere kant van van de keuken en je hoort het relais heel goed schakelen.

Het schema van de 3x AR12DX meet/schakelmodules zoals ik het heb uitgevoerd: (nog in klad maar wel OK)

Tot nu werkt alles prima, de eerste week gebruik ook alles OK!

Ik heb wel de kookgroep ongebouwd naar een 2-fase aansluiting met een gewone 3-fase krachtsroom automaat.  Dan heb je voor beide aan te sluiten fases maar 1 maal een nul nodig.  Dat is ook met een Perilex stekker aan te sluiten.  Als je 2x 230 doet kan dat ook, beide 16 Ampère maar dan werkt dat niet samen met 2 maal een aardlekschakelaar, één per fase. Tenzij je dezelfde fase aansluit zoals kennelijk veel voorkomt.

Mijn kookplaat kan ook gewoon op 2 fases met aparte aardlek maar dan zonder Perilex stekker omdat je van beide groepen (en dus verschillende fases) ook de nul apart moet aansluiten.

Bij krachtstroom of 2x 230Volt van dezelfde fase moet je beide nul-aansluitingen juist doorverbinden.

In het plaatje hieronder is de linkse blauwe krachtstroom groep voor 2 groepen koken in gebruik.  Je kan de kabel 5-polig houden en in de Perilex wancontactdoos alles netjes afwerken op 3 fasen, nul en aarde.

Maar je kan ook 2 fasen, nul en aarde aansluiten mits je dat op de juiste te gebruiken punten aansluit, waar ook het kookapparaat de aansluitingen heeft zitten.

Dat zal meestal L1 en L2 zijn in de Perilex stekker van de kookplaat.  Handig is het dan om in het stopcontact  (Perilex wandcontactdoos) als je met twee ‘hete’ draden de 2 groepen aansluit, deze op L1 en L2 aan te sluiten.

En zó is de groepenkast uiteindelijk geworden

Van het gas af – vergelijkingsberekening tussen aardgas en electriciteit per 1-1-2023

De vergelijkingsberekening tussen aardgas en elektriciteit per 1-1-2323

Een m3 (kubieke meter) aardgas heeft een nuttige energetische inhoud van 8 kWh (bij een omzettingsrendement van gas naar warmte van 80% bij gebruikmaking van een  reguliere HR CV-ketel.

Een m3 aardgas kostte in augustus 2022 bij Essent met ons variabel contract Eur 2,40.

Het aardgastarief wordt door de regering per 1-1-2023 gemaximeerd op € 1,45 per kuub tot een verbruik van 1.200 kuub per jaar.

Een kWh (kilowattuur) elektriciteit heeft een nuttige energetische inhoud van 1 kWh (bij een reguliere omzettingsrendement van elektriciteit naar warmte van nagenoeg 100%).

Een kilowattuur elektriciteit kostte met ons variabel contract in augustus 2022 Eur 0,50.

Het elektriciteitstarief wordt door de regering per 1-1-2023 gemaximeerd op € 0,40 per KWh en het maximale verbruik wordt verhoogd tot 2.900 kWh per jaar.

Voor de vergelijking: Aardgas levert per m3 de gelijke energetische waarde van 8 kilowattuur elektriciteit. Theoretisch zelfs 10 kWh maar dat haal je in de praktijk niet gemakkelijk, daarom reken ik hier met 8 kWh.

Lees ook dit rapport: Vergelijking-aardgas-met-elektriciteit

In bovenstaand overzicht is duidelijk gemaakt dat de verhouding in energetische waarde tussen aardgas en elektriciteit een factor 10 op 1 is.

Vanwege de energetische omzettingswaarde van aardgas in een HR-ketel met een gemiddelde C.V. huisinstallatie, allebei van goede kwaliteit gaan we voor de vergelijking voor dit artikel uit van een energetische eindverhouding tussen aardgas en elektriciteit van 8 op 1  (1 m3 aardgas = 8 kWh elektriciteit).

De financiële berekening voor de vergelijking in energetische energie bij 1 m3 aardgas is dan vanaf 1-1-2023 bij een normwaarde van 1 m3 aardgasverbruik, exclusief vaste toeslagen:

  • Eur 3,20 kosten elektriciteit voor 8 kWh x Eur 0,4;
  • Eur 1,40 Kosten aardgas voor 1 m3 x Eur 1,40.

Je ziet dus dat aardgas voor verwarming per 1-3-2023 goedkoper is dan elektriciteit, wanneer je tenminste gewoon voor de elektriciteit betaalt en met normale elektrische verwarming werkt zoals keramische kachels enz. Salderen met zonnepanelen verandert de zaak.

Bovenstaande rekensom is natuurlijk erg afhankelijk van de geldende energieprijzen.

Het wordt wel extra gemakkelijk om over te stappen op elektriciteit wanneer je genoeg zonnepanelen hebt, en dat daarbij salderen nog steeds mogelijk is.

Overigens kun je ook qua verbruik nog behoorlijk besparen wanneer je je elektrische energie inzet met een warmtepomp of met airco met warmtepomp.  Daarbij kan het rendement op gebruik van elektriciteit nog met een factor 3 tot 5 verbeteren.

Van het gas af – hoge gasprijzen, gebruik zonnepanelen, warmtepomp en airco, keramische-en LPG kachels

an-het-aardgas-af-hoge-gasprijzen-gebruik-zonnepanelen-keramische-en-lpg-kachels

Vanwege de hoge gasprijzen, het per saldo meer elektriciteit terug leveren dan we verbruiken en vanwege het feit dat we eigenlijk sowieso minder van aardgas afhankelijk willen zijn hebben we naar alternatieven voor het gebruik van aardgas gezocht.

Quote uit overstappen.nl van 9-9-2022: In augustus 2021 was de gemiddelde gasprijs nog 0,95 euro per m3 gas. In 2022 is de gasprijs flink opgelopen. Momenteel betreft de gasprijs gemiddeld 3,94 euro per m3. Dit tarief is inclusief energiebelasting, ODE en 9% BTW.

Twee van de genoemde alternatieven hebben we al ingevuld, namelijk de elektrische doorstroomkraan in de keuken en de elektrische krachtstroom doorstroomboiler om te douchen (en voor de wastafel in de doucheruimte).

Het derde besparingsalternatief is om zo veel als mogelijk te besparen op de verwarmingskosten. Dat staat beschreven in het betreffende artikel.

De motivatie om deze alternatieven voor aardgas te installeren en te gebruiken zijn voor een groot deel gebaseerd op de situatie van de hoge prijzen voor aardgas en -in mindere mate- van elektriciteit., en natuurlijk zijn we ook gedreven door het feit dat we uiteindelijk met z’n allen van aardgas af moeten en renewable of op z’n minst sustainable energie willen gebruiken.

Warmtepomp wel de beste oplossing, maar…

https://www.gasvrij.nu/de-cop-van-een-warmtepomp-uitgelegd/#:~:text=De%20COP%2Dwaarde%20geeft%20aan,4%20kWh%20aan%20warmte%20terug.

In bovenstaand artikel dat we hebben overgenomen van gasvrij.nu kun je lezen dat een warmtepomp in het meest ideale geval een COP waarde van 4 tot 7 kan hebben. Dat betekent dat je een betere energetische waarde (ter vergelijking) ten opzichte van de benodigde erin te stoppen elektrische energie kan bereiken van een factor 4 tot 7.

Ter vergelijking: Aardgas staat op een maximale theoretische energetische waarde van 8x t.o.v. electriciteit en het is dus niet zo gek dat we aardgas zo lang hebben gebruikt. Zeker als je naar de oude tarieven kijkt was aardgas wel tot 10x goedkoper om te verwarmen dan met electriciteit, Nu is die factor 2x goedkoper, LEES HIER.

Met een warmtepomp ben je eigenlijk dus gewoon het beste af wanneer je van aardgas af wilt.  Maar de benodigde ruimte, herrie en kosten van installatie en onderhoud zijn allemaal belemmeringen waarom wij er nog niet voor hebben gekozen. Terwijl we heel goed weten dat we dat uiteindelijk wel moeten doen.

 

De COP factor van een airco warmtepomp

De COP factor is de verhouding tussen de elektrische energie die de airco verbruikt in verhouding tot de warmte die verplaatst wordt. Wanneer een airco bijvoorbeeld 500 Watt verbruikt maar in staat is om 2000 Watt aan warmte te verplaatsten dan is de COP-factor 2000 / 500 = 4. Tegenwoordig is een COP-factor van 4 heel normaal. Hoe hoger de COP-factor is, hoe zuiniger de airco is. Op het moment van schrijven zijn airco’s te koop met een COP-factor van 5,6. Heb je de keus tussen twee modellen en de COP factors zijn 4,3 en 4,8 dan heeft het model met een COP factor van 4,8 een duidelijk voorkeur ook al is dat model stukken duurder. De energie-winst die je tijdens de levensduur van de airco zal behalen zal de extra kosten ruimschoots compenseren.

COP waarde is niet constant

De opgegeven COP-waarde is alleen maar van toepassing bij een bepaald verschil tussen de buiten- en binnentemperatuur. De COP-factor neemt namelijk af als het verschil tussen de binnen en buitentemperatuur stijgt. Heeft een airco een COP-factor van 5 bij een buitentemperatuur van 10° Celsius dan daalt de COP-waarde naar bijvoorbeeld 3,5 als het buiten 0° Celsius is. Ondanks deze lagere prestatie blijft het nog steeds interessant om een airco in te zetten als verwarming.

De situatie

Onze Nefit HR-ketel draait uiteraard op aardgas.

We hebben al ruim 5 jaar 9 zonnepanelen op ons dak liggen en we verbruiken ook op jaarbasis veel minder stroom dan we terug leveren.

We schakelen overal alle apparaten uit, ook alle opladers en TV, stereo en zelfs de internet installatie gaat zover mogelijk ’s nachts uit.  Behalve het internet modem natuurlijk en de internet server.  Ook de C.V. ketel staat uit wanneer we deze niet gebruiken.  Dat scheelt echt veel, want de C.V. ketel verbruikt altijd energie, ook wanneer je deze niet gebruikt.  En als we kunnen douchen met water van een elektrische doorstroomboiler gaat het aardgas  en de C.V. ketel in de zomermaanden helemaal uit.

Het aardgas kostte de afgelopen maand, augustus 2022, met ons variabel contract bij Essent bijna 4 Euro per m3 (kuub, kubieke meter in gasvorm).

Een Kwh elektrisch verbruik kost ca. 1 Euro op dit moment en een teruggeleverde Kwh levert 0,055 Euro op (5,5 Eurocent).

Omdat we altijd veel meer elektriciteit terug leveren dan verbruiken gaan we alle mogelijke moeite doen om alles dat kan elektrisch te doen.  Door te salderen kunnen we dan eindelijk beter gebruik gaan maken van onze 9 zonnepanelen!

 

Uiteindelijk is alles tijdelijk, en is alles mogelijk. En dat we van het aardgas af moeten is onontkoombaar.  Tegen welke kosten weten we nog niet, maar voor je eigen situatie kun je wel alvast de nodige dingen aanpakken. Waarbij je niet nu al het aardgas helemaal de deur uit hoeft te doen.  Alleen al het verbruik sterk verminderen help behoorlijk.  Ook in je eindafrekening.

De ontwikkeling van alternatieven gaat namelijk maar moeizaam en de verkrijgbaarheid van alternatieven is beperkt.

Wat mij betreft dus hoog tijd voor een meer persoonlijke aanpak!  Hoe meer mensen meedoen des te meer druk komt er op de leveranciers- en ontwikkelingsmarkt om met meer- en met nieuwe producten te komen.

Succes met je zoektocht en bookmark ons voor komende updates:

 

Van het gas af – Elektrisch bijverwarmen of toch aan de warmtepomp?

In dit artikel beschrijven we onze oplossing om ons aardgasverbruik in de komende winter ’22-’23 met ten minste 50% te reduceren.

Het oorspronkelijke plan:

  • een deel van het huis niet meer verwarmen;
  • per ruimte waar nodig bijverwarmen met elektrische keramische 500 Watt muurstekker kacheltjes met thermostaat;
  • beneden in de woon/kookruimte primair met een LPG gestookte potkachel de ruimte verwarmen, eventueel aangevuld met 2 stuks keramische kacheltjes, met thermostaat.

LPG gestookte potkachel met katalysator, zuurstofsensor enz.

thermostatisch geregelde elektrische mini bijzetverwarming 500 Watt

Toch nog even nadenken..

Maar als je gaat rekenen met energetische waarden en prijzen van elektriciteit kom je er al snel achter dat zo’n oplossing met elektrische bijverwarming niet erg haalbaar is.

Elektrisch verwarmen is gewoon niet erg economisch omdat het ondanks de hoge energieprijzen nog steeds 2x duurder is om elektrisch te verwarmen ten opzichte van verwarmen met aardgas.  (kort door de bocht: 1 m3 aardgas van Eur 4 per m3  levert evenveel  energetische energie als 8 kWh elektriciteit van Eur 1 per kWh en 4 Euro is de helft van 8 Euro)

De warmtepomp installatie in plaats van de gasgestookte C.V. ketel

Als de energieprijzen zo hoog blijven als in augustus 2022, gaan we dus z.s.m. een volledige elektrische warmtepomp installatie plaatsen met split units.

Dan gaan we gelijk helemaal van de gasgestookte CV HR ketel af. want we hebben al een lage temperatuur C.V.  systeem met vloerverwarming.

En dat is extra handig bij het inzetten van een warmtepomp installatie:

Split-buitenunit (links) en de binnenunit (rechts) met 12.6 kW verwarmingsvermogen voor een volledig elektrisch werkend warmtepompsysteem zonder gasgestookte C.V. ondersteuning.

Het wordt dus geen hybride systeem, waarbij de gasgestookte C.V. ketel blijft zitten en bijspringt wanneer het kouder wordt dan ca. -5 graden.

Dan kom je nooit van het gas af, want heb je gewoon een te kleine warmtepompinstallatie om zonder de C.V. ondersteuning verder te kunnen wanneer het gas er ooit af gaat, of je er gewoon af wilt.

Bij een hybride warmte pomp installatie moet de gasgestookte C.V. ketel bijspringen wanneer het te koud wordt (buiten onder -5 graden) of als je te lang niet gestookt hebt en het daardoor zonder het bijspringen van de gasgestookte C.V. ketel veel te lang duurt voor het een beetje warm wordt.

Tot 6-8 kW zijn er hybride systemen die samenwerken met de bestaande C.V. ketel.  Als je een systeem wilt hebben dat de gasgestookte C.V. ketel kan vervangen moeten we even rekenen welke afgegeven waarde aan warmte we precies nodig hebben.

De bestaande gasgestookte HR C.V. ketel is een Nefit smartline HRC24 CW4.  Die heeft een afgegeven vermogen (max) van 24kW.

Onze warmtepomp moet volgens de kenners ten minste een SCOP waarde hebben van een factor 5.

Dat betekent dat de elektrische energie die je in de warmtepomp installatie stopt voor het transport van energie er voor zorgt dat er binnen 5 maal meer energie aan ( warm C.V.-) water van max. 55 graden Celsius wordt afgegeven.

Dat komt door het werkingsprincipe van de warmtepomp, net als bij condens(was)drogers en airco’s met warmtepomp principe.

Als het buiten kouder wordt dan wordt het rendement van de warmtepomp qua verwarmen wel minder.

Dus voor een warmteafgifte van 24 kW heb je een warmtepomp systeem nodig dat 24kW energetisch kan afgeven aan waterwarmte.   En dat systeem verbruikt daarvoor 24/5 = ongeveer 5 kW aan elektriciteit  bij een SCOP waarde van 5.

Omdat dergelijke warmtepomp systemen gebaseerd zijn op standaard aansluitingen met de 230Volt netvoorziening met 16 Ampère aansluitwaarde, zijn de gangbare warmtepompsystemen meestal iets kleiner dan 24kW.  De door ons geselecteerde waarde van het split systeem is 12,6 kW.  Daarmee blijft het opgenomen elektrisch vermogen ruim binnen de 16 Ampère norm van de aansluitwaarde van de elektrische groepen in onze woning.

Het zou kunnen dat we bij strenge vorst een probleem hebben om het huis echt warm te stoken, dat nemen we op de koop toe.  Als we met de installateur/leverancier praten over het toe te passen warmtepomp systeem zullen we ook nog even laten doorrekenen of het allemaal wel goed gaat met een 12,6 kW systeem. En desnoods kiezen we voor een iets groter systeem.

De split buitenunit komt op het platte dak, ergens tussen de zonnepanelen of op het schuine dak, net onder het dakraam met speciale schuine dak beugels voor ons schuine dak.  Het moet sowieso een stil model worden, dat wordt mogelijk nog lastig want dat zijn dit soort buitenunits eigenlijk nooit.  Er moet dus ook een nachtstand op zitten met gereduceerd pomp- en ventilator gebruik.

Mogelijk plaatsen we gelijk een tussenboiler binnen bij de binnen-unit,  zodat er altijd een voorraadje warm water is.  Als we daarmee kunnen douchen kan de doorstroomboiler uit en gebruiken we de doorstroomboiler alleen als het buiten te koud wordt.

De kosten zijn ca 7500 Euro voor deze installatie en dat hebben we er wel voor over.  Dan krijg je ook nog ca 2500 Euro subsidie achteraf terug.

De isolatie van ons rijtjeshuis is trouwens ook prima, en we zijn al heel tevreden als de warmtepomp zodanig werkt dat de begane grond op 20 graden kan worden verwarmd. De slaapkamers willen we gemiddeld op 15 graden houden.  De 2e verdieping gaat op de antivorst stand..

En over terugverdienen denk ik ook helemaal niet na.

We moeten sowieso van het gas af, en onze C.V. ketel is nu 20 jaar oud, er is al van alles aan vervangen en het werkt allemaal elke keer na de reparatie weer prima.

Maar vervanging komt er wel aan.

En of dat wel zo handig is , gezien de wens om juist van het gas af te komen?

Dan liever maar gelijk goed aanpakken.

Koelen met de C.V. installatie en de warmtepomp kan ook

Overigens wil ik gelijk een warmtepomp systeem dat ’s zomers actief kan koelen.

Bij een volledig elektrisch warmtepomp systeem is dat in principe goed mogelijk.

De radiatoren worden dan koud.

Dat lijkt een hele handige optie, ik ben wel benieuwd hoe mijn thermostaatkranen daar mee om gaan!

Onze verwarmingssituatie

Ons huis heeft nu nog o.a. op de begane grond een met de C.V. direct gestookte vloerverwarming en op alle verdiepingen geïsoleerd glas. De spouwmuren zijn nog zonder isolatie (daar moeten we eigenlijk wat aan doen maar het muuroppervlak is in verhouding tot de ramen zo klein dat het effect van muurisolatie waarschijnlijk niet heel groot is, volgens de kenners…) en we hebben een zolder die niet als slaapkamer wordt gebruikt.

De zolder gaan we dus sowieso niet warm stoken, en dat scheelt alweer een stukje.

En we koken al elektrisch, de oven is ook elektrisch.  De keukenkraan is elektrisch, en het douchewater (en wasbak) wordt via een 11kW doorstroomboiler ook al elektrisch verwarmd.

Warmtepomp of airco-installatie?

Een airco-installatie zou ook nog kunnen  natuurlijk, dat werkt ook met een warmtepomp principe. Op dit moment is het enige airco systeem dat qua rendement aardig OK is, en betaalbaar qua installatie een meervoudig aircosysteem met 1 unit buiten en meerdere units binnen.

Dan moet je wel een installatie hebben met een COP-waarde boven 5 want dan heb je ook wanneer het koud wordt nog een beetje rendement als je er ook mee wilt verwarmen.

Zo’n Multi-airco systeem met 4 binnen-units en 1 buitenunit met een COP-waarde van 5,5 heb ja al vanaf zo’n 5 tot 7 duizend Euro geïnstalleerd in  huis.  Of het allemaal wel mooi is, in elke ruimte zo’n airco aan de muur en buiten een grote unit aan de geven of op het schuine dak denk ik niet, maar den kunnen alle lelijke CV leidingen en radiatoren er tenminste wel uit.  Misschien zijn de gaten in de tussenvloeren dan wel te hergebruiken voor de airco-leidingen… Voordeel van zo’n jaren 80-huis: er zitten geen CV leidingen in de vloeren, alles zit in het zicht.

De prijs voor zo’n airco-installatie lijkt veel geld en dat is ook zo.

Een C.V. installatie is in na-aanleg overigens net zo kostbaar.

Om over het na-aanleggen van warmtepomp systemen in bestaande huizen nog maar niet te spreken, want dat gaat gauw over de 7500 Euro heen.  Maar je kan de radiatoren dan wel lekker allemaal laten zitten en gewoon de vloerverwarming blijven gebruiken. Dat lijkt me uiteindelijk de beste oplossing.

Maar even snel de prijzen en mogelijkheden van volledige lucht-warmte split units warmtepomp C.V.-installaties opvragen,  het lijkt me het beste om gelijk de juiste keuze te maken.

11-9-2022: Wordt vervolgd!

 

 

 

Van het gas af – Douchen met elektrische doorstroomboiler

Als je een goede elektrische boiler hebt kun je overdag in de ca. 8 zonmaanden voldoende elektriciteit van de zonnepanelen gebruiken om een elektrische boiler warm te krijgen, waarmee je vervolgens kan douchen.

Daarnaast (of in plaats van) kun je een 3-fase doorstroomboiler gebruiken wanneer de voorraadboiler leeg is.  Dan vul je in ieder geval de goedkope opslag van water vanaf de energie van de zonnepanelen aan met elektrische energie voor de doorstroomboiler, dat is nog altijd beter dan met de CV combiketel op aardgas.

Uitsluitend een doorstroomboiler is natuurlijk ook mogelijk.  Dat is qua ruimte wel de meest eenvoudige oplossing.

En zolang saldering nog mogelijk blijft is dit voorlopig waarschijnlijk ook de meest economische oplossing.

Voor nu gaan we uit van die situatie: Alleen een 3-fase doorstroomboiler.

Bijgaande boiler heb ik 15-9-2022 geïnstalleerd op zolder, om te douchen en voorwarm water van de wasbak in de doucheruimte.  De warmwater voorziening van de gasgestookte HR C.V. ketel heb ik afgesloten, en op de C.V. ketel heb ik de warmwaterknop op de 0-stand gedraaid.

We zien later wel of we ook nog een extra voorraadboiler zien zitten.

Om de doorstroomboiler op zolder naast de C.V. ketel te installeren is een 3 fase 5-polige aansluiting met 5×2.5 mm2 gemaakt.

Dat mag dus niet in een al bestaande buis, omdat er een NEN1010 norm is over de maximale hoeveelheid draden in 5/8 inch buis of flexbuis. Daarnaast is het niet toegestaan om verschillende 230V groepen of een combinatie van 230 Volt groep met 400V in één buis te installeren.

Dus is er een nieuwe installatie gedaan van een 3/4 inch buis vanuit de groepenkastaansluiting naar zolder tot naast de instant doorstroom boiler.

Daarvoor heb ik in beide verdiepingsvloeren gaten geboord naast de bestaande gaten van de C.V. leidingen. Deze C.V leidingen volgen aan de voorkant van het huis precies boven de meterkast hetzelfde pad als de nieuwe aanleg van de krachtstroom aansluiting.

Op zolder is een CEE form 16A krachtstroom wand-chassisdeel geplaatst en aan de doorstroom boiler heb ik een bijpassende stekker gemonteerd.

Omdat in de meterkast al een extra 400V krachtstroomgroep is geïnstalleerd hoefde ik na aanleg van de buis alleen nog maar de draden aan te sluiten op de voorbereide groep.

De Stiebel Eltron DCE 11/13 3-fase doorstroomboiler werkt prima! Ik heb de doorstroomboiler ingesteld op 11kW.

technische-gegevens Stiebel Eltron DCE 11/13

Na de installatie heb ik in de meterkast de bestaande groepenverdeling verwijderd en alles opnieuw verdeeld.  Daarbij heb ik 3 groepen met lastgebruik verdeeld over de 3 fases en elk van deze groepen via een lastschakelaar laten lopen.  Elke grootverbruiker schakelt daarmee boven een ingestelde verbruiksdrempel via een 4-fase NC relais de doorstroomboiler af. 

Doel is om de 3×25 Ampère aansluitwaarde van de woning niet te overschrijden.  Wanneer ja dat doet blaas je één of meerdere hoofdzekeringen op en moet je netbeheerder deze komen herstellen.  Meestal keuren ze dan gelijk je installatie (af).  en heb je er daarna alsnog veel werk aan.

Door mijn aanpassing kun je alleen douchen wanneer de volgende apparaten niet in gebruik zijn:   1) Vaatwasser, 2) wasmachine/droger, 3) 2e kookgroep.  Dat gaat bij ons prima.  Door deze schakeling blijf ik nu altijd binnen de 25Ampère laststroom per fase.

Het lijkt wat ingewikkeld maar als het er eenmaal in zit heb je er geen omkijken meer naar en het went snel. Bovendien wordt de douche niet de hele dag gebruikt! -)

De douchekraan wordt ongeveer even snel warm als met de CV ketel. En qua doorstroming is er helemaal geen probleem.  Warmte is meer dan voldoende en ik heb zelfs de knop van de doorstroomboiler teruggedraaid naar 50 graden.  Dat is in de praktijk ruim voldoende.

De doorstroomboiler is overigens maar een heel klein apparaat.  Het is eigenlijk gemaakt om in een keukenkastje onder de gootsteen te passen, en dan kan de afvalbak er nog gewoon in blijven. Omdat er geen boiler in zit, alleen maar wat elektronica en een verwarmingselement valt de afmeting erg mee.

 

 

Van het gas af – Instant verwarmde elektrische keukenkraan

We zijn in ieder geval in de keuken van het gas af.

Koken doen we al een tijd elektrisch en nu is de keukenkraan ook elektrisch!

En dat scheelt weer wat gasverbruik, omdat elke keer dat je warm water helemaal van zolder naar beneden moet laten opwarmen de ketel al die tijd vol staat te branden.

Dat kostte me afgelopen maand 4 m3 gas, buiten het douchen.

Maal ca.2 Euro per m3 bij Essent in de maand augustus 2022 dus met de huidige prijzen en ons variabele tarief.

Boven zie je de levering van de nieuwe elektrische kraan met doorstroomelement van 3500 Watt, 230 Volt.

https://nl.aliexpress.com/item/1005003640074943.html?spm=a2g0o.order_list.0.0.2fd379d2jApzll&gatewayAdapt=glo2nld

De foto is gemaakt nadat ik het geheel heb gedemonteerd vanwege de beschadigde buitenkant van de kraan (deukje!)

De kraan kan gelukkig helemaal uit elkaar, en ik heb de deukjes netjes kunnen terugdrukken met een lange staaf massief ijzer in de bankschroef.  De staaf is aan de bovenkant rond geslepen zodat je door steeds een klein stukje naar buiten weg te drukken alle beschadiging weg krijgt.  Gewoon spotrepair dus.

Daarna alles weer in elkaar gezet, de oude kraan verwijderd en de nieuwe erin.

De warmwater aansluiting heb ik afgedopt want de nieuwe kraan wordt alleen aangesloten aan de koudwater aansluiting en aan een vrije 230 Volt aansluiting.

De kraan heeft 3 functies:

  1. een koud water regeling van het midden naar helemaal links waarmee je de hoeveelheid koud water kan regelen.
  2. in de middenstand is de kraan dicht
  3. en naar rechts draaiend komt er van weinig to maximaal warm water uit.

Vanwege de constructie is mengwater niet mogelijk bij deze kraan.

Maar let op: Je regelt de temperatuur van het water als volgt: Hoe meer warm water, hoe minder warm.

En als je minder warm water gebruikt komt er dus gewoon minder water uit dat steeds heter wordt.

Dat is wel erg wennen.

Maar het went heel snel.

Als je iets warm af wil spoelen met een sponsje of doekje ben je geneigd om het water warm te willen hebben en draai je de kraan eerst iets te ver open, daarna iets dicht tot het te warm wordt, dan weer verder open enzovoorts.

Na een paar dagen heb ik gemerkt dat ik al aardig de temperatuur kan inschatten en steeds meer leer hoe je deze kraan moet gebruiken.

Maar in de praktijk kan deze elektrische doorstroomkraan gewoon niet meer verwarmen dan in de voluit stand,  en dat is net 40-43  graden.

Pas wanneer je de doorstroming verminderd wordt het water warmer.  Wel tot over de 60 graden, en dan heb je nog een redelijk straaltje over.  Maar voor de meeste toepassingen in de keuken is 40 graden meer dan genoeg.

Er bestaan ook elektrische doorstroom warmwaterkranen met zowel een warme bediening als een koude bediening. Daarmee kun  je dus ouderwets mengwater gebruiken en de temperatuur regelen.  Maar mengen met de koud water stroom bij zo’n kraan met 2 hevels (één voor warm water en één voor koud water) gaat niet lukken.

Daarvoor is de verwarming van 3500Watt niet voldoende zwaar om het water op te warmen.  En meer dan 3500 Watt past niet in de kraan maar past ook niet op het verbruik van de elektrische installatie.  3600 Watt is het maximum dat een 16 Ampère groep in een woning kan leveren.

We gaan het voorlopig zo proberen want ik wil geen boiler onder het aanrecht hebben die altijd water op voorraad verwarmt, ook wanneer we het niet nodig hebben.  Dat bespaart ook niet echt.

Nu hebben we ten minste alleen maar kort elektrisch verbruik wanneer we warm water tappen in de keuken.  want het water wordt nu heel snel warm, vergeleken met de oude situatie een hele verbetering.

In snelheid en gemak, maar hopelijk ook in gasverbruik.

Het resultaat!

Maar..

Uiteindelijk beviel de kraan toch niet echt, omdat de bediening te ingewikkeld is voor nieuwe gebruikers wordt er behoorlijk aan de kraan getrokken en daar kan deze niet echt tegen.

Dus na 2 weken maar een nieuwe mengkraan gemonteerd op de oude aansluitingen van warm en koud water.

Dan maak ik gelijk gebruik voor het warme water van de doorstroomboiler van de douche, dan moet je wel even wachten op warm water maar het is nog steeds zonder gasgebruik!

EV accu typen vergeleken

EV-batterijtypes en hun basisverschillen:

NMC532, NMC811, NCA, solid state en LFP

Door de groeiende vraag naar grondstoffen, die nodig zijn voor de productie van batterijen met een grote capaciteit voor elektrische voertuigen, stijgen de prijzen en wordt de ontwikkeling van batterijen waarvoor minder dure materialen nodig zijn, steeds belangrijker.

Lithium-Ion is bijna altijd de basiscomponent voor bestaande EV-batterijen.

De manier waarop de stroom naar het Lithium wordt gebracht is via een kathode en een anode.  De gebruikte materialen voor deze kathode en anode verschillen, en dit heeft grote gevolgen voor de stabiliteit, de levensduur, de kw/gram dus de maximale stroom en het verslechteringsgedrag van de batterijen.

LFP batterijen

Onlangs is een nieuw type accu ontwikkeld, waarbij voor de anode en kathode een ander type materialen wordt gebruikt dan bij NMC accu’s:

 

The difference between NMC and LFP anodes

LFP kan minstens 2000 keer tot 100% worden opgeladen.

Maar LFP-batterijen (en – tussen haakjes – ook NMC532) zijn minder compact dan NMC811- en NCA-batterijen. Dat komt omdat LFP-batterijen minder elektrische capaciteit per volumetrische eenheid hebben dan NMC811- en NCA-batterijen.

Het gevolg is dat kleinere tot middelgrote auto’s niet meer dan een LFP-batterijpakket van 50-55 kWh zullen kunnen vervoeren.

Verwacht wordt dat LFP-batterijen op lange termijn goedkoper zullen worden dan batterijen van het NMC-type omdat ijzerfosfaat kan worden gemaakt zonder beperkingen inzake beschikbaarheid van materiaal, terwijl de vereiste grondstoffen voor NMC- en NCA-batterijen mettertijd nog duurder zullen worden.

 

NMC- (of NCM-) en NCA-batterijen

De hoofdstroom van Li-ion-batterijen bestaat momenteel echter uit NMC (en Tesla’s long range NCA en standard range LFP), met verschillende soorten batterij-samenstellingen.  Tesla’s NCA ontwikkeling van accu’s voor de Tesla3 long range en nieuwe Tesla model S types heeft een eigen soort samenstelling voor de accu’s zoals ook blijkt uit het onderstaande grondstoffen overzicht:

Raw materials per type of battery: Lithium, Nickel, Copper, Manganese, Aluminium

 

NMC811 batterijen

De nieuwste ontwikkeling binnen het NMC type accu’s is de NMC811, die meer vermogen heeft in een kleiner pack, maar een zeer strikte productiemethode en een zeer strak Battery Managment System vereist.

NMC811 accu’s gaan snel achteruit als ze herhaaldelijk worden opgeladen met hun maximale capaciteit en het wordt aanbevolen om de accu zo weinig mogelijk op te laden boven 80% van de maximale capaciteit.

En- het wordt aanbevolen om alleen tot de maximale capaciteit op te laden wanneer de lading onmiddellijk na het opladen zal worden gebruikt.  Bijvoorbeeld wanneer een grote reis wordt gemaakt, voordat u vertrekt en tussendoor.

NMC811 heeft een maximale volledige laadcyclus van 200-300x, indien uitgevoerd volgens de aanbevelingen.  Dit is misschien het grootste probleem met dit soort batterijen, maar in de praktijk kan dit een levensduur van meer dan 8 jaar betekenen.  Op voorwaarde dat u alleen voor de vakantiereizen tot 100% oplaadt.

NMC811 maakt het mogelijk om een kleine EV(SUV) zoals de MG ZS EV (2022 versie) long range uit te rusten met een 74 kWh NMC811 batterijpakket.

Capacity versus weight (and also related to volume) of NMC type of EV batteries

 

Solid-state batterijen

Solid-state batterijen komen ook beschikbaar, en deze batterijen leveren de beste prestaties in een vergelijkbaar – of mogelijk zelfs kleiner bouwvolume dan NMC811-batterijen.

Maar Solid-state batterijen zijn nog steeds vrij duur en niet algemeen verkrijgbaar.

Toyota is een van de belangrijkste ontwikkelaars van solid-state batterijen en zal zijn hybride auto’s met deze batterijen uitrusten.

Het zal interessant zijn om uit te vinden of solid-state batterijen het op lange termijn beter zullen doen dan de oudere/bestaande typen batterijen, aangezien hybride auto’s maximaal gebruik maken van de laad/oplaadcycli.

 

Samenvatting

Voor kleine EV’s zal LFP de beste keuze zijn. (minder actieradius vereist, meestal stadsauto’s. USP van LFP: 2000+ keer mogelijk om op te laden @ 100% volledige capaciteit.

Voor het midden- en hogere segment zijn NMC811 en/of NCA het meest geschikt. USP van NMC811: meer capaciteit maakt een grotere actieradius mogelijk, maar vereist een zeer goed BMS. Door minder gebruik van dure materialen in NMC811 (minder kobalt en mangaan) ligt de prijs van NMC811 binnen het betaalbare bereik.

Voor EV’s in het hoogste segment is solid-state de beste optie. Solid state is duurder, kleiner, meer capaciteit, recycling tot vol vermogen is geen probleem.

Voor hybride EV’s kan zowel LFP als solid state worden toegepast, maar niet NMC811.

HD FLSTCI geluidsproductie beperken

De nieuwe 2e handse originele uitlaatdempers, met katalysator en E-keur

Als je de huidige regels voor geluid en geluidsoverlast van motorfietsen bekijkt, lijkt het wel een oerwoud waar je niet doorheen komt.

Wat wel duidelijk is: Als je niet aan de geluidsnorm voldoet bestaat de kans dat je motorfiets in een Wacht Op Keuren (WOK) status komt en mag je er niet meer mee op de openbare weg.

Als je dat overkomt moet je na herstel je motorfiets bij de RDW ter keuring aanbieden.

Dan moet de motorfiets zijn voorzien van uitlaten waarmee de motorfiets voldoet aan de voor het type en bouwjaar geldende geluidsnorm.

Nadat de RDW heeft vastgesteld dat je motor weer OK is, wordt de WOK status vrijgegeven en kun je weer rijden.

 

Geluid van motoren dynamisch meten bij de RDW
De RDW zorgt regulier ook voor type-keuringen inclusief dynamische meting van het geluidsniveau.

Op de testbaan van de RDW in Lelystad rijden ze dan met een fabrieksmotor een vaste route tussen twee microfoons.

Bij deze meting mogen motoren volgens de nieuwe norm (vanaf 2016)  binnen de Europese wetgeving niet meer dan 80 dB(A) produceren.

Het RDW hanteert die norm in Nederland al veel langer voor de dynamische meetmethode, in ieder geval al vanaf het jaar 2002.

Deze dynamische meting wordt voor zo’n type-goedkeuring in het kentekenregister overgenomen.

Vervolgens moet na deze typekeuring elke motor van dit type voldoen aan de in het kentekenregister opgenomen waarde,

Die waarde kan dus ook nog eens lager zijn dan de maximale norm van 80dB(A).

 

dB(A) eenheid
Geluid drukt men uit in decibels. Met dB(A) worden deze gecorrigeerd naar de gevoeligheid van het menselijk oor.

Wij horen lage tonen amper en zijn juist gevoeliger voor hoge tonen.

Voor de regelgeving en handhaving van het geluid van motoren hanteren we dB(A).

Het scheelt nogal wat of je een geluidsmeting dynamisch uitvoert zoals het RDW of statisch zoals bijvoorbeeld bij een wegcontrole.

Bij een wegcontrole staat de microfoon op een afstand van 50cm van de uitlaat en bij een dynamische meter geldt een afstand van 10 meter.

En er zijn nog wel andere verschillen aan te geven want een motor die langsrijdt veroorzaakt bijvoorbeeld een geluid dat bewerkt moet worden tot een gemiddelde meetwaarde.

Er zijn in de praktijd door o.a. politiediensten statische meetwaarden ontwikkeld bij proeven met typegoedgekeurde motorfietsen en die leveren bruikbare statische meetnormen op.

Met die statische meetnormen kan een handhaver in de praktijk snel bepalen of een motorfiets qua geluid binnen de norm blijft.

 

Hoeveel geluid mag mijn motorfiets eigenlijk maken?

Bij de berekening hiervan wordt rekening gehouden met de cilinderinhoud, bouw en bouwjaar van jouw motorfiets.

Dit is terug te vinden op het Voertuig Identificatie Nummer (VIN-plaatje) op je motor en op je kentekenbewijs.

Geef op de kentekencheckl.nl-site je kenteken in en kijk onder het kopje Milieuprestaties.

Zie hieronder de gegevens van mijn HD Heritage uit 2004 (1499cc):

Hier staat aangegeven wat het maximaal toegestane geluidsniveau in dB(A) is wat je motor mag maken, met daarbij aangegeven bij welk toerental dit geldt.

Voor mijn motor is dat dus 91dB(A) bij stationair toerental.  .

 

Geluid en oudere motoren
Voor oudere motoren is vaak geen maximale geluidsnorm in dB(A) bekend bij het RDW.

Dat wil niet zeggen dat je onbeperkt lawaai mag maken.

Hiervoor heeft de RDW in het verleden richtlijnen opgesteld.

De cilinderinhoud van de motorfiets is bij die richtlijnen leidend.

Zo mag een motorfiets tot 80 cc maximaal 91 dB(A) geluid produceren terwijl een motor met meer dan 1000 cc tot wel 106 dB(A) mag produceren.

Deze geluidswaardes zijn natuurlijk altijd afhankelijk van een toerental.

Hiervoor geldt bijvoorbeeld dat het geluid van motoren met een bouwjaar voor 1960 bij een toerental van 2000 (4-takt) of 2250 toeren (2-takt) gemeten moet worden.

Bij motoren van na 1960 zijn dit toerentallen van respectievelijk 4000 toeren en 4500.

Voor een Harley is het bij een toerental van 4000 toeren eigenlijk alleen mogelijk met goed gedempte uitlaten onder de norm van 106dB(A) te blijven.

 

Geluid van motoren meten door politie
De politie meet langs de openbare weg.

De microfoon plaatsen zij op 50 cm van de uitlaatmond onder een hoek van 45 graden (mag 10 graden afwijken).

De toerentalsensor plaatst de politie op de bougiekabel. Lukt dat niet meet de politie de pulsen van de bobine.

Het toerental van de typegoedkeuring wordt ingegeven in de meetapparatuur.

De handhaver draait vervolgens driemaal het gas open en het hoogste geluidsniveau telt.

Even gemiddeld gezien: Kom je met een zware motor bij 4000 RPM boven de 110 dB(A) dan kost het geld.

 

Boete en WOK-status
Als het geluid van motoren te luid is bekeurt de politie. De boete tot 4 dB(A) te veel (dus gemeten tussen 106 en 110 dB(A)) is 280 euro.

Als het geluid van motoren vanaf 4 dB te luid is dus boven 110 dB(A) komt, kost het 420 euro en wordt de demper in beslag genomen. Je krijgt dan een zogenaamde Wacht op Keuren (WOK) status en je mag de openbare weg pas weer op nadat de RDW heeft vastgesteld dat je motorfiets weer netjes aan alle eisen en normen voldoet..

De politie handhaaft meestal pas vanaf 5 dB(A) overschrijding en dan krijg je dus een boete.

Demper inleveren, daar zal in de praktijk meestal pas sprake van zijn als het geluid van jouw motorfiets 10 dB(A) of meer afwijkt.

Maar garanties op ruimere handhaving dan de norm kun je natuurlijk niet verwachten, de norm kan ook zomaar worden gehandhaafd.

Een originele E-keur (E1 of E4, al naar gelang de leeftijd van je motorfiets) uitlaat zal geen problemen opleveren.

Heb je een andere demper onder jouw motor dan zit er standaard een DB-killer in. Mits de demper is goedgekeurd uiteraard.

Deze DB-killer dempt het geluid van motoren.

Een after market uitlaat mag (volgens de regels) niet meer geluid produceren dan de originele uitlaat.

Maar in de praktijk zijn er vooral in het verleden veel open uitlaten verkocht en gemonteerd.

En met dergelijke uitlaten is het onmogelijk om met welk soort van dB-killer dan ook onder de wettelijke geluidsnorm te komen.

 

En wat nu?

Als je al deze ellende voor wilt zijn, kun je beter op voorhand je uitlaatsysteem laten voldoen aan de keuringsnorm of in ieder geval aan de voor jou geldende norm.

Dat kan op verschillende manieren, waarbij het wel zo is: Wat je ook doet, je moet sowieso onder de algemene geluidsnorm blijven. Dus:

  1. Of je monteert op je motorfiets een origineel uitlaatsysteem, zoals bij de originele levering aanwezig en blijf binnen de kenteken-verbonden norm;
  2. Of je zorgt dat er uitlaten zijn gemonteerd met  E4-NL keuringsnorm, passend bij het jaartal en type motorfiets en blijf binnen de kenteken-verbonden norm;
  3. Of als er geen keuringsnorm geldt voor je motorfiets: Zorg dat de uitlaat voldoet aan de ‘algemene’ keuringsnorm van 106 dB(A) bij 4000RPM (voor motoren van meer dan 1000cc).

 

Mijn oplossing voor minder herrie:

Mijn HD Heritage FLSTCI uit 2004 had oorspronkelijk bij levering een Europees goedgekeurde uitlaat met E4(NL)- keurmerk.

Maar bij de aanschaf in 2019 zat er een aftermarket ‘real dual’ V&H eliminator 400 open uitlaatsysteem op zonder baffles:

Met de V&H uitlaatdemperss

Met de Catalyst E1 dempers van HD eronder

En daar heb ik een originele set van V&H met silenced baffles in gemaakt, inclusief een dempingspack met glasvezel mat, opgerold om de baffles.

Daarna alles gemonteerd en inderdaad veel minder geluid, maar boven 1000 RPM wel veel meer dan 106 dB(A).

Uiteindelijk heb ik bij mijn broer een set originele 2e hands HD cruiser uitlaatdempers kunnen regelen, keurmerk E1 (Duits) en E4 (Nederlands).

Deze ga ik monteren, ook al moeten de ophangbeugels worden verplaatst.

Hieronder zie je het bestaande montagepunt van de Vance&Hines Eliminator 400 beugels en dempers:

 

En de beugels op de originele dempers die ik naar het midden van de demper moet verplaatsen:

Wel even de montagebeugels moeten verzetten en in de zinc spray, daarna chrome spray eroverheen!

 

 

Aangepaste E3D toolchanger Dock adapter plate

Jantec.nl E3D toolchanger Hymera DD DOCK adapter and 3mm shifted adapter download

Tool T2 en T3 (3e en 4e van links) zitten bij de standaard bouw op ca 1.5 mm van elkaar waardoor de toolfan van T2 vrijwel geen lucht meer kan aanzuigen. De rechter tool T3 komt met de nieuwe aangepaste adapter 3 mm naar rechts, waardoor de linker tool T2 weer lucht kan aanzuigen met de doorzichtige fan en het koelblok van T2 kan koelen van de Hymera Direct Drive extruder.Met deze aangepaste adapter schuift de betreffende tool 3 mm op, waardoor je ten opzichte van de linker tool 3 mm extra ruimte krijgt.

Daarmee is er net genoeg ruimte gemaakt voor de toolfan van de links naastgelegen tool om het koelblok te koelen.

Plaats deze adapter dus op de 2e en 4e plek bij Tool 1 en 3.

Daarmee zijn de eerste (T0) en 3e tool (T2) qua koeling gered!

Links de originele versie, rechts mijn in Autodesk Fusion 360 aangepaste versie voor de tools op positie T1 en T3 (2e en 4e).

Het resultaat:

 

Downloads:

Jantec.nl E3D toolchanger Hymera DD DOCK adapter and 3mm shifted adapter

Calibreren E3D coreXY 4-toolchanger 3d printer

Ik ben bezig met het kalibreren van de gereedschappen, de algemene instellingen enzovoorts, zodat ik verder kan gaan met de rest van de tools.

Daarbij stel ik altijd alle tools in op instellingen die ik afleid ten opzichte van de eerste tool T0.

Op deze manier, mocht er iets veranderen, heb ik een solide referentie.

Morgen ga ik de 2 andere Hemera direct drive tools bouwen en installeren en mogelijk kan ik dan eindelijk mijn Benchy testpint printen met alle 4 de tools!

En met 4 actieve tools, na alle calibraties:

EV laden: Wallbox Copper aansluiten op krachtstroom

Voor  mijn bestelde EV die in november 2022 wordt geleverd heb ik ook een openbare laadplek aangevraagd via de gemeente.

De levertermijn van de openbare laadpaal is ca 26 weken, dat zou dan 1 juni + 6 maanden = 1 december 2022 worden.  Als alles volgens plan loopt.

In geval van nood wil ik ook vanuit mijn woning kunnen laden, en dan gelijk met de maximale stroomsterkte.

De wallbox copper laadunit kan dat regelen in combinatie met een load balancing meetapparaat in de meterkast:

De blauw omcirkelde RJ45 contrastekker is de aansluiting van de stroom- verbruiksmeter bij het pijltje, dat de stroom meet die de gehele installatie verbruikt.

De wallbox copper communiceert met de stroommeter in de meterkast via een specifieke dataverbinding.

Deze dataverbinding heeft een data+, een Data- en een Ground nodig.

Die signalen kun je koppelen tussen de stroommeter en de wallbox via een UTP datakabel.

Er is een opzetje voor het aansluiten beschikbaar:

 

De wallbox copper kan ook met de wallbox app op je telefoon communiceren.

Daarmee kun het verbruik zien, het eventueel delen van je lader instellen en bijvoorbeeld de maximale stroomsterkte, start en stop moment instellen enzovoorts.

De wallbox copper kun je via een Ethernet kabel aansluiten op internet of via wifi.

De ethernet kabel is in mijn geval rood, in de foto.

De datakabel voor de stroommeter naar de wallbox is in de foto grijs.

De aansluiting op krachtstroom heb ik met een kabel en CEE form stekker aan de wallbox copper aangesloten en er is bijbehorend chassisdeel in de meterkast en in de garage beschikbaar.

Buiten, naast de voordeur heb ik een laadpunt gemaakt met een kabel naar binnen, in de meterkast naar de wallbox copper:

Met 2 CAT5 UTP verlengkabels kan ik deze oplossing ook gebruiken om als dat nodig zou zijn, de EV achter mijn woning te laden, in de garage.

Of ik kan de wallbox copper meenemen wanneer ik ergens naar toe ga waar een 400Volt aansluiting beschikbaar is zonder lader.

Dat werkt namelijk ook gewoon zonder load balancer.

Lees HIER het artikel over de installatie van de meterkast , de krachtstroom aansluiting en van het load balancer meetapparaat.

Bouwen E3D coreXY toolchanger 3d printer

Meer over de E3D toolchanger:

E3D toolchanger Z-homing met Voron TAP mogelijk?

E3D toolchanger 4xHemera direct drive eerste 4-kleuren prints

E3D toolchanger: Afstellen van de tool pickups met reprap global variables

Fysieke X- en Y- homing schakelaars op mijn E3D toolchanger

Aangepaste E3D toolchanger Dock adapter plate

Calibreren E3D coreXY 4-toolchanger 3d printer

Mutiring stl en Gcode files voor 6- of minder kleuren 3d printer

First layer testfiles STL voor multicolor printer met 4 Tools

DE BOUW  VAN MIJN 4-KLEURENPRINTER E3D

Juni 2022: Vorige week heb ik de E3D toolchanger 3d printer kit besteld en vandaag heb ik hem (bijna helemaal) gebouwd.

De levering ging wat stroef vanuit Engeland, vanwege de BTW en inklaringskosten die je tegenwoordig in NL moet betalen.

Omdat mijn Voron 2.4 wel snel is, maar niet alles in één dag kon printen, moet ik nog 3 extruders in elkaar zetten.

Hieronder zie je mijn opname met een Hemera direct drive extruder aan de rechterkant gemonteerd.

Om alles te kunnen volgen op de video heb ik alle snelheden van de tool change even 10x langzamer gezet.

Na de eerste dag proefdraaien heb ik het originele Duet2wifi board gewisseld voor een Chinese clone.

Van de clone is de wifi onberispelijk, maar de nieuwe updated wifi module op de originele Duet2wifi is ook met alle updates niet goed aan de praat te krijgen.

Elke keer wanneer ik na een config aanpassing een remote reboot uitvoer loopt de wifi vast en connect het board uiteindelijk fictief naar IP adres 255.255.255.255.

Alle sites nagezocht voor hulp, maar niets gevonden.

Gebrek aan ervaring kan het bijna niet zijn, ik heb voldoende printers prima op duet2wifi draaien.

Voor de zekerheid heb ik een originele Duet ethernet print besteld, dan kan ik het originele board ombouwen naar duet2ethernet en kan ik het i.i.g. nog gebruiken.

Ik heb de versie met 4 tools besteld, de direct drive hemera’s.  Ik wil namelijk ook met soft filament werken.

Het fijne van deze experimentele printer is dat alles met Duet werkt, en ik heb daar behoorlijk wat ervaring mee opgedaan.

De E3D TC wordt mijn eerste semi-pro multicolor printer.

Ik heb een Ender3 pro met MMU2S, een A30M met Chimera dual nozzle en een I3BearV3 met dual magnetic carriages.

Maar van deze 3 systemen is er geen welke echt perfecte prints maakt.  Ze hebben wel elk hun specifieke kwaliteiten en kenmerken.

De Ender3/MMU2S kan snel PLA en PETG printen met 5 kleuren maar vergt een filament spillage tower op het bed en is erg omslachtig en langzaam in gebruik.

DeA30M met Chimera is lekker snel en groot (300x300x400mm) in bouwvolume.  Maar de printkwaliteit is op zijn best redelijk te noemen.  De dual nozzle Chimera met de nozzles op gelijke hoogte raakt bij elke beweging toch net met de niet gebruikte nozzle het topje van het door de actieve extruder neergelegde filament.  En dat geeft vegen met als resultaat een minder mooie print.  Toch gebruik ik dit redelijk veel, met name voor snelle proefprints en op 0,2 0f zelfs 0,3 mm layer height.  Dat gaat prima.

DE I2Bear met de magnetic hotends is een mooie machine, redelijk snel maar lawaaiig vanwege de x-homing op basis van sensorless homing klapt dit met behhrlijkw at herrie bij elke tool change.  Verder een prima printer met goede dual color resultaten. Ook het gebruik van verschillende soo1rten filament is mogelijk.

De eerste foto’s van de bouw van de E3D toolchanger:

Ik heb alles met oranje ASA geprint op de Voron 2.4 op 150mm/s en 0,2mm met de E3DV6 direct drive Voron extruder en een 0.4 mm koperen nozzle.  Dat ging weer prima!

Overigens valt er wel wat op te merken over deze kit.

Het is absoluut geen ‘out of the box’ werkend systeem.

De hardware is voortreffelijk, de handleidingen ook, beter dan alles dat ik ooit gezien heb.

De Duet en Duex combinatie is perfect en alle kabeltjes en schroefjes, moertjes, palletjes, tandwieltjes enzovoorts zijn mooi gelabeld en van prima kwaliteit.

De beschikbare config files, macro files en voorbeeld print files zijn ook prima om mee te starten.

En daar zit het probleem voor niet- kundigen: Alle waarden staan op de best mogelijke configuratie ingesteld.

En afhankelijk van je keuzes qua extruder, wel of geen bowden enzovoorts  heb je hier en daar wat aanpassingen te doen.

Ik heb alles moeten herijken qua ophaal Y-waarden in de tool changer files voordat de tool ook echt netjes werd opgepakt en teruggebracht.

Daarnaast bleek dat de tool pickup heel nauwkeurig moet worden afgesteld om het slot in en uit te kunnen van de extruder platen.

Daarvoor moet je snappen hoe dat is gebouwd, vooral ook in de firmware.

Dan snap je dat het systeem elke keer bij de start moet resetten naar de startstand, en dat maakt het systeem dan het referentiepunt. Vrevolgens moet je meten waar 1) de open stand zit en 2) de op slot stand zit.  Die waarden moet je als C waarden invullen in de pickup-én terugbreng macro’s.

Wat ik ook lastig vind is dat er (nog) geen sensors bij zitten om te checken of de tools in gebruik zijn of geparkeerd zijn.

Dat betekent dat je zomaar een commando kan geven om een homeall te doen terwijl er nog een tool aan de pickup hangt.

Dat zou ik graag willen weten want dan programmeer je daaromheen.

En zo zijn er nog wat zaken zoals geen filament sensor op de tools, geen led verlichting aan de pickup maar daar heb ik al een handig beugeltje voor gezien.

Dus een heel leuk en goed systeem, z’n geld waard en kwalitatief hoogstaand materiaal, design ook mooi en nog veel aan te sleutelen. Gelukkig!

Ik ga in ieder geval mijn Z-homing files van de eerder gebouwde mullti- extruder machines met Duet hergebruiken.

Omdat deze E3D met een pre-homing werkt zonder dat de tools aan de pickup  hangen, zul je af en toe een Tool op Z-afstand ten opzichte van de pickup-waarde moeten calibreren.

En ook de onderlinge verschillen in X en Y natuurlijk, ten opzichte van Tool0.

Daar heb ik ook een paar leuke macro knutsels voor liggen!

Volgende week weer verder!

gaatje en pijpje geplaatst om de magneetkoppeling met de inbus schroef te kunnen stellen

Ronde klok WS2812 & Arduino nano

ABOVE: Circular clock, completed project, reading 05h:41m and crossing to 05h:42m.  Red=hours, Green=minutes

Above: Clock without case, with open components.

READ THIS ARTICLE IN ENGLISH

In de bovenstaande video zie je alle benodigde onderdelen voor de electronica.  Een arduino Nano, een tijdmodule LS3231 met batterij back-up en een 4-delige ring met elk 15 stuks WS2812 LED’s die zorgen voor een 160mm 60 LED units klok.  Je kunt hem bouwen als een open gebouwde unit zoals hierboven afgebeeld met draad of in een 3d printbare slanke behuizing die ik heb ontwikkeld.  Zie de foto’s hieronder.

Voor het bouwen van deze mooie nauwkeurige klok, kun je mijn ontwerp files voor de behuizing gebruiken op elke 3d printer met een horizontale bed maat van minimaal 165x165mm.

Download de beide print STL’s OF van de Prusa gedeelde site waar ik deze ontwerpen heb geupload (zoek op de prusa site naar ws2812 circulaire arduino klok).

OF haal het STL bestand voor de VOORKANT van de klok van mijn website HIER

EN haal het STL bestand voor de ACHTERKANT van de klok van mijn website HIER

Eén STL is voor de achterkant en bevat de Nano box, de andere is voor de voorkant van de klok.  Positioneer de achterste STL 180 graden (dus omhoog gaat omlaag) in uw slicer, zodat zowel de doos als de LED-behuizing op Z-0 niveau zijn, d.w.z. naar beneden gericht op hetzelfde horizontale niveau.   De voorkant kan het best geprint worden met de platte kant naar beneden.  ABS is niet aan te raden omdat het minder stijf is, maar zal waarschijnlijk ook werken.  Voor mij werkt PETG of PLA het beste.

Gebruik wit filament voor het voorste deel, de achterkant kan elke kleur zijn die je wilt.

In de cirkel worden de 4 WS2812 LED segmenten in 1 volledige cirkel van ongeveer 160mm geplaatst.

Als je de elektronica aan de achterkant hebt aangesloten, schuift de voorkant er zo overheen. Geen lijm nodig.  Maar de LED ring kan best op 4 plaatsen met een druppel hotglue aan de basis van de achterste behuizing gelijmd worden.  Dit kun je het beste doen als je zeker weet dat alles goed werkt.

De LED onderdelen zijn verkrijgbaar op o.a. banggood , aliexpress en zo, zoek naar 60LED circle WS2812 die de 160 mm buitendiameter heeft.

Elke LED vertegenwoordigt een punt voor seconden, minuten of als uur indicator.

De kleuren bepalen de functie.  Blauw wordt ook gebruikt als kwartier indicator met minder intensiteit, om een gevoel van positionering te hebben voor de andere LEDS als het donker is.

Kijk naar de video hierboven van het ‘open’ demonstratiemodel om te begrijpen hoe het werkt.

Hieronder vindt je de Arduino code voor de gebruikte Nano3, as-is. het werkt voor mij, en in de code vindt u ook alle benodigde elektrische aansluitingen en de specificaties van de gebruikte Time module.

Haal de Arduino code HIER

Wanneer aangesloten op je PC, kun je de Arduino programmeren en via de seriële interface kun je naderhand speciale instellingen van de klok wijzigen, zoals helderheid, speciale kwartierverlichtingsindicatoren, enzovoort. het staat allemaal in de code hieronder.

De aansturing kan via een seriële interface met de usb ingang van de Arduino, via een terminalprogramma zoals YAT of met de interface van het Arduino IDE programma.

De commando’s zijn:

f; fader UIT
F; fader AAN
m (getal); dim de 4 blauwe marker LED’s met waarde (getal)
S; synchroniseren met RTC tijd
s; synchroniseren met systeemtijd (computer)
t (tijd); systeemtijd veranderen in:
b; helderheid van alle niet-marker LED’s

Doneer a.j.b. $1 aan mijn paypal account als je (delen van) mijn ontwikkelde materialen gebruikt, zodat ik kan doorgaan met het delen van leuke dingen voor jou om te downloaden

Ik hoop dat alles goed gaat lukken!

Succes,

Jan

De Arduino code, te gebruiken voor het programmeren van de Arduino Nano3 is beschikbaar onderaan dit bericht als platte tekst om te importeren in een leeg arduino bestand (met kopiëren en plakken).

Zorg ervoor dat je alleen de bibliotheken en tijdmodule gebruikt die in de code zijn aangegeven!  De gebruikte tijdmodule is van de betere generatie die de tijd zeer goed vasthoudt, ook in stand-by.

Gebruik voor het verbinden van de draden tussen de neopixel segmenten, de arduino en de tijdmodule een temperatuurgeregelde soldeerbout.  Gebruik een ventilator als je aan het solderen bent en adem geen giftige gassen in tijdens het solderen.

De Arduino code is hieronder weergegeven, te importeren in Arduino IDE in een .ino bestand.  Met de Arduino IDE moet je vervolgens de code compileren om de Arduino Nano geflasht te krijgen met het programma.


/**
* NeoClock
*
* Clock using 60 WS2812B/Neopixel LEDs and DS3231 RTC
* Small changes and updates made by jan Griffioen, Amsterdam Europe 2018-2021
* Libraries needed:
* * Adafruit NeoPixel (Library Manager) – Phil Burgess / Paint Your Dragon for Adafruit Industries – LGPL3
* *
* * Arduino Timezone Library (https://github.com/JChristensen/Timezone) – Jack Christensen – CC-BY-SA
* * Time Library (https://github.com/PaulStoffregen/Time) – Paul Stoffregen, Michael Margolis – LGPL2.1
*/

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif

#if defined(ESP8266)
#include <pgmspace.h>
#else
#include <avr/pgmspace.h>
#endif

/* for software wire use below
#include <SoftwareWire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>

SoftwareWire myWire(SDA, SCL);
RtcDS3231<SoftwareWire> Rtc(myWire);
for software wire use above */

/* for normal hardware wire use below */
#include <Wire.h> // must be included here so that Arduino library object file references work
#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);
/* for normal hardware wire use above */

#include <TimeLib.h> //http://www.arduino.cc/playground/Code/Time
#include <Timezone.h> //https://github.com/JChristensen/Timezone

#include <EEPROM.h>

//Central European Time (Frankfurt, Paris)
TimeChangeRule CEST = {“CEST”, Last, Sun, Mar, 2, 120}; //Central European Summer Time
TimeChangeRule CET = {“CET “, Last, Sun, Oct, 3, 60}; //Central European Standard Time
Timezone CE(CEST, CET);

TimeChangeRule *tcr; //pointer to the time change rule, use to get the TZ abbrev
time_t utc;

#define PIN 5

unsigned long lastMillis = millis();
byte dimmer = 0x88;
byte hmark = 0;

byte ohour=0;
byte ominute=0;
byte osecond=0;

boolean fader=true;

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

void setup() {

Serial.begin(57600);

strip.begin();
strip.setBrightness(50);

// Some example procedures showing how to display to the pixels:
// colorWipe(strip.Color(255, 0, 0), 50); // Red
//colorWipe(strip.Color(0, 255, 0), 50); // Green
//colorWipe(strip.Color(0, 0, 255), 50); // Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
// Send a theater pixel chase in…
//theaterChase(strip.Color(127, 127, 127), 50); // White
theaterChase(strip.Color(127, 0, 0), 50); // Red
//theaterChase(strip.Color(0, 0, 127), 50); // Blue

//rainbow(20);
rainbowCycle(2);
//theaterChaseRainbow(50);

strip.clear();
strip.show(); // Initialize all pixels to ‘off’

Rtc.Begin();

Rtc.Enable32kHzPin(false);
Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone);

if (!Rtc.GetIsRunning())
{
Serial.println(“Rtc was not actively running, starting now”);
Rtc.SetIsRunning(true);
}

if (!Rtc.IsDateTimeValid())
{
// Common Cuases:
// 1) the battery on the device is low or even missing and the power line was disconnected
Serial.println(“Rtc lost confidence in the DateTime!”);
}

byte eechk = EEPROM.read(0);
if(eechk == 0xAA) { //Assume this is our config and not a fresh chip
dimmer = EEPROM.read(1);
hmark = EEPROM.read(2);
fader = EEPROM.read(3);
}

timeSync();
}

void calcTime(void) {
utc = now();
CE.toLocal(utc, &tcr);
ohour = hour(utc);
ominute = minute(utc);
if(osecond != second(utc)) {
osecond = second(utc);
lastMillis = millis();

if(ominute == 0 && osecond == 0) {
//Every hour
timeSync();
}
}
}

void addPixelColor(byte pixel, byte color, byte brightness) {
color *= 8;
uint32_t acolor = brightness;
acolor <<= color;
uint32_t ocolor = strip.getPixelColor(pixel);
ocolor |= acolor;
strip.setPixelColor(pixel, ocolor);
}

void drawClock(byte h, byte m, byte s) {
strip.clear();

addPixelColor(m, 1, dimmer);

if(hmark > 0) {
for(byte i = 0; i<12; i++) {
addPixelColor((5*i), 2, hmark);
}
}

h %= 12;
h *= 5;
h += (m/12);
addPixelColor(h, 2, dimmer);
// 0x RR GG BB

if(fader) {
byte dim_s1 = dimmer;
byte dim_s2 = 0;
byte px_s2 = s+1;
if(px_s2 >= 60) px_s2 = 0;
unsigned long curMillis = millis()-lastMillis;
if(curMillis < 250) {
dim_s2 = 0;
dim_s1 = dimmer;
}else{
dim_s2 = map(curMillis, 250, 1000, 0, dimmer);
dim_s1 = dimmer – map(curMillis, 250, 1000, 0, dimmer);
}

// Add blue low intensity dots for 12(0),3, 6 and 9 O’çlock to verify where the clock is positioned..
addPixelColor(15, 128, 10);
addPixelColor(30, 128, 10);
addPixelColor(45, 128, 10);
addPixelColor(0, 128, 40);

addPixelColor(s, 0, dim_s1);
addPixelColor(px_s2, 0, dim_s2);
}else{
addPixelColor(s, 0, dimmer);
}

// add a background color
// setBrightness(Serial.parseInt());
// uint16_t j;
// for(j=0; j<60; j++) { // 1 cycles of colors on wheel
// strip.setPixelColor(j, Wheel(((j * 256 / strip.numPixels()) + j) & 255));
// }

strip.show();
}

byte rounds = 0;

void loop() {
calcTime();

if(rounds++ > 100) {
Serial.print(ohour);
Serial.print(“:”);
Serial.print(ominute);
Serial.print(“:”);
Serial.print(osecond);
Serial.println(“(C)JG-2020”);
rounds = 0;

}
//rainbow(21);
if (osecond == 59){theaterChase(strip.Color(0, 0, 127), 40); }// Blue; }
//if (ominute == 59 AND osecond == 59){theaterChase(strip.Color(0, 127, 0), 50); }// Green}
//if (ohour == 11 AND ominute == 59 AND osecond == 59){theaterChase(strip.Color(127, 127, 0), 50); }// Green}
else {drawClock(ohour,ominute,osecond);}

delay(10);

chkSer();
}

void timeSync(void) {
RtcDateTime dt = Rtc.GetDateTime();
setTime(dt.Hour(),dt.Minute(),dt.Second(),dt.Day(),dt.Month(),dt.Year());

Serial.print(“Synced to: “);
Serial.print(dt.Year());
Serial.print(“-“);
Serial.print(dt.Month());
Serial.print(“-“);
Serial.print(dt.Day());
Serial.print(“-“);
Serial.print(dt.Hour());
Serial.print(“-“);
Serial.print(dt.Minute());
Serial.print(“-“);
Serial.println(dt.Second());
}

void timeSave(void) {
utc = now();

RtcDateTime store = RtcDateTime(year(utc), month(utc), day(utc), hour(utc), minute(utc), second(utc));
Rtc.SetDateTime(store);

Serial.print(“Synced to: “);
Serial.print(year(utc));
Serial.print(“-“);
Serial.print(month(utc));
Serial.print(“-“);
Serial.print(day(utc));
Serial.print(“-“);
Serial.print(hour(utc));
Serial.print(“-“);
Serial.print(minute(utc));
Serial.print(“-“);
Serial.println(second(utc));

}

void setBrightness(byte brightness) {
dimmer = brightness;
}

void chkSer(void) {
unsigned int iy;
byte im,id,iH,iM,iS;

if(!Serial.available()) return;

switch(Serial.read()) {
case ‘b’:
setBrightness(Serial.parseInt());
Serial.print(F(“Brightness changed to: “));
Serial.println(dimmer);
EEPROM.put(0, 0xAA);
EEPROM.put(1, dimmer);
break;
case ‘t’:
iy = Serial.parseInt();
im = Serial.parseInt();
id = Serial.parseInt();
iH = Serial.parseInt();
iM = Serial.parseInt();
iS = Serial.parseInt();
setTime(iH,iM,iS,id,im,iy);
Serial.println(F(“System time changed”));
break;
case ‘f’:
fader = false;
EEPROM.put(0, 0xAA);
EEPROM.put(3, 0);
Serial.println(F(“Fader off”));
break;
case ‘F’:
fader = true;
EEPROM.put(0, 0xAA);
EEPROM.put(3, 1);
Serial.println(F(“Fader on”));
break;
case ‘m’:
hmark = Serial.parseInt();
EEPROM.put(0, 0xAA);
EEPROM.put(2, hmark);
Serial.println(F(“HMark changed”));
break;
case ‘s’:
timeSync();
Serial.println(F(“Synced RTC to System”));
break;
case ‘S’:
timeSave();
Serial.println(F(“Synced System to RTC”));
break;
default:
Serial.println(‘?’);
}
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}

void rainbow(uint8_t wait) {
uint16_t i, j;

for(j=0; j<256; j++) {
for(i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i+j) & 25));//255
}
strip.show();
delay(wait);
}
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;

for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
for(i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
for (int j=0; j<4; j++) { //do 4 cycles of chasing
for (int q=0; q < 3; q++) {
for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, c); //turn every third pixel on
}
strip.show();

delay(wait);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
for (int q=0; q < 3; q++) {
for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on
}
strip.show();

delay(wait);

for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r – g – b – back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 – WheelPos;
if(WheelPos < 85) {
return strip.Color(255 – WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 – WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 – WheelPos * 3, 0);
}

Installeren load balancing met Wallbox copper en aanpassen meterkast naar 3 fasen

Mijn EV staat nog steeds in bestelling en de laadpaal in de parkeergarage staat er al, en thuis heb ik vandaag (juni 2022) de Wallbox Copper aan het voor de  load balancing benodigd meetapparaat gekoppeld.

Voorwaarde is natuurlijk wel dat je voorafgaand aan het aansluiten van de wall charger en de load balancing al een 400Volt 3-fasen aansluiting hebt laten maken door de netbeheerder, in je meterkast.  In alle huizen van na 1980 is er al een standaard 3x 25Ampère aansluiting aangebracht onder de meterkast, al zit die aansluiting niet standaard aangesloten op de huisinstallatie.  De netbeheerder kan die voorbereide aansluiting koppelen aan je huisinstallatie MITS die installatie eerst is aangepast aan een voeding met 3 fasen, 400Volt.  Met zo’n aansluiting krijg je namelijk gewoon 3x 230 Volt, met een spanning tussen de 3 fasen van 400 Volt.  Je begint in deze hele procedure om een laadpaal te plaatsen dus met:

  1. Groepenkast in mei laten ombouwen naar 3 fasen inclusief een nieuwe 3 fasen schakelaar, 3-fasen aardlek- en  3 fasen-zekering-automaat voor je nieuwe 3-fasen laadaansluiting.  je kan dan ook gelijk je laadaansluiting laten monteren als je wilt, ook al werkt die dan nog maar op 1 fase.  Kosten nieuwe groepenkast inclusief montage circa 1000-2000 Euro, afhankelijk van de situatie.
  2. Voor de load-balancing heb je een apparaat nodig dat ook in je groepenkast moet worden gemonteerd dat de totale afgenomen stroom meet. Dit 3-fasen apparaatje wordt aangesloten tussen je 3-fasen hoofdschakelaar en de huisinstallatie (waar ook de laadaansluiting onder valt).  Kosten load balancer meetapparaat circe 200 Euro, excl montage.
  3. Hierna kan de netbeheerder de 3-fasen aansluiting komen verbinden met je huisinstallatie en je nieuwe groepenkast. Je krijgt gelijk een nieuwe 3-fasen  verbruiksmeter in plaats van je bestaande meter. Je moet hier zelf een afspraak voor maken met de netbeheerder.  Er zijn wel kosten aan verbonden qua installatie, circa 300 Euro.  En gelukkig woon ik in een gebied waar Stedin netbeheerder is, dus: in mei 2022 aangevraagd en in juni 2022 zijn de 3 fases aangesloten door Stedin,  en gelijk hebben ze ook de oude slimme meter vervangen door de 3 fase slimme meter.  Bij Liander zijn de slimme 3-fase meters kennelijk al vanaf april 2022 op.
  4. Nadat alles is aangesloten en werkt kan de laad-aansluituing worden gemaakt, als dat nog niet gelijk bij 1) is uitgevoerd.  De kosten van een wallbox copper zijn circa 800-950 Euro, exclusief montage.
  5. Om de lader te gebruiken moet je hem eerst instellen.  Je maakt eerst een account aan via de app of online op de wallbox website.  Dan stel je zaken in als beschikbare stroomsterkte enzovoorts.  Het is mogelijk om je lader te delen met anderen als je dat wilt.  Je kan dan je eigen tarief bepalen en je wordt dan zichtbaar in zoekmachines van laadpunten.

Voor load-balancing heb je een apparaat nodig dat je totale stroomverbruik meet.  Dat apparaat koppel je aan een slimme lader zoals de wallbox copper en de wallbox copper communiceert vervolgens met je EV over de maximaal te gebruiken laadstroom.  Er zijn ook load-balancers die je alleen maar in je RJ11 gaatje van je slimme meter hoeft in te pluggen, en dan via je app te koppelen aan je laadbox.    Simpeler kan bijna niet.

Maar wat blijkt: je kan niet zomaar alle gegevens bij elkaar vinden om dit te installeren.  Terwijl het in de aard net zo ingewikkeld is als een groepenkast installeren.  Of iets eenvoudiger zelfs, want je hebt maar 1 apparaat aan 1 apparaat aan te sluiten.  En de energie-aansluiting naar de Wallbox moet natuurlijk ook worden gemaakt.

Onderstaand heb ik foto’s bijgevoegd van mijn installatie:

Het 3-fasen meetapparaat dat de stroomafname van de gehele installatie meet en doorgeeft aan de Wallbox copper. Dit meetapparaat zit tussen de hoofdschakelaar in de groepenkast en de verbruikers daarachter gemonteerd.

HIer zie je hoe de datakabel aan het meetapparaat is gekoppeld.  Als je goed kijkt zie je verder dat ik allemaal gecombineerde aardlek-schakelautomaten heb geïnstalleerd ook voor beide 400V krachtstroomgroepen.  Dat scheelt EN veel ruimte, EN geeft duidelijkheid waar een mogelijk probleem zit in de installatie, wanneer er een probleem optreedt.

Dit is de binnenkant van de Wallbox copper. de grijze kabel is een RJ45 kabel die is aangesloten op het onderste groene blokje op data- (oranje) , data+ (roze) en Ground (4kleuren). Deze kabel gaat via een REJ45 straight koppelbus naar het meetapparaat. Het linker aansluitblok voor de krachtstroom aansluiting gaat met een rubber kabel van 5×2.5 mm2 naar de CEE form krachtstroom aansluiting.

Als alles goed is aangesloten gaat het blokje RX/TX aan op het meetapparaat. Daarmee is duidelijk dat de data wordt uitgewisseld tussen het meetapparaat en de Wallbox copper. Load balancing is nu te gebruiken, maar je moet nog wel je gewenste stroomsterkte instellen op de wallbox copper in de app of in de online omgeving van wallbox.

Ik heb er voor gekozen alles met kabels aan te sluiten met connectoren, omdat ik nog niet weet waar ik de wallbox copper(s) definitief ga plaatsen.  Het is in mijn gemeente niet toegestaan over de stoep een laadkabel te plaatsen, dus het zou kunnen dat ik in de achter het huis gelegen garage de EV moet gaan opladen.

Dan moet ik nog wel een 400V aansluiting maken in de garage, een internet verbinding maken voor de dataconnectie vanaf internet en een verlengkabel RJ45 maken voor de connectie tussen het meetapparaat en de Wallbox copper.

En daar heb ik nog wel even de tijd voor, gezien de lange levertijd van mijn EV.  De spullen heb ik liggen, de funderingsboor ook.  Alleen nog even de tuin opruimen en als het moet, kunnen de kabels natuurlijk ook nog even bovengronds in de tuin liggen..-)

Ik heb via mijn gemeente toch maar een openbare laadpaal aangevraagd, om te delen en te gebruiken.  Over de stoep is eigenlijk niet mogelijk omdat er nogal wat mensen met hulpmiddelen over mijn stoep voor het huis lopen.  Het is een drukke looproute naar het nabijgelegen winkelcentrum en iets op de stoep leggen lijkt niet erg handig.

In noodgevallen kan alles natuurlijk, maar dan zal ik toch eerder gebruik maken van de aansluiting om te laden achter het huis, in de garage.

En zo was het vorig jaar nog in de meterkast:

 

Elektrische auto, maar geen oprit of garage? Deze laadpaal boven het voetpad maakt laden mogelijk (België, 29-08-2021)

Door: RVDB29-08-2021

Wie een elektrische auto wil opladen en in een rijhuis woont, botst onvermijdelijk op praktische problemen. De Hasseltse ondernemer Danny Vaes heeft daarvoor een slimme oplossing bedacht: de LUPYS, een laadpaal boven het voetpad.

Een kabel over het voetpad mag niet

Steeds meer autobestuurders stappen over op een plug-inhybride of elektrische wagen. Maar hoe moet je die opladen als je thuis geen garage of oprit hebt? Je kunt niet zomaar een kabel over het voetpad leggen, want volgens de wegcode mag je geen hinder of gevaar veroorzaken voor andere weggebruikers. Of het al dan niet toegelaten is met een kabelgoot, verschilt naargelang het politiereglement van de gemeente en is niet altijd duidelijk. Publieke laadpunten zijn nog altijd schaars en niet goedkoop.

Ook Danny Vaes, een architect-stedenbouwkundige die in een rijwoning woont, stootte op dit probleem. “Drie jaar geleden wilde ik mijn CNG-wagen inruilen voor een elektrische. Toen stelde ik vast dat er qua laadinfrastructuur geen oplossing bestond voor mij. Er is een publieke laadpaal op vijfhonderd meter, maar dat gebrek aan comfort kon mij niet overtuigen. Daarom ben ik op zoek gegaan naar een oplossing voor rijwoningen. Tot mijn verbazing bleek die nog niet te bestaan en besloot ik om ze dan maar zelf te ontwerpen. Ik bestudeerde laadinfrastructuur onder het voetpad, erin, erop en … erboven. Zo ben ik op het idee van de LUPYS gekomen.”

Meer dan een laadpaal

LUPYS staat voor ‘Line UP Your Street’. De laadpaal ziet eruit als een gewone regenwaterpijp aan de gevel, tot er een speciale arm naar beneden klapt om een kabel tot bij de laadpoort van de auto te brengen. Voetgangers wandelen onder de arm en worden dus niet gehinderd. Het is trouwens veel meer dan alleen een laadpaal voor auto’s. Straatverlichting en een parkeermeter kunnen geïntegreerd worden, zodat die niet meer op het voetpad moeten. Er is ook een stopcontact voor een elektrische fiets voorzien.

Parkeerprobleem?

Goed bedacht, al is er één praktisch probleem in wijken met een grote parkeerdruk: hoe zorg je ervoor dat je effectief plaats hebt voor je eigen woning? “We bekijken hoe we de LUPYS kunnen combineren met een slim parkeerbeleid. De bedoeling is om de LUPYS te delen met vier of vijf buren. Het wordt dus een semipubliek verhaal om te vermijden dat iedereen een laadpaal moet plaatsen aan zijn voorgevel. Als je zo’n laadpaal deelt met meerdere buren valt het ook te verantwoorden om die parkeerplaats voor hen te reserveren. Of we kunnen de parkeerplaats overdag openlaten en vanaf de avond tot de ochtend reserveren voor wie wil laden. Er zijn verschillende mogelijkheden.”

De LUPYS kan helpen om meer laadpunten te creëren in België, waar nog veel werk aan de winkel is qua laadinfrastructuur. Momenteel is er al een prototype klaar. “We willen de steden wakker schudden en tonen dat er een alternatief bestaat voor kabels over het voetpad”, zegt Danny Vaes. “De volgende stap is om in overleg te gaan met alle lokale overheden. Zodra zij groen licht geven voor de uitrol, kunnen we starten.”

Elektrische auto laden over / boven de openbare stoep met een uittrekbare scharnierende kabelhefboom

Om je elektrische wagen te laden wil je natuurlijk je zonnepanelen gebruiken.

Maar wat doe je wanneer je gemeente je verbied om de laadkabel over de stoep naar je wagen te leggen?

Mijn gemeente heeft een raadsbesluit genomen waarbij je een laadpaal kan bestellen via een externe partij, en dan kun je dus een openbare laadpaal in de buurt laten aanleggen.  Mits er niet binnen een redelijke afstand al een laadpunt is.  In mijn wijk zijn nauwelijks laadpunten, en de enige die ik heb kunnen vinden is op ca. 400 meter afstand, bestaande uit 2 AC charging laadpunten waar altijd twee auto’s staan te laden.

Op zich natuurlijk een prima oplossing, al is het wel jammer dat je gelijk een paar parkeerplekken moet opofferen om er af en toe een elektrische wagen op te kunnen laden.  En op zo’n laadplek mag je niet met een ander type auto dan een elektrische staan, waardoor je per saldo minder reguliere parkeerplekken overhoudt dan voor de aanleg van de laadplekken.

In mijn speurtocht naar mogelijke oplossingen om het toch mogelijk te maken om via de openbare stoep naar de auto te komen zodat ik wel thuis de auto zo af en toe kan laden, ben ik verschillende oplossingen tegengekomen.  Van die oplossingen is er eigenlijk maar één bruikbaar, omdat alle oplossingen met kabelgoten of kabelbescherming over de stoep overlast veroorzaken, mogelijk ook tot aansprakelijkheidsproblemen kunnen leiden wanneer iemand over de kabel struikelt of op een andere manier last heeft van de kabel over de stoep.

En dan hebben we het nog niet over veiligheid.  Of het nou echt wel verstandig is om een laadkabel over de stoep te leggen terwijl er mensen met allerlei hulpmiddelen overheen zullen moeten.  In mijn visie is het niet verstandig om kabels over de openbare weg te leggen en ook niet in je tuin of binnen.  Je kan er ook nog over struikelen.

Het is natuurlijk ook niet altijd mogelijk om de auto in de buurt van de voordeur te parkeren.  Wanneer je bijvoorbeeld laat thuiskomt en alles al vol staat met auto’s is laden voor je deur geen optie.  Maar dat heb je bij de aanwezige openbare laadpunten op dat moment ook. Niemand haalt ’s avonds z’n elektrische auto van de lader, dat doe je ’s morgens pas.

Het komt er op neer dat je thuis wilt kunnen laden wanneer er plek is en dat is niet elke dag nodig.  Bij een gemiddelde woon-werk afstand enkele reis van 50 km is de laadbehoefte bij voltijds werken en zonder thuiswerken maximaal 1x per week.  En dat zal toch wel mogelijk zijn, in mijn ervaring. Ik parkeer minstens 1 van de 2 keer redelijk voor de deur of een plek er naast.  Dat geeft voldoende gelegenheid om de wagen ten minste één keer per week te laden.  Uiteindelijk gaat de accu ook veel langer mee wanneer je laadfrequentie zo laag mogelijk blijft en je de accu tussen 20 en 80% capaciteit benut.

De oplossing om met een hoog aan je gevel geplaatste scharnierende kabelboom de kabel over de openbare stoep heen direct bij je auto te krijgen is een behoorlijk in het oog springende oplossing.  Maar- de stoep blijft daardoor wel vrij van hindernissen en niemand heeft er last van.  Behalve dan misschien het feit dat het er niet echt fraai uit ziet.  Ik ben benieuwd hoe de gemeente deze oplossing zou willen en- kunnen- verhinderen.  Immers, voor soortgelijke zaken zoals vlaggen over de openbare stoep op voldoende hoogte wordt ook niet gehandhaafd. Als dat bij wet al mogelijk is.

Het ziet er qua principe zo uit:

De hefboom is naar boven toe te bewegen na gebruik.  Dan valt de hele boom weg in de verticale houder.  LINK NAAR CHARGEARM, DE LEVERANCIER

By the way: Openbaar laden in België kent ook zo haar problemen en oplossingen bij smalle voetpaden:

Een ontwikkeling vanuit een Belgische gemeente als oplossing van een openbare laadpaal zonder in de weg te staan op de openbare weg

 

Voor mijn thuissituatie plaats ik liever de hefboom aan de gevel of op de erfgrens, zodat niemand er last van heeft. Met een scharnierpunt is de hefboom dan na gebruik mooi weg te bewegen tegen de gevel, waar je de hefboom kan vastmaken.

Onderstaand een voorbeeld van een bedrijf dat deze hefbomen maakt voor het ophangen van lasschermen in fabriekshallen.  Ze bestaan ook in uittrekbare versie tot een lengte van 6 meter.

Wanneer je zo’n oplossing maakt moet het natuurlijk ook aan alle voorschriften en regelgeving voldoen, en het ontwerp moet zodanig zijn dat het ook een beetje past bij de omgeving.  Kleur en materiaalkeuze is ook een dingetje en het mag geen overlast veroorzaken zoals klapperen tegen de gevel enzovoorts.  En de constructie moet professioneel worden geaard.

Vanuit de gemeente verwacht ik wel weerstand omdat de gemeente er van uit gaat dat elektrisch rijden nog een minderheidsaandeel heeft en er daardoor geen serieuze oplossing hoeft te zijn voor thuisladen op openbare parkeerplekken.

De wereld is zo snel aan het veranderen richting elektrisch persoonlijk vervoer, de verkoop van nieuwe auto’s bestaat Q1-2022 al voor 10% uit elektrische wagens.  Natuurlijk helpen de subsidieregelingen hier ook bij, maar al die verkochte auto’s gaan wel gewoon rijden en hebben behoefte aan laadplekken.

Gegeven het feit dat mensen met zonnepanelen ook de eersten zijn die elektrisch gaan rijden, willen deze mensen ook gebruik maken van die zonnepanelen voor hun elektrisch transport.   En zolang de salderingsregeling voor het terug leveren van energie nog loopt zal de druk op het per sé thuis willen laden van de elektrische auto nog niet erg groot zijn.  Maar door de oplopende energieprijs waardoor publiek laden opeens veel duurder wordt dan thuis zou die druk op het tóch voor de deur willen laden met gebruikmaken van de eigen zonnepanelen weleens veel groter kunnen worden.

VEHICLE TO  LOAD

Daarnaast is de laatste ontwikkeling om je huis te laten draaien op je accu van de auto opeens serieus want alle merken leveren nu elektrische auto’s met vehicle to load aansluiting waardoor je met je laadkabel ook terug kan leveren naar je woning.  Dat betekent overdag laden met de zonnepanelen en ’s avonds lekker je energie gebruiken vanuit je auto-accu.  Een gemiddeld gezin verbruikt ’s avonds 8kWh en de auto heeft meestal zo’n 50-70 kWh beschikbaar.  De meeste zonnepanelen-installaties van particulieren beginnen bij 8 panelen en dat is exact voldoende om bij een gemiddelde dag gedurende de 8 zonnemaanden van het jaar de auto weer helemaal op te laden voor het gebruik van 8kWh per dag.  En de maanden november tot en met februari? Die zul je qua elektrische energie nog steeds moeten ‘inkopen’.  Liefst met windenergie via een groene leverancier natuurlijk.  Wanneer je dagelijks met je Elektrische auto naar en van je werk rijds gaat het verhaal van opladen vanaf je zonnepanelen voor die werkdagen natuurlijk niet op.  Maar wanneer je regelmatig thuis werkt geldt het verhaal natuurlijk voor die dagen wel, net als de perioden dat je in het weekeinde overdag aan de stekker staat.

Bij vehicle to load is het wel nodig dat de auto altijd aan de stekker staat, direct wanneer je parkeert.  Dat past naar mijn overtuiging niet met openbaar parkeren en eigen laadaansluiting, al dan niet met een kabel over de stoep of aan een laadboom. Eigenlijk kan dit alleen maar werken wanneer de auto op eigen terrein staat.

Rij-ervaringen met de 4-bak

Update 2021 juni: De traction weer eens helemaal gepoetst en zowel het chroom, aluminium als de lak onder handen genomen.
De wagen ziet er van buiten geweldig uit en rijdt beter dan nieuw met de combi van 4-bak en de ID motor. 
Starten (op LPG) is een feestje en gaat altijd in 1 x goed, ook als de wagen een half jaar in de opslag heeft gestaan.
Het rijdt gemakkelijk, zowel op de snelweg als in de stad.
Wat ik nog wel als leerpunt heb gehad: de wagen lekte steeds iets motorolie vanuit de motor. 
Na veel speurwerk heb ik in 2020 besloten om de originele SAE30 olie in de motor te doen in plaats van de 10W40 die ik tot nu toe gebruikte. 
En wat denk je: Na ongeveer een jaar is het lekken helemaal weg.  Rijden is nog steeds prima en het olieverbruik is ook ongewijzigd, dus nihil. 
Blijft bijzonder natuurlijk, dat die oude motoren zonder oliefilter natuurlijk wel meer verversingsbeurten nodig hebben maar dat de dope van de moderne olie de oude afdichtingen aantast. 
Dus, nooit te oud om te leren!
Inmiddels is er natuurlijk nauwelijks meer iets origineel aan mijn Traction Avant. 
Dat is eigenlijk wel een beetje jammer maar zorgt er gelijktijdig wel voor dat ik de auto steeds meer ga gebruiken omdat ‘ie gewoon erg gemakkelijk meekomt in het verkeer.
De veranderingen aan de Traction:

12 Volt ombouw van alles, met een ISKRA generator, een 12 Volt tractie-accu en capacitor pack op de ontsteking.

H4 koplampspiegels voor de 12V lampen (natuurlijk wel geel). 

ID- motorblok van een laatste versie Citroën ID (handgeschakeld) uit 1965.

4-Versnellingsgbak van diezelfde ID, met koppelingshuis en omgebouwd differentieel van de originele Traction Avant.

LPG-inbouw met 40 liter tank in de kofferbak.

Volledig electronische ontsteking.

Schutbord kachel in het interieur.

Aandrijfassen met dubbele homokineten.

Alle rubbers van de remmerij vernieuwd en DOT3 in het remsysteem.

Diafragma koppeling en een omgebouwde koppelingsplaat (half ID en half TA).

Omgebouwd levier zodat er ‘normaal’ geschakeld kan worden.

En cruise control, dat is echt super makkelijk rijden op de snelweg!.

  •  
  • Ben nog bezig in het hoofd om op de voorwielen schijfremmen te maken. Maar uiteindelijk lijkt dat niet nodig wanneer je je onderhoud aan de remmen regelmatig doet.

Hieronder lees je anti-chronologisch wat er de afgelopen jaren na de inbouw van de 4-bak allemaal met de auto is gedaan:    

Druk druk druk…. Pas vanaf de zomer van 2015 ben ik echt wat afstanden met de auto gaan rijden.

Toeren in de zon

 

 

Eerst een rondje om de kerk, alles nameten en controleren en daarna steeds verder.

Gewoon wat rondrijden ligt me niet zo, ik gebruik de auto’s en motor liever met een doel…

Begonnen in augustus 2015 met ruim 200 kilometer aan één stuk, afwisselend lokale wegen en provinciale wegen.

Daarna op de snelweg langere tijd boven 100 kilometer per uur gereden.

De LPG installatie werkt voortreffelijk, ook starten op LPG zonder probleem, in 1 keer aanslaan zowel koud als warm en gelijk netjes stationair draaien.

De algemene impressie is dat het erg prettig rijdt, weinig toeren en weinig herrie.

Vergeleken met de 3-bak en de herrie met motorgeluid en 3-bak boven 75 kilometer per uur rijdt de auto nu meer als een vroege DS.

Besturen en remmen gaat ook soepel.

Omdat de motor ook lekker soepel draait en veel vermogen heeft, ook onderin de toeren, is het mogelijk om al tussen 2000 en 2500 toeren op te schakelen. In z’n 3 de rotondes over bij snelheden tussen 15 en 25 kilometer per uur gaat vanzelf.

Door de synchronisaties op de bak rijdt het gewoon erg prettig. Ook het omgebouwde levier doet zijn werk goed. Na het instappen hoef je niet meer na te denken over de schakelvolgorde.

Omdat ik een poelie op de nokkenas heb gebruikt van een DS maakte de fan en waterpomp meer toeren dan bij een TA. 

Na deze hele ombouw heb ik de pulleys van waterpomp en de nieuwe AC/12V ISKRA dynamo  nog aangepast aan de nieuwe situatie. 

Uiteindelijk was het veel sneller draaien van de waterpomp niet heel handig en zeker niet nodig. 

De pulley van de waterpomp heb ik gesplitst, op de draaibank afgedraaid in het midden tussen beide delen en weer aan elkaar gelast, daarna vlak gedraaid enzovoorts.

De waterpomp pulley is daarmee weer wat groter geworden in het loopvlak zodat de dunnere 1cm (of 9mm) V-snaar beter past.

De nieuwe V-snaar is passend gekocht op de benodigde lengte en alles werkt ook hier weer uitermate soepel. 

De pulleys van de aandrijving en van de dynamo waren beide al bestemd voor een smalle V-snaar dus nu is alles weer in lijn en passend.

Zie rechtsonder in onderstaande foto:

Na de eerste proefrit lagen er de volgende dag twee kleine vlekjes olie op de vloer van de garage. 1 uit het oliecarter van de motor aan de achterkant en 1 onder de versnellingsbak aan de voorkant…

Het zijn beiden plekjes van 3 centimeter in het rond.

Update 3-2021: Na veel onderzoek ben ik er achter gekomen waarom de wagen op de kurk pasvlakken van de carterpan steeds een beetje bleef lekken. 

Na de revisie van de motor heb ik synthetische 20W40 motorolie gebruikt. 

Kurk en synthetische motorolie gaat niet samen. 

Eind 2020 heb ik SAE30 in de motor gedaan en nu, maart 2021 lekt de motor helemaal niet meer.

De versnellingsbak lekte aan de neus en dat heb ik verholpen met het heel goed schoonmaken van de shims en gebruik te maken van hele dunne papieren pakkingen, waarbij de totale pasdikte gelijk is gebleven door het wisselen van 1 shim.

Midden 2019 heb ik een professioneel banden balanceerapparaat aangeschaft omdat het nergens lukte om de wielen van mijn oldtimers te laten balanceren. 

Hierna heb ik alle wielen nog een keer gebalanceerd.

In 2017 heb ik de LHS vervangen door DOT3 remvloeistof.

DOT3 heeft onder andere smerende eigenschappen en kun je zonder meer als vervanger gebruiken, mits je alle LHS goed eruit laat stromen en alles helemaal eruit blaast/ spoelt met spiritus. 

Dit is nog steeds helemaal OK..

Qua remmen blijft er toch steeds onderhoud nodig.

Ik heb in mijn doorsmeerschema ook opgenomen dat ik het ene jaar de achterremmen- en het andere jaar de voorremmen open maak en na stel met het speciaal gereedschap. 

Doordat ik gemiddeld net iets sneller rijd moeten de remmen gewoon perfect werken…

De elektronische ontsteking werkt ook prima, daar heb ik later nog wel een supercharger capacitor pack bij gehangen zodat er bij het starten altijd voldoende power is voor de ontsteking!

Ik start trouwens standaard altijd op LPG. 

De benzinetank wordt niet gebruikt, alleen af en toe om te checken of de wagen ook nog op benzine rijdt. 

Ik heb er wel een veredelingsstaaf in hangen om corrosie tegen te gaan.

De kachel werkt ook prima, uitgetest met -5 graden buiten. De luchtbuis naast het tellerhuis geeft voldoende warme lucht op de voorruit.

De nieuwe originele Michelin 400 banden werken ook ’s winters fijn! Was even een investering maar dat is het dubbel en dwars waard geweest.

Al met al dus lekker geslaagd! Wensen?

  1. Eigenlijk moet ik nog een keer de bekleding vervangen door de set die ik in 2007 heb aangeschaft.  Maar ik aarzel over het dak.  Dat is helemaal origineel en wel vergeeld maar helemaal compleet en netjes.  Zonde om dat te vervangen eigenlijk.  De stoelen, bank en voor- en zijpanelen ga ik wel doen.  De deurpanelen gaan ook mee en de biezen rondom de deuren neem ik ook mee.
  2. En- het gat in mijn dashboard waar ooit een autoradio in zat ga ik dichtmaken.,  Nu ik ervaren ben met mijn lasapparatuur durf ik dat wel aan.  Eerst een perfect passend nieuw stuk plaat maken, beide kanten iets hellend afslijpen met de stiftslijper, alles stabiel inklemmen en met TIG rondom hier en daar vastprikken. Daarna steeds iets meer stukjes lassen zonder veel te verhitten en steeds 10 minuten wachten om alles af te laten koelen…  En nabewerken, spuiten in de originele kleur enz..

STL files voor Minimill WMD16LV CNC conversie direct drive adapters downloads met NEMA23 stappenmotoren

Doneer alsjeblieft $1 naar mijn paypal account als je (delen van) mijn ontwikkelde materialen gebruikt, zodat ik leuke dingen kan blijven delen die je kunt downloaden en -gebruiken

KLIK op de URL om het downloaden van het bijbehorende STL-bestand te starten

MINIMILL_BF16L CNC_Y_adapter direct 2022_07_25_V1_5-jantec.nl

 

 

MINIMILL_BF16L CNC_X_adapter direct drive 2022_07_25_V1_5-jantec.nl

 

 

 

STL download voor de TOP direct drive adapter van de WMD16LV minifrees en Nema23 stappenmotor

MINIMILL_BF16L CNC_Z_adapter direct drive 2022_07_25_V1_5-jantec.nl

 

Tesla model S historie en beste koop

Het valt niet mee om de juiste keus te maken als je een Tesla model S wilt hebben..

Nog los van wat je zelf echt wilt en nodig hebt, is er nogal wat verschil in de modellen en uitvoering bij de Tesla S geweest.

Vanaf 2012 bestaat de Tesla S al, en de meest verkochte modellen zijn ongetwijfeld de S75 en de 75D geweest.

Tesla Model s 75 2013 2014 2015 2016 2017 2018 2019 2020 2021 prijzen, specificaties en occasions - AutoRAI.nl
Tesla Model S 75 2013-2021

Als je de typeringen nog niet kent: de D staat voor Dual motor, oftewel AWD.

Zonder D heb je dus een RWD, achterwielaandrijving.

En dan heb je ook nog de P voor de hoeveelheid Kwh staan, de Performace uitvoering.  Dus heb je het liefst een P100D.  Of is dat nou juist niet zo slim?

Tesla Model S P100D+ Plaid Charges To Life In New Photos

Dan gaat het er dus ook om dat je niet een heele zware auto wilt hebben want in 2024 gaat het voordeel dat er geen motorrijtuigenbelasting wordt geheven op elektrische auto’s eraf.  En- zoals het nu staat- betaal je dan alsof het een -je raadt het al- benzine-auto is. Jawel!

In mijn geval wil ik wel graag een model van na de facelift in 2017, anders heb je zo’n grote namaak radiator vorm in de neus van de wagen zitten.

Tesla Model S 90D (2015-2016) prijs en specificaties - EV Database
Tesla Model S 90D 2015-2016

De hoeveelheid kilometers maakt helemaal niets uit, dus ik zoek vooral naar lease-auto’s die veel kilometers hebben gemaakt.  Maar liever geen taxi’s.

En het liefst een 90D of een 100D, in zilvergrijs of rood.

silver-tesla-model-s- | Tesla model s, Tesla model, Tesla

Gemiddelde prijs 60.000 Euro omdat ik ook een elektrisch dak wil…

Er gaan ook berichten rond dat je eigenlijk een oud type moet kopen ‘voor weinig’ , bijvoorbeeld een 60 type uit 2016/2017 van ca. 30.000 Euro, als je er één kunt vinden,  en dan wel één met alle opties.  Zo’n type is niet erg populair met een bereik van maar net 300 kilometer.  Dan laat je er bij Tesla een nieuw 85 Kwh battery pack voor 17500 Euro in zetten, laat het begrenzen op 80 Kwh en je kan er nog minstens 15 jaar zonder problemen mee voort met een rijbereik van ruim 400 km.

Tesla Model S 60D 2016-2017

Maar ja- je koopt ook een 75D uit 2016 voor zo’n 40.000 Euro, dus wat maakt het allemaal uit eigenlijk.  Nou ja, omdat de accu het belangrijkste onderdeel van een elektrische wagen is, kun je technisch gezien beter een oude auto met een nieuwe accu hebben dan een wat nieuwere oude auto waarvan je niet weet hoe de accu er aan toe is.  De kans bestaat dat je dan alsnog een nieuwe accu moet kopen.

Er staan wat Youtube stories online van bedrijven waar battery packs van o.a. Tesla worden gerepareerd en daar vervangen ze een deel van de cellen of een deel van het batterypack, zodat je minder geld kwijt bent dan voor een geheel nieuw accu pack.

Inside a Tesla Model S Battery Case - YouTube
lege bodemplaat voor Tesla Model S batterypacks

Bij Tesla is de hele bodemplaat verwijderbaar, en daarin zitten de accu’s.  Op een autobrug kun je de auto eerst omhoog doen, poten onder de accu doen en dan de accu losschroeven van de wagen.  Vervolgens de wagen iets omhoog en het accupack met bodemplaat is eraf. Dan het pack op de accucar laten zakken, losmaken, de auto weer iets omhoog en je kan bodemplaat met accu’s naar de test- en reparatiebank rijden.

Tesla Battery Replacement Cost Explained

Eigenlijk kun je natuurlijk beter gelijk een ruil pack plaatsen, maar dat gaat alleen met hulp van Tesla lukken. Om een ruilsysteem op te zetten heb je vlottende voorraad nodig en met de huidige ontwikkelingen in acculand (en bij Tesla  zelf natuurlijk) is het maken van een oude accuvoorraad niet erg opportuun.  De nieuwe fosfaat accu’s zijn in China al volop in productie en door de massaproductie van de 8cm lange ronde cellen lijkt het er op dat we redelijk snel, zeg met 2 jaar, een hele andere techniek beschikbaar hebben met een lager prijskaartje en met minder gewicht dan nu met de Lithium -ion accu’s.

LFP-accu - Wikipedia
Voorbeeld van een LFP accu

Nu maar hopen dat deze techniek ook als ruiloptie beschikbaar komt!

3D scannen met de Creality CR-1 versus Openscan en Ciclop 3d scanners

Vergelijking 3d-DIY hobby scanners versus Creality CR-1 3d scanner

Eerder heb ik beide versie van de Openscan scanners en de ciclop scanner gebouwd en uitgebreid getest.  De openscan types zijn onderling erg verschillend maar gebruiken eenvoudige firmware met een Arduino of een Raspberry PI contoller.  De Ciclop is een eenvoudige 3d scanner met een draaiend plateau en een USB camera.

Openscan mini

De Openscan mini  maakt foto’s met de RPI camera en roteert de camera om het te scannen object.  Dat geeft gelijk de beperking aan, je kan alleen kleine objecten scannen.  Na het scannen moet je de gemaakte foto’s importeren in meshmaker of via de nieuwe gratis cloudoplossing van Openscan’s ontwikkelaar Thomas Megel.  De mini is volledig bestuurbaar via de web-based software die op de website van Thomas Megel is te downloaden, waar je ook gebruik kan maken van de upload- en verwerking van je foto’s kan doen en de 3d files vervolgens kan downloaden.

Openscan classic

De classic versie van de Openscan scanner kan grotere objecten aan en gebruikt een externe camera. Ik heb daar mijn Canon 5D Mark2 voor gebruikt, met een ringflitser.  Deze oplossing werkt aardig goed en gebruikt voor de verwerking en het renderen dezelfde software als de mini. In de losse Arduino-unit waarmee de rotors van de scanners worden bediend kun je het aantal stappen verticaal en horizontaal instellen en de foto’s van de camera moet je zelf overzetten naar een meshmaker-achtige verwerking om er een 3d beeld van de construeren.  Behoorlijk omslachtig maar het kan gratis en levert een behoorlijk goed werkbaar resultaat op. Mits je er wat tijd aan besteed.

Ciclop 3d scanner

De ciclop scanner werkt met een vast platform en zonder verticale beweging. Het lijkt qua werking erg op de Creality CR-1 scanner maar ik heb er nooit goede resultaten mee gehad.  Er zitten 2 rode diodelasers aan de zijkanten en 1 USB camera in het midden.  Het resultaat qua foto’s is prima, maar het gaat uiteindelijk om de rendering software en de verwerking van de gemaakte foto’s, net als bij de Openscan classis. en dat is voor de hobby omgeving gewoon naar mijn ervaring (nog) niet voldoende goed ontwikkeld bij deze ciclop 3d-scanner.

 

De Creality CR-1

Creality Upgraded CR-Scan 01 3D Scanner, Handheld/Auto scan Mode, No Marker Quick Scanning, 0.1mm Accuracy, 0.3-2m Scanning Range, 0.2mm Resolution, Professional Color 3D-Scanner for 3D Printer: Amazon.com: Industrial &amp; Scientific

Eind 2021 heb ik de Creality CR-1 scanner aangeschaft omdat ik een paar projecten aan zag komen waar een goede scanner van pas komt, en ik er geen extra tijd aan wil besteden.  Bovendien was ik erg nieuwsgierig naar de resultaten van deze ‘all-in one’ scan oplossing.

De gemaakte scans zijn erg bruikbaar, en de roterende plaat waarop je het object kan plaatsen werkt ook goed.

Mijn ervaring is dat het uit de hand scannen erg moeizaam gaat, en je moet alle delen van het te scannen object zorgvuldig scannen.  Dat betekent dat je zowel moet opletten wat je scant via het beeldscherm, waar je live de opbouw van je scan kan volgen, als wat je doet richting het object met de scanner in je hand.  Dat is vooral even wennen, na een paar scans gaat het al veel gemakkelijker.

Heel mooi is de manier waarop het bij deze scanner werkt: De live-view van de opgebouwde scan geeft je aan waar je nog beter moet scannen en als je iets bent vergeten scan je opnieuw en laat je de bijgeleverde stitch software er één samengevoegde scan van maken.  Dat werkt ook heel goed.

Wat heb je nodig naast de scanner: Het opslaan van de data gaat op je PC of laptop, het renderen gaat via een GPU, en de besturing en power voor rotating table en de scanner zelf gaat met een aparte PSU.

Het helpt wanneer je een snelle GPU hebt met behoorlijk wat memory.  Ik heb een 3600 GPU in een Thunderbolt3 externe casing aan mijn Dell XPS13 i7 hangen voor onderweg gebruik met 5 meter extension cords voor de scanner.  Dat werkt heel goed, maar eigenlijk is het scherm van 13 inch te klein voor dit werk.  Een extern scherm meesjouwen is geen optie dus moet ik het hier mee doen.  En de externe Thunderbolt casing is eigenlijk ook te groot om mee te nemen.

Een andere mogelijkheid zou zijn om een gaming laptop te gebruiken waar al een snelle GPU in zit, met een scherm van 17inch.  Misschien toch eens regelen, wanneer er meer werk voor onderweg aan komt.  Voorlopig maak ik vooral thuis/zakelijk gebruik van de scanners dus gebruik ik gewoon mijn hi-res 27 inch IIyama scherm aan de Thunderbolt / 3600 GPU, dat voldoet prima!

Update 4-2022: De snelle gaming laptop is er, met een RT3600 GPU ingebouwd, en een 17 inch scherm (full HD). Dit werkt fantastisch!

Ervaringen:  Deze scanner werkt geheel anders dan de Openscan versies.  De camera heeft meer afstand tot het te scannen object nodig en daardoor vergt de hele opzet meer ruimte. Ik heb er erg aan moeten wennen dat je ruim een meter rondom moet hebben om je object goed in beeld te hebben, ook bij kleine objecten.

Ik ga nog proberen om een voorzetlens of zoomlens te gebruiken, moet nog even checken welke fitting deze scanner voor de lens-naar sensor gebruikt.

 

Samenvatting en algemeen cijfer van 1-10:

De Openscan mini (7) werkt prima voor kleine objecten, is eenvoudig en goed in het gebruik met de web-based software en met de online rendering service.

De openscan classic (6) werkt goed maar vergt betrekkelijk veel instelwerk, kennis van en ervaring met de opzet an je kan dezelfde online rendering service van Thomas Megel gebruiken.

De Ciclop (3) is naar mijn mening te onvolwassen om serieus te gebruiken.

De Creality-CR1 (8) is een waardevolle professionele oplossing voor medium size projecten t/m grote projecten (10-200cm doorsnede), goede lokale interface via PC/Laptop met snelle processor en snelle moderne GPU.

Mamiya RZ67 camera+ Aptus leaf 65 achterwand + Phase One adapter Hasselblad V-mount

Onlangs heb ik wat extra geld apart gehouden om een oude droom in te vullen:

Een premium kwaliteit middenformaat camera met een digitale achterwand voor het  maken van geweldige architectuurfoto’s!  Dan kun je natuurlijk gelijk een digitale camera kopen, maar ik wil graag een systeem waarmee ik zowel digitaal als analoog kan werken.

Ik weet dat de Hasselblad/ Zenza Bronica/ Mamiya/ Phase One en sommige andere merken middenformaat camera’s geweldige resultaten kunnen produceren, en dat ze vooral gebruikt worden voor niet-bewegende of langzaam bewegende objecten.

Oorspronkelijk wilde ik een Hasselblad hybride camera met de geweldige 39Mpix digitale achterkant, die ook gewoon met 120 film werkt.

Maar mijn budget is beperkt dus ik moest mijn wensen aanpassen aan mijn budget, als je er tenminste ook nog wat lenzen bij wilt kopen.

Uiteindelijk ben ik uitgekomen op een set Mamiya RZ67’s, beide met een bekend probleem zodat ik van 2 niet goed werkende camera’s 1 werkende camera kon maken.

Ik heb de balg van de ene verwisseld met de andere camera, dus deze is nu in volledig werkende staat. de donor camera heeft ontspanner problemen. Ik zal de donorcamera later repareren. Ik heb de reparatiehandleiding voor de RZ67 camera gedownload en het is zeer goed gedocumenteerd in het Engels, inclusief foto’s en alles.

De handgreep van de donor camera (te zien op de bovenstaande foto) heeft nogal wat speling op de hendel en ik verwacht dat dit een van de belangrijkste problemen zal zijn dat moet worden opgelost. Uiteindelijk bleek dit niet de oplossing te zijn.  De veerspanning van artikel 7 uit het reparatiemanual bleek de boosdoener.  daardoor is de vergrendeling net niet sterk genoeg aan het eind van de spanbeweging.  Jammer genoeg zit dit onderdeel helemaal verborgen onder de prints van de camera, aan de kant waar de sluitertijdenknop zit, ook nog eens achter de balgbediening.  Ga ik later allemaal losmaken (solderen) en opknappen.  Overigens lijkt het er op dat 75% van de als AS-IS aangeboden RZ67’s dit probleem hebben.

De reparatie verliep zeer goed en binnen een tijdsbestek van 4 uur had ik 1 volledig werkende RZ67 camera en 1 donor camera met veel losse onderdelen, die ik zal repareren zodra ik de nieuwe balg heb ontvangen die ik bij AliExpress heb besteld voor 70 Euro.

De camera’s zijn afkomstig uit Japan, net als de meeste andere onderdelen, behalve de digitale achterkant die uit Scandinavië komt:

  • 4 lenzen (50mm, 110mm, 100-200mm en 250mm);
  • Een originele 1.4 x teleconverter;
  • Beide originele bedrade verlengbuizen voor macrofotografie;
  • Een Leaf Aptus 65 V-mount 28 Mpix digitale achterwand;
  • De benodigde adapterplaat van Phase One om de achterkant van de RZ67 om te zetten naar V-mount;
  • Plus een heleboel accessoires zoals een linker handgreep, een AE diafragma kijker die automatische belichting mogelijk maakt (Aperture prio-only waar de sluitertijd wordt geautomatiseerd) , riem diafragma kijker, film terug 60x70mm en ga zo maar door.

Ik heb de lenzen van ebay, en twee van hen hebben echt een inwendige reiniging nodig. degene die het beste werkt is de 250mm lens. Ik heb wat foto’s genomen vlak nadat alles op de camera was gemonteerd, door het raam thuis. Ik gebruikte de AE zoeker op automatisch, en stelde het diafragma in op 32 om de scherpste details te krijgen. De automatisch gegenereerde (en ingestelde) sluitertijd als de standenschakelaar van de AE-prismakijker op ‘A’ staat bij klaarlichte dag tegen een bewolkte hemel bleek ongeveer 1/15 seconde te zijn, wat vrij lang lijkt.  En de foto van de boomtakken met enkele vogels erop is prachtig gelukt!  Deze boom staat op ongeveer 30 meter van mijn huis, en de paar takken vullen het hele scherm, dus de telefotokracht van deze combinatie werkt erg goed. Deze eerste digitale foto die ik maakte met mijn RZ67 digitale kit en de 250mm Z- Mamiya lens is hieronder te zien:

Om deze foto naar JPEG te converteren heb ik eerst de .MOS file converter van Leaf gebruikt, dan moet je nog de plug-in van Windows hebben om de foto te kunnen bewerken in Photo editor van Windows. Dan kun je een kopie opslaan als JPEG. De hoeveelheid pixels klopt met de specs, het beeldformaat wordt na compressie naar JPEG ca. 4MB.

Een ander ding om te onderzoeken is dat de 50mm lens helemaal niet goed in focus komt. Alsof de voorkant van de camera niet dicht genoeg in de camera komt. De 250 mm werkt geweldig en de 100-200 is ook prima, omdat deze lens zijn eigen scherpstelring aan de voorkant van de barrel heeft.

Wat ik -nog- niet aan de praat kreeg is de ISO instelling. Als ik de ISO op de Aptus op 400 zet, herkent het AE systeem van de RZ67 dit niet, omdat ik overbelichte beelden krijg.  Ik heb dit aangepast door de belichtingscorrectie op de AE zoeker op +3 te zetten, waardoor ik OK foto’s krijg, maar dit lost mijn oorspronkelijke probleem niet op, aangezien ik wil dat het automatisch werkt. Ik wil deze instelling echt gebruiken, in plaats van te compenseren zodat de Aptus minder licht krijgt.  Ik werk hier nog aan.  Ik zal de elektrische uitgang van de adapter meten op de juiste pin voor het signaal te veranderen, zoals de analoge filmbacks doen wanneer je de ISO instellingen verandert.  Als het nodig is, kan ik een kleine schakelaar op de adapter aansluiten voor de ISO instellingen. Maar ik ben er zeker van dat het iets te maken heeft met instellingen in de Aptus 65, aangezien je bijna alles kunt configureren en ik nog steeds aan het uitzoeken ben wat ik moet instellen om dit goed te laten werken met de Phase One converter plaat.

De volledige opstelling ziet er als volgt uit, met de 100-200 mm zoomlens bevestigd:

Ik zal hier niet mee buiten rondlopen, want het gecombineerde gewicht is meer dan 4 kilo.  Gewoon te veel als je serieus iets wilt fotograferen dat ook maar enigszins goed is.

Dit wordt mijn studio-, macro-, en architectuurcamera omdat de geringe scherptediepte geweldige foto’s zal opleveren, zowel in zwart-wit als in kleur.

Misschien af en toe een commerciële fotosessie, ik denk dat het maken van een technische fabrieksfoto met deze cam/combinatie heel aardig zou kunnen uitpakken!

Compact Flash kaarten:  Ik heb een adapter van CF kaart naar SD kaart gebruikt die ik ook op mijn Canon 5D MarkII gebruik, en die accepteert alleen SD kaarten tot 32 GB.  Maar dat is OK.  Ik zal proberen om ook de wifi SD kaart in de CF adapter te installeren, die heb ik nog ergens liggen.  Dit wordt een nieuwe post.  De firmware van de Aptus heeft hier een wifi instelling voor, dus dat ga ik nog uitzoeken.

De digitale achterkant adapter voor de RZ67 camera is niet echt zichtbaar tussen camera en digitale achterkant, hieronder is een foto van degene die ik gebruik.  Dit type is algemeen verkrijgbaar, en maakt de koppeling van de camera naar een V-mount digitale back.  V-backs van Leaf of Phase one zijn zeer zeldzaam om aan te komen, omdat ze ofwel Mamiya fit (eigen vatting voor de 645 cams) of H-Hasselblad fit zijn.  En Hasselblads V-mounts digitale achterwanden zijn erg goed en vrij gemakkelijk te krijgen, maar ze zijn (naar mijn mening) erg duur door hun hoge kwaliteit en hoge pixel rates.

CROP FACTOR

De Mamiya Leaf Aptus 65 heeft een 44×33 mm sensor van bijna 29Mpix.  De Aptus is gemaakt voor de 6045 line-up en daarom hebben alle specs daarop betrekking, en niet op het 6×7 cm formaat van de RZ67.

Het maximale (theoretische) filmformaat op de RZ67 is 70x60mm.  Maar het beeldformaat met een 6×7 cm achterkant zal 56mm x 69.2mm zijn.

Hoewel, de meest gebruikte op de RZ camera zijn de 6070 film backs, hoewel een 60×60 ook beschikbaar is, maar moeilijk te krijgen voor een redelijke prijs.  De 6070 backs zijn die zonder maataanduiding aan de bovenkant.  Elke 6060 of 645 rug zal deze grootte op de buitenkant van de verpakking hebben.

De Aptus 65’s uitsnede van 1.3 wordt door Leaf gedefinieerd in relatie tot de middenformaat definitie en dit is theoretisch slechts 60x45mm, maar het wordt naar beneden bijgesteld, als gevolg van cutoffs en dergelijke.  60×45 cameraformaat wordt in middenformaat gemeten als 53,7×40,2mm.

Het middenformaat wordt dus in het algemeen gedefinieerd als 53,7×40,2 mm beeld- en sensorgrootte, en de oppervlakte is 21,59 cm2.

De sensor van de Aptus 65 is 33x44mm en de oppervlakte is ‘slechts’ 14,52 cm2.

De cropfactor van de Leaf Aptus 65 is 1,3 ten opzichte van middenformaat.

De full-frame sensor waarmee alle andere beeldsensoren worden vergeleken is 36×23,9 mm en de oppervlakte is 8,6 cm2.

Dus- zelfs het feit dat je niet de volledige breedte van het 6×7 cm bereik van het achterpaneel van de RZ67 zal gebruiken, de dekking van de sensor van de Aptus 65 verdubbelt bijna die van een full frame sensor.

De gebruikte tabel staat hieronder:

Ik ben trouwens nog steeds op zoek naar een Hasselblad camera (H-mount) met de CFV-39 digitale back aangezien deze de extreem goede Sony sensor van 49×36,7 mm heeft en geweldige specs en beeldresultaten.  Ik twijfel nog steeds om deze te kopen omdat de prijzen boven de 3000 Euro liggen, exclusief invoerrechten en BTW.  Dus- als je dit erbij optelt kost hij meer dan 4500 Euro. Exclusief lenzen dus.  Ik zoek er nog een binnen de EU, zodat ik geen extra kosten hoef te betalen voordat ik hem heb.

Maar waarschijnlijk houd ik het lekker bij de 28 Mpix Leaf Aptus 65, met de RZ67 camera.  Prima combinatie met de 4 lenzen die ik er bij heb!

 

V70 III 2022-01 Motorsteunen vervangen bij 340.000 kilometer

Bij het rijden over drempels hoorde ik een raar geluid, een soort aanlopen.

Na wat speurwerk heb ik alle 3 de motorsteunen vervangen.

Geen foto’s gemaakt omdat ik daar helemaal niet aan heb gedacht.

De grootste boosdoener is de best bereikbare motorsteun, aan de passagierszijde naast het blok.  Je kan er gemakkelijk van bovenaf bij.

Omdat de ruimte om deze steun heen erg vettig was, kon je goed zien dat deze steun lek was.  Het bovendeel lag gewoon op het onderste deel, terwijl er zo’n 2 cm verschil hoort te zijn.

 

Krik onder de auto, bokken onder de ophanging en daarna de krik onder de motor.  Ietsje omhoog en de steun verwijderen.  Nieuwe met threadlocker monteren en de motor iets naar voren duwen bij het monteren.

Dan de onderste vervangen, achter de motor aan de versnellingsbak.  Geen ingewikkelde klus.  gewoon de oude verwijderen en de nieuwe erin plaatsen.

Maar dan… De versnellingsbak zit aan het blok met een grote motorsteun, onder de accu.  Het verwijderen is echt wel een werkje, voordat je bij deze steun komt.

En het terugplaatsen van de accuplaat, accubak en alle delen die je eerst nog even los moet maken is samen met de demontage wel een klusje van zo’n 1  1/2 uur.

 

Na het vervangen even proefgereden en alles is weer helemaal OK!