Go Down

Topic: automatiseren generator (Read 6399 times) previous topic - next topic

robtillaart

Quote
ik ben maar een domme schipper

integendeel, je hebt een project bedacht en tot een goed einde gebracht waarbij je eea geleerd hebt.
En ja over een jaartje kijk je naar je code en zie je zo een twee drie dingen die je dan anders zou doen, en dat blijft ;)
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

JO3RI

Quote
U allen dank, by the way.

Zonder de proefsketch van Joeri3, en de opmerkingen van anderen had dit mij niet gelukt.


Heel graag gedaan.

Quote
Het is niet mijn vak, dat programmeren, ik ben maar een domme schipper, en van SDRAM heb ik nog nooit gehoord.


Net zoals robtillaart zegt: integendeel. Je hebt een probleem opgelost.

Over SDRAM: dat lijkt inderdaad niet makkelijk. Ik zal het zo eenvoudig mogelijk uitleggen.

Je hebt 3 soorten geheugen in onze Arduino's:

FLASHRAM, SDRAM, EEPROM.

FLASRAM is op een uno ongeveer 32KB en dient om je programma in TE BEWAREN (blijft erin staan ook als de stroom weg valt): binery sketch size : 16716 bytes (of a 32256 byte maximum)

SDRAM is op een uno 2KB en dient om het programma UIT TE VOEREN: het werkgeheugen (vergelijkbaar met de RAM uit een computer). Als je programma start, worden de variabelen in SDRAM geladen. Maar als je de stroom uitschakelt, is dit geheugen weer leeg.

bv byte knop1 = 15; gebruikt 1 byte uit het werkgeheugen (een byte kan een getal van 0 to 255 zijn)
bv client.print("<html><head></head><body>"); neemt 26 byte uit het werkgeheugen (tel ze maar eens op, dan weet je hoeveel je gebruikt)

EEPROM is op een uno 1KB (of 1024 bytes) en kan ook zonder stroom bewaren (vergelijkbaar met een harde schijf op een computer) je kan er dus dingen in opslaan die bewaard blijven ook als je de stroom uitschakelt.

Veel succes verder
http://www.JO3RI.be

Nederlandstalige sectie - http://arduino.cc/forum/index.php/board,77.0.html -

rikky

Nou, alles een beetje herschreven, en een nieuwe proefsketch gemaakt, voor de geinteresseerden.
Werkt op een proefbreadbordje.
Eerdaags hopelijk nieuwe updates.

Zoals gewoonlijk in 2 delen.

Code: [Select]

//Deze Werkt
//this program is in the public domain
// published 17 jan 2013 @ http://arduino.cc/forum/index.php/topic,141106.0.html

#include <SPI.h>
#include <Ethernet.h>
#define MaxHeaderLength 256    //maximum length of http header required

byte mac[] = {
 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address
byte ip[] = {
 192, 168, 1, 90 };   // static ip of Arduino
byte gateway[] = {
 192, 168, 0, 1 };  // gateway address
byte subnet[] = {
 255, 255, 255, 0 };  //subnet mask
EthernetServer server(80);   //web server port

String HttpHeader = String(MaxHeaderLength);
String Pagina = String(MaxHeaderLength);
String Dataregel = String(MaxHeaderLength);

int value = 0;  
int Pin = 0;
boolean Pressed = false;
boolean first_time = true;

//2 3 5 6 7 8 9

int knop = 0;       // dit wordt 2
int bedrijfsmagneet = 3;
int gloeispiraal =4;
int startmotor = 5;
int indicatie_led = 9;
int veiligheidsensor = A1;
int stroomsensor = A0;
int start_time = 8;
int gloei_time = 8;
boolean in_bedrijf = false;
boolean start = false;
boolean gloei = false;
boolean motorState = false;

//clock

#define MAX_MILLIS_VALUE 34359738
unsigned long current_millis_value = 0;
unsigned long previous_millis_value = 0;
unsigned long m = 0;
int seconds = 0;
int minutes = 0;
int hours = 0;
int days = 0;

int lastButtonState = HIGH;
long lastDebounceTime = 0;
long debounceDelay = 50;
boolean buttonState;

/*    SETUP   */

void setup(){
 //enable serial monitor
 Serial.begin(9600);
 //start Ethernet
 Ethernet.begin(mac, ip, gateway, subnet);
  //initialize variable
 
 HttpHeader="";
 Pagina="";
 Dataregel="";
 
 
 pinMode(knop, INPUT);
 pinMode(bedrijfsmagneet, OUTPUT);
 pinMode(gloeispiraal, OUTPUT);
 pinMode(startmotor, OUTPUT);
 pinMode(indicatie_led, OUTPUT);
 pinMode(veiligheidsensor, INPUT);
 pinMode(stroomsensor, INPUT);
 digitalWrite(knop, HIGH);

 digitalWrite(bedrijfsmagneet, LOW);
 digitalWrite(startmotor, LOW);
 digitalWrite(veiligheidsensor, HIGH);
 digitalWrite(stroomsensor, HIGH);
}

rikky

Code: [Select]

/*    LOOP     */

void loop(){

 // Create a client connection
 EthernetClient client = server.available();
 if (client) {
   while (client.connected()) {
     if (client.available()) {
        char c = client.read();
       
        //read MaxHeaderLength number of characters in the HTTP header
        //discard the rest until \n
        if (HttpHeader.length() < MaxHeaderLength){}
       
          //store characters to string
          HttpHeader = HttpHeader + c;
               
        //if HTTP request has ended
        if (c == '\n') {
   
          // start of web page
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          //client.println("<html><head></head><body>");
          client.println(); // haal dit weg, en het werkt niet meer, waarom???
          //client.println("Hela mundo");
          //client.println();

      zoek_pagina();
   
    if (Dataregel != ""){
       Data_afhandelen();
    }  

    if (Pagina == "/favicon.ico "){} //do nothing
     
    else {  
    if (Pagina == "/ "){
      hoofdpagina(client);
    }  
    else{  
    if (Pagina == "/sensors "){
      sensors(client);
    }
    else {
    if (Pagina == "/knoppen "){
      knoppen(client);}
     
    else {
    if (Pagina == "/knop_3 "){
      knop_3(client);}  
   
    else {niet_gevonden(client);
    }}}}
 
      //clearing strings for next read
      HttpHeader="";
      Pagina="";    
      Dataregel="";
     
   //stopping client
   delay(1);
   client.stop();
 
}}}}}

 if (motorState == true && digitalRead(stroomsensor) == HIGH)
 {gloei = false; start = false; in_bedrijf = false; motorState = false; clock_reset();}  //motor is uitgevallen
 if (motorState == true && digitalRead(veiligheidsensor) == LOW)
 {gloei = false; start = false; in_bedrijf = false; motorState = false; clock_reset();}  //veiligheidsensor is doorgeslagen naar massa

 clock();
 if (gloei == true && seconds >= gloei_time)
 {gloei = false; start = true; clock_reset();}
 if (start == true && seconds >= start_time)
 {start = false; in_bedrijf = false; clock_reset();}

 int reading = digitalRead(knop);
 if (reading != lastButtonState)
 { lastDebounceTime = millis();}
 if ((millis() - lastDebounceTime) > debounceDelay)
 {buttonState = reading;}
 lastButtonState = reading;
 
 digitalWrite(indicatie_led,buttonState);
 Serial.println(buttonState);
 
 if (buttonState == false && lastButtonState == true)
   {Pressed = true; delay(10);}
   
 if (Pressed == true)
    {if (in_bedrijf == true) {in_bedrijf = false; gloei = false; start = false; clock_reset();}
    else {in_bedrijf = true; gloei = true;}}
   
 if (buttonState == true && Pressed == false)     //wacht op loslaten knop
    {if (in_bedrijf == true)
      {if (digitalRead(stroomsensor) == LOW)
        {start = false; gloei = false; motorState = true; clock_reset();}
   }}
   
   digitalWrite(bedrijfsmagneet, in_bedrijf);
   digitalWrite(gloeispiraal, gloei);
   digitalWrite(startmotor, start);
   Pressed = false;
}

/*         CLOCK        */


void clock()

{ current_millis_value = millis();
 if (current_millis_value < previous_millis_value) // if millis overflows
 {
 m += MAX_MILLIS_VALUE - previous_millis_value + current_millis_value;
 }
 else // if millis has not overflown
 {
 m += current_millis_value - previous_millis_value;
 }
 if (m>999)
 {
   seconds++;
   m = m-1000;
   if (seconds>60) // if seconds == 60
 {
   seconds = 10;
   minutes++;
   }
    if (minutes>60) // if seconds == 60
 {
   minutes = 0;
   hours++;
   }
   if (hours>24) // if seconds == 60
 {
   hours = 0;
   days++;
   }
 
 }
 previous_millis_value = current_millis_value;
}

void clock_reset()
{
seconds = 0;
minutes = 0;
hours = 0;
days = 0;
}

rikky

Code: [Select]
[code]3 delen, ook goed.
[code]
/*         HOOFDPAGINA             */

void hoofdpagina(EthernetClient client){

      char myChar = 34; // appeltroff
     
       client.print("<html><head></head><body>");
       
       client.print("<iframe src=");
       client.print(myChar);
       client.print("./sensors");
       client.print(myChar);
       client.print(" height=");
       client.print(myChar);
       client.print("100");
       client.print(myChar);
       client.print(" frameborder=");
       client.print(myChar);
       client.print("0");
       client.print(myChar);
       client.print("></iframe>");
       client.print("<br>");
       
       client.print("<iframe src=");
       client.print(myChar);
       client.print("./knoppen");
       client.print(myChar);
       client.print(" height=");
       client.print(myChar);
       client.print("230");
       client.print(myChar);
       client.print(" frameborder=");
       client.print(myChar);
       client.print("0");
       client.print(myChar);
       client.print("></iframe>");
       client.print("<br>");
       
       client.print("<iframe src=");
       client.print(myChar);
       client.print("./knop_3");
       client.print(myChar);
       client.print(" height=");
       client.print(myChar);
       client.print("50");
       client.print(myChar);
       client.print(" frameborder=");
       client.print(myChar);
       client.print("0");
       client.print(myChar);
       client.print("></iframe>");
       client.print("<br>");
       
       client.print("</body></html>");
  }

/*           SENSORS              */
 
void sensors(EthernetClient client){

     char myChar = 34; // appeltroff
         client.print("<html><head>");
         client.print("<meta http-equiv=");
         client.print(myChar);
         client.print("refresh");
         client.print(myChar);
         client.print("content=");
         client.print(myChar);
         client.print("5");
         client.print(myChar);
         client.print("></head><body>");

          client.print("<br>");
          client.print("motor : ");
            if (digitalRead(stroomsensor)==LOW)
            {client.println("AAN");}
            else{client.println("UIT");}
           
          client.print("<br>");
          client.print("<br>");
          client.print("veiligheidssensor : ");
            if (digitalRead(veiligheidsensor)==LOW)
            {client.println("AAN");}
            else{client.println("UIT");}
           
          client.print("<br>");
          client.print("</body></html>");
  }

/*            KNOPPEN               */
 
void knoppen(EthernetClient client){

          client.print("<html><head></head><body>");
    /*      client.print("<form method=get>");
          client.print("<br>");
         
          for (int i=5; i < 10; i++){
             client.print("Pin ");client.print(i);
             client.print("<input type='radio' name=");
             client.print(i);client.print(" value='1' ");
             if (digitalRead(i)== 1) {client.print("checked=true ");}
             client.print("> aan     ");
             client.print("<input type='radio' name=");
             client.print(i);client.print(" value='0' ");          
             if (digitalRead(i)== 0) {client.print("checked=true ");}
             client.print("> uit<br>");              
             }  
             
          client.print("<br>");
          client.print("<br>");
          client.print("<input type=submit value=submit></form>");          
   */      
          client.println("Sorrie, niet beschikbaar");
          client.print("</body></html>");
         }

/*           KNOP 3              */

void knop_3(EthernetClient client){
 
     // Testknop,  fire at once
 
     if (first_time == true)
     {first_time = false;}
     else {Pressed = true;}
     clock_reset();
     char myChar = 34; // appeltroff
     client.print("<html><head></head><body>");
   
     client.print("Zet Generator AAN/UIT : ");
     client.print("<a href=");
     client.print(myChar);
     client.print("./knop_3");
     client.print(myChar);
     client.print(">PRESS");
     client.print("</a>");  
     }

/*            NOT FOUND              */
             
void niet_gevonden(EthernetClient client){

  client.print("<html><head></head><body>");
  client.print("<br>");
  client.print("Pagina niet gevonden");
  client.print("</body><html>");
  }

/*          DATA AFHANDELEN              */
 
void Data_afhandelen(){

    for(int i = 0;i <= Dataregel.length();i++){
     Pin=Dataregel.charAt(i)-48;;
     i++;i++;
     value=Dataregel.charAt(i)-48;
 
  digitalWrite(Pin,value);
 
  i++;//&
 
    }}

/*           ZOEK PAGINA           */
   
void zoek_pagina(){
         
             //zoek naar pagina's

         int index_start = HttpHeader.indexOf('/');
         int index_stop = HttpHeader.indexOf(' ',index_start);

        for (int i = index_start; i <= index_stop; i++){
        char c=  HttpHeader.charAt(i);
         Pagina =  Pagina + c;
        }
 
       if (Pagina.startsWith("/knoppen")) {  
       
         if (Pagina.length() > 9){
           if (Pagina.charAt(8) == '?'){
 
           int index_start = Pagina.indexOf('?');
           int index_stop = Pagina.indexOf(' ',index_start)-1;
   
           for (int i = index_start + 1; i <= index_stop; i++){
           char c=  Pagina.charAt(i);
           Dataregel =  Dataregel + c;
           }
 
           Pagina = "/knoppen ";
         
       }}}
       
       if (Pagina.startsWith("/knop_3")) {  
       
         if (Pagina.length() > 8){
           if (Pagina.charAt(7) == '?'){
     
           int index_start = Pagina.indexOf('?');
           int index_stop = Pagina.indexOf(' ',index_start)-1;
               
           for (int i = index_start + 1; i <= index_stop; i++){
           char c=  Pagina.charAt(i);
           Dataregel =  Dataregel + c;
           }

           Pagina = "/knop_3 ";
         
       }}}}  
 


[/code][/code]

rikky

Er zitten wat foutjes in, hier en daar, maar op een proefbordje werkt het.
Soms snap ik zelf niet waarom.


rikky

Het heeft eventje geduurd, maar het was dan ook wel erg koud de afgelopen tijd, dus als ik even tijd had, ging ik liever bij de kachel zitten.

Inmiddels zijn er nog wat bugs verwijderd.

In de praktijk uitgetest en werkend bewezen.

-Een tellertje toegevoegd voor de veiligheidsensor, omdat ie, af en toe wel eens zomaar doorslaat naar aarde, zonder aanwijsbare reden.

De stroomsensor, is een 5v adapter op de stroom, die door de generator wordt gemaakt, en die een 5V relaitje aanstuurt, die de sensorpin aan de grond sluit.

In feite zou de stroomsensor overbodig gemaakt kunnen worden, want de veiligheidsensor reageert zo snel, dat ook die als indicatie gebruikt zou kunnen worden, of de motor aan of uit staat.
Alleen wisselt ie nogal tussen hoog en laag, als ie start, dus dat is iets voor later.

Ik denk dat dit programma op vrijwel alle dieselmotoren gebruikt kan worden.
De meesten werken ongeveer vergelijkbaar.
Vandaar de update.

De ralais zijn van Tinkerkit, die weer een autorelais aansturen.
http://www.tinkerkit.com/relay/
Zelfbouw is namenlijk vooralsnog mislukt.

Ik zoek daar dus nog een betere oplossing voor, liefst met een MOSFET of PROFET, want ik had gelezen, in een echt papieren boek (ja,ja), dat die dingen erg klein zijn en je er heeele hoge stroomsterktes mee kan sturen, o.a.

Als iemand daar een link over weet, in combinatie met een Arduino, zou dat fijn zijn.

Arduino scetch en Fritzing scetch bijgesloten.

Go Up