Lcd pobleem. Soms geeft hij het goed weer en dan weer niet.

Beste

Ik heb een kist gemaakt met een SeeeDuino. Maar helaas werkt het soms nog niet zoals ik wil. Bij het voeden van de seeeduino springt de lcd soms niet op. Met andere woorden komt er dus geen tekst op. En soms doet hij het dan weer wel van de eerste keer.

Iemand enig idee hoe dit zou kunnen? Ik werkt met een I2C lcd scherm. Onderstaande links een filmpje en foto's.

Pic 1 bad ( Dropbox - Error - Simplify your life )

Pic 2 good ( Dropbox - Error - Simplify your life )

Heb je al geprobeerd om een delay van een paar seconden als eerste lijn in je setup routine te steken?

Mijn code ziet er als volgt uit. Deze op het internet gevonden die mag gebruikt worden voor gebruik.

#include <Keypad.h> //Library for the matrix keypad available from http://playground.arduino.cc/code/Keypad
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> //You must use F. Malpartida's new LCD library for Serial LCD https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home

 
#define I2C_ADDR    0x27  // Define I2C Address for the LCD. This varies by device, see the data sheet for yours
// Set up serial to parallel configuration for LCD
#define BACKLIGHT_PIN 3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
 

// define an LCD instance
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
// define keypad mapping
const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
// Define the Keymap. Note the position of # and * alter between models
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
 
// Connect keypad ROW0, ROW1, ROW2 and ROW3 (top to bottom) to these Arduino pins.
byte rowPins[ROWS] = { 
  9, 8, 7, 6 };
// Connect keypad COL0, COL1 and COL2 (left to right) to these Arduino pins.
byte colPins[COLS] = { 
  12, 11, 10 }; 
 
// Create the Keypad instance
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
 
void setup(){
   pinMode(4, OUTPUT); // pin for relais
   pinMode(3, OUTPUT); // pin for green LED
   pinMode(2, OUTPUT); // pin for red LED
   
   
   lcd.begin (16,2); // initialise LCD
   
 
   // Switch on the backlight
   lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
   lcd.setBacklight(HIGH);
   // clear the LCD
   lcd.clear();
   // move the cursor top left
   lcd.home();
   // print a message on the LCD to enter the code
   lcd.print("   ENTER CODE");
   lcd.setCursor(0, 1);
   lcd.print("");
   lcd.setCursor(0, 3);
}
 
void loop(){
 
  String mastercode = "1234"; // the password
  String enteredcode = ""; // the code you enter
  String reason = " INCORRECT CODE   "; // the default reason why entry failed
  // read a 6 digit code (you can have any length)
  for (int i = 0; i < 8; i++){
    char key = kpd.waitForKey();
 
    if(key != NO_KEY){ // if you aren't reading no keypress

      lcd.print("*"); // print a # to the LCD so people don't see the number but you know you pressed a button
      enteredcode += key; // append the keypress to the end of the entered code string
    }
  }
 
  if (enteredcode == mastercode) // if the code is correct
  {
    lcd.setCursor (0, 3);
    lcd.print("                ");
    lcd.setCursor (0, 1);
    lcd.print("  CODE CORRECT    "); // print a success message
    digitalWrite(3, HIGH); // turn on the green LED
    digitalWrite(4, HIGH); // turn on the relais
    delay (6000); // wait 3 seconds while the door is opened
    digitalWrite(3, LOW); // turn off the LED
    digitalWrite(4, LOW); // turn off the relais
    
    
    

    //reset the LCD for the next user
    lcd.clear();
    lcd.home();
    lcd.print("   ENTER CODE");
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
  }
  else {  // if the code is wrong or cancelled
    // tell the user what happened
    lcd.setCursor (0, 3);
    lcd.print("                    ");
    lcd.setCursor (0, 1);
    lcd.print(reason); // display the reason for failure. Incorrect code by default unless cancel is pressed
    digitalWrite(2, HIGH); // turn on the red LED
    delay (3000); // wait 3 seconds before allowing a retry
    digitalWrite(2, LOW); // turn off LED
    // reset the LCD for the next try
    lcd.clear();
    lcd.home();
    lcd.print("   ENTER CODE");
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 3);

 
  }
 
 
}

Het feit dat de software soms wel werkt is een indicatie dat de hardware kritisch is.

Stap 1 is dan altijd - cables controleren .
Is het gesoldeerd, of is het breadboard?

Op de engelse forum spreken ze dat het mss komt omdat ik gebruik maak van een relay.

Volgende ziet u hoe mijn Seeeduino is opgesteld aan de hand van een zelfgemaakt shield.

Een relay heeft een eigen voeding nodig, de Arduino kan per pin max 20mA leveren voor eventjes, lever 5mA of lager.
Een relay aansturen vraagt meer en kan al vrij snel de Arduino (deels) kapot maken.

google images : arduino relay => geeft veel plaatjes hoe het moet.

minimale onderdelen in het plaatje moeten zijn:
Arduino --[resistor] -- transistor -- relay. En over de relay polen een diode voor beveiliging,

zoals bv - http://www.ecs.umass.edu/ece/m5/images/relay_circuit_schematic_L.jpg -

Wat ik dan wel weer raar vind. Als ik de SeeeDuino voed met de usb van mijn laptop ondervind ik geen problemen. Wanneer ik een batterij ga gebruiken veroorzaakt hij dat de lcd niet direct zijn tekst laat verschijnen. Wel werkt mijn program als ik mijn code invoer.

Wat voor batterij?
bv een 9V blokbatterij kan niet zoveel stroom leveren als USB (typical 500mA)

12V batterij van 3,4 Amp

robtillaart:
Een relay heeft een eigen voeding nodig, de Arduino kan per pin max 20mA leveren voor eventjes, lever 5mA of lager.
Een relay aansturen vraagt meer en kan al vrij snel de Arduino (deels) kapot maken.

google images : arduino relay => geeft veel plaatjes hoe het moet.

minimale onderdelen in het plaatje moeten zijn:
Arduino --[resistor] -- transistor -- relay. En over de relay polen een diode voor beveiliging,

zoals bv - http://www.ecs.umass.edu/ece/m5/images/relay_circuit_schematic_L.jpg -

Dat had ik idd moeten doen. Maar momenteel vind ik nog geen problemen dat hij de uitgang opsmoort. Mocht het toch eens gebeuren zal ik de printplaat wel voorzien van dit erin zit om de uitgang zeker te besparen.

Hoi.

Dat is niet slim.
Waarom maak je hem nu niet gewoon zoals het hoort in plaats van wachten tot ie kapot gaat ?
Want dat zal zeker gebeuren.

Verder valt me op dat je meer dan genoeg draad hebt gebruikt, en die in lussen hebt gelegd.
Wellicht vind jij dat dat er netjes uitziet, dat kan ik begrijpen.
Maar zulke lussen zijn hele goede antennes, met name voor EM pulsen zoals die door je relais worden gemaakt.

Wat zijn die zwarte of metaalkleurige blokjes met rode en zwarte draad, naast het grijze styreen kastje waar je je controller boardje (omdat het geen Arduino is) en relais in hebt zitten ?

De kabel die je in het filmpje in je kast stopt, staat daar 230 volt op ?
Zo niet, gebruik dan een andere stekker.
En zo ja, dan mag je die 230 volt niet op de 25 polige sub-D stekker zetten (in geval je dat doet, niet alles is zichtbaar op de foto's), want das levensgevaarlijk.

Je code:
Je gaat eerst de LCD initialiseren, dan het lege scherm wissen, en dan de cursor op plaats 0,0 zetten.
Dat is allemaal niet nodig.
Als je het scherm initialiseert, dan word ie leeg en met de cursor op 0,0 opgeleverd.
Dat hoef je dan niet nog eens te herhalen.
Maar dit verklaart niet het probleem dat je nu waarneemt, alleen dat je een paar keer hetzelfde achter elkaar doet en dus wat tijd verspilt.

Indien je geen vrijloop diode op je spoel plaatst, dan is het eigenlijk een wonder dat alles goed verloopt.

Vele keren zal het werken, maar als het niet werkt:

Heb je een stabiele voeding? Met een zekere afvlakking?

Ik ga even van 0 moeten beginnen om alles uit te leggen zodat alles erg duidelijk word voor iedereen.

Ik heb dus een kist gemaakt die ik ga verstoppen voor geocache. Dat is een gps spel. De kist gaat dus verstopt liggen en spanningsloos tot dat iemand de kist voed met de bijhorende voeding die ook in de kist zal liggen. (Daarna zal de kist weer spanningsloos worden als hij de kist heeft geopent. Want hij moet de stekker weer op zijn plaats leggen voor de volgende geocacher.) Een 12V batterij die ook in een kistje zit met een stekker die normaal idd voor 230V dient maar in dit geval gebruikt kan worden omdat we nooit 230V erop kunnen aansluiten omdat we in een bos zitten.

De 2 grijze metalen behuizingen zijn 2 solenoid sloten die de kist toe houd. Bij een correcte code gaan deze in zodat je de kist kan openen. Deze worden gevoed daar de +12V van de batteij. De massa 0 hangt op de GND van de arduino

Eerlijk gezegt over de code schrijven ben ik nog niet zo sterk in. Ik heb deze gevonden op internet en wat aangepast.

Na nog wat testen uit te voeren vandaag kom ik op het volgende.

  • Als ik SeeeDuino aansluit op de usb van mijn laptop springt de LCD mooi op zoals ik het wil. Ter info: in dit geval kan ik de code invoeren en de relais zal schakelen. Want er zal geen + voeding naar de solenoid sloten lopen. Dit omdat mijn shield zo is opgebouwd.

  • Gebruik ik een 9V blok batterij op de stekker die voorzien is op de SeeeDuino start deze ook meteen mooi op zoals het hoord te zijn. (in dit geval mag ik de code niet invoeren omdat mijn batterij van 9v maar 120mA heeft. Want op deze manier gaat er een +9 naar mijn solenoid sloten.

  • Maar vanaf ik een 12V batterij aansluit gaat het mis. Dan springt de lcd wel op maar dan komt er geen tekst. Als ik paar keer de stekker dan in en uit trek dan gaat het soms weer wel.

Om te verkomen dat mijn SeeeDuino stuk gaat door de relais zal ik een nieuwe shield ontwerpen zoals het hoord te zijn.

Ook wil ik even vermelden. De relay gaat enkel actief zijn wanneer de code goed in getikt. Dus de relay is niet actief bij het koppelen van de 12V stekker.

Ik kan je niet meer helpen dan de voorgaande posten doen. Maar wou even zeggen dat je een super vette Geocache aan het bouwen bent! Als je hem verstopt hebt zou ik graag je GC code hebben om hem te kunnen liken en als ie in de buurt ligt wil ik hem graag loggen!

Succes!

Hoi.

Zorg er voor dat bij het nieuwe ontwerp van je shield, de voeding van het relais en de solenoids rechtstreeks van de accu komt, en niet van de SeeeDuino word gehaald.
Zorg er ook voor dat de voeding van je SeeeDuino van een goede condensator voorziet, misschien eerst een diode en dan die condensator.
De voeding komt dan dus binnen op je shield en word dan naar je SeeeDuino door gelust.
Daarmee verminder je instabiliteit in de voeding.

Je laatste beschrijving geeft wat inzicht in je probleem.
Want je zegt (indirect) dat wanneer je de solenoids gebruikt, het fout gaat.
Die solenoids (die elektronisch gezien hetzelfde zijn als een relais), krijgen die altijd stroom en word dat door het relais onderbroken ?
Zo ja, dan is de vraag hoeveel stroom (dus Ampères) er gebruikt word.

Het zou me niets verbazen als de schakeling tilt gaat door inducite pulse..... m.a.w. alle relais, en ander inductieve elementen gewoon afblussen met een Ultra fast diode. En als het stevige inductors zijn.... ook gewoon stevige diodes....

MAS3:
Hoi.

Zorg er voor dat bij het nieuwe ontwerp van je shield, de voeding van het relais en de solenoids rechtstreeks van de accu komt, en niet van de SeeeDuino word gehaald.
Zorg er ook voor dat de voeding van je SeeeDuino van een goede condensator voorziet, misschien eerst een diode en dan die condensator.
De voeding komt dan dus binnen op je shield en word dan naar je SeeeDuino door gelust.
Daarmee verminder je instabiliteit in de voeding.

Je laatste beschrijving geeft wat inzicht in je probleem.
Want je zegt (indirect) dat wanneer je de solenoids gebruikt, het fout gaat.
Die solenoids (die elektronisch gezien hetzelfde zijn als een relais), krijgen die altijd stroom en word dat door het relais onderbroken ?
Zo ja, dan is de vraag hoeveel stroom (dus Ampères) er gebruikt word.

Het gaat fout bij het koppelen van een 12V batterij. Er is daarna nog geen spraken dat de relais of solenoid sloten bekrachtigd worden.

De kleine blauwe relais krijgt een 0v van de seeeduino en een puls van uitgang 4 bij invoeren van een code. Als deze in is, worden pas de sloten bekrachtigd.

De sloten worden bekrachtigd door de 0v van de seeeduino en +12v die door het open contact gaat van de relais. Want apart een 0 voeding aansluiten van de batterij op de solenoid sloten heeft geen zin vertelden ze mij. Omdat je anders met een zwevend potententiaal zit. 0V is 0V of ben ik verkeerd?

Zie de opmerking die aan elk van mijn antwoorden staan; de GND's oftewel nul moeten allemaal aan elkaar.
Daar zijn wel uitzonderingen op, maar over het algemeen is dit zo.

In je antwoord hierboven zeg je dat er een puls uit pin 4 komt, maar ik denk dat je bedoelt een plus.
Je code vertelt dat beiden waar is, een positieve puls van 6 (dus geen 3) seconden.

Over het algemeen worden relais en die solenoids aangesloten op de positieve voeding, en word de GND geschakeld.
Voor de solenoids die via het relais gaan maakt dat niet zoveel uit.
Maar een controller zoals die in de Arduino zit schijnt beter te kunnen "sinken" (met GND verbinden) als te kunnen "sourcen" (met de plus verbinden).

Maar ook dit maakt niet erg veel uit voor je probleem.

Luister eens heel goed wat er gebeurt als je de voeding er op zet (doe de deksel dan even open om het beter te horen).
Eventueel dat inschakelen tijdelijk via een schakelaar doen.
Hoor je misschien tijdens het opstarten het relais en misschien de solenoids heel even inkomen ?
Als je dat kunt waarnemen, dan is dat zeer waarschijnlijk een indicatie van de oorzaak van je probleem.
Ik zie namelijk in je code dat je voor je LEDs en het relais de pins als uitgang instelt.
Maar verder doe je er nog even niets mee.
Onmiddellijk daarna ga je je LCD initialiseren.

Probeer eens om eerst de uitgangen in te stellen, dan de uitgangen in de goede stand te zetten (LOW).
Dan nog een heel kort stukkie wachten (delay (100)), om in het geval je voeding toch heel even belast werd door het relais / de solenoids, die voeding tijd te even om te stabiliseren.
En dan je LCD initialiseren.

Je merkt hier niet veel van (een vertraging van 0,1 seconden tijdens het starten), maar het vergroot de kans dat het wel goed gaat.

Inderdaad, zoals anderen ook al riepen:
Relais via transistor, maar ook zeer zeker een zogenaamde blusdiode toepassen.
Dat geldt ook voor de solenoids, ook al heb je dat via een relais gescheiden.
Als er namelijk een weg voor de vrijkomende energie beschikbaar is, dan hoeft die energie niet een eigen weg te zoeken, waarmee storingen veroorzaakt worden.

Ik ga het straks zeker eens nakijken! Alvast bedankt. De nodige zctie die ik moet ondernemen zal ik nog dien zodat ik mijn uitgang niet stuk maak.

Ook ga ik eerlijk zijn. Ik heb nooit elektronica gestudeerd maar ik doe mijn best om een leuke geocache te maken met een seeeduino.

Ook programmeren heb ik geen kennis van. Als u mij eventueel kunt helpen met herschrijven van de code zoals jij aangeeft met een delay enz...

Hier ook even mijn schema hoe de printplaat ineen zit.