OK, lite teori:
Om man matar in ström i en ingång på en µC med CMOS-teknologi (nära nog alla) och spänningen överstiger spänningsmatningen finns det stor risk att den går i
latch-up vilket med mycket stor sannolikhet förstör µC'n.
Alla pinnar man drar till/från en µC bör man skydda, just av den orsak. I mitt fall betyder att jag
alltid har något buffersteg mellan om en ledning lämnar kretskortet.
Störningar kan också leta sig in och ställa till många problem.
Din optokopplar-lösning fungerar inte - men kan göra det med ett par minimala ändringar.
En ingång på en µC har extrem hög impedans, man kan på vissa ställa in att det ska aktiveras en intern pull-up eller pull-down men normalt ska man ha en pull-up/down med i det hela.
Här räknar vi med en pull-up som alltså ska sitta mellan Arduino VDD och kollektorn på optokopplaren.
Det det motstånd gör är att när optokopplaren inte aktiveras drar den portpinnen till VDD men när optokopplaren aktiveras drar den portpinnnen till GND då fototransistorn drar "mycket" mer ström än motståndet kan ge. Alltså ska motståndet ha lagom värde, 10k - 47k blir oftast bra.
Vid att använda µC VDD kan det inte heller komma in någon spänning som kan utlösa latch-up.
Sedan är det LED-delen av optokopplaren. Den ska strömbegränsas som alla andra LED, alltså ett motstånd med i ekvationen. Det ska sitta i serie med LED'n och vara på runt 2,7k. Det ger en aktiveringsström på ~3,7mA vilket borde räcka långt.