Pages: 1 [2]   Go Down
Author Topic: Cheese cave control  (Read 1685 times)
0 Members and 1 Guest are viewing this topic.
Montana
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

WOW! Everything is working now. I even have a if else statement comparing the actual t/h to the set points and depending on the result it sends a digital high/low to the SSR (for the time being a LED). The only last thing is to work on the high/low for the fridge. Pito, you said fuzzy logic is commonly used in this case. I'm not very familiar with this application, do you have an example?

Code:
/*
 * Measure humidity and temperature with a DHT11 every 2 seconds,
 * references two potentiometers for set-point values to control
 * two SSR that will drive a refrigerator and a humidifier,
 * and output the readings on the serial port, and a 16x2 LCD panel.
 *
 *
 * Originally based on the DHT11 example code from http://www.dfrobot.com/wiki/index.php?title=DHT11_Temperature_and_Humidity_Sensor_(SKU:_DFR0067) (unknown license)
 * and the LCD 16x2 tutorial/example code from http://www.arduino.cc/en/Tutorial/LiquidCrystal (Public Domain)
 * Furthere based on Johan Herland <johan@herland.net> DHT 11, LCD code
 */

#include <LiquidCrystal.h>


// Initialize LCD library with the numbers of the interface pins
LiquidCrystal lcd(11, NULL, 12, 7, 8, 9, 10);

// DHT11 signal pin is connected to this analog port
const unsigned int DHT11_PIN = 0;

// Current datagram from DHT11 (2B humidity, 2B temperature, 1B checksum)
byte dht11_dat[5];

int cur_minute;
int humd_sum;
int temp_sum;
int nsamples;
int humd_set = A1;
int temp_set = A2;
int h_tobe = map(humd_set, 0, 1023, 50, 100);  //  convert to 50-100% humidity
int t_tobe = map(temp_set, 0, 1023, 40, 80);   //  convert to 40-80degF
int HumSSR = 2;
int TemSSR = 3;
int humidity = dht11_dat[0];
int temperature = dht11_dat[2];


void setup()
{
  // Set DHT11 port as output port with initial value '1'
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);

  // Initialize serial port
  Serial.begin(9600);
  Serial.println("Ready");

  // Set up 16x2 LCD panel
  lcd.begin(16, 2);


  cur_minute = millis() / 60000;
  humd_sum = 0;
  temp_sum = 0;
  nsamples = 0;
  humd_set = 0;
  temp_set = 0;
  h_tobe   = 0;
  t_tobe   = 0;
}


byte read_dht11_dat()
{
  byte i = 0;
  byte result = 0;
  for (i = 0; i < 8; i++) {
    // wait forever until analog input port 0 is '1'
    // (NOTICE: PINC reads all the analog input ports
    // and _BV(X) is the macro operation which pull up
    // positon 'X' to '1' and the rest positions to '0'.
    // It is equivalent to 1 << X.)
    while(!(PINC & _BV(DHT11_PIN)));
    // if analog input port 0 is still '1' after 30 us
    // this position is 1.
    delayMicroseconds(30);
    if(PINC & _BV(DHT11_PIN))
      result |= (1 << (7 - i));
    // wait '1' finish
    while((PINC & _BV(DHT11_PIN)));
  }
  return result;
}


boolean acquire_dht11_sample()
{
  byte dht11_in;
  byte i; // start condition

  PORTC &= ~_BV(DHT11_PIN); // 1. pull-down i/o pin for 18ms
  delay(18);
  PORTC |= _BV(DHT11_PIN);  // 2. pull-up i/o pin for 40ms
  delayMicroseconds(1);
  DDRC &= ~_BV(DHT11_PIN);  // let analog port 0 be input port
  delayMicroseconds(40);

  dht11_in = PINC & _BV(DHT11_PIN); // read only the input port 0
  if (dht11_in) {
    // wait for DHT response signal: LOW
    Serial.println("dht11 start condition 1 not met");
    delay(1000);
    return false;
  }
  delayMicroseconds(80);
  dht11_in = PINC & _BV(DHT11_PIN);
  if (!dht11_in) {
    // wait for second response signal: HIGH
    Serial.println("dht11 start condition 2 not met");
    return false;
  }

  delayMicroseconds(80); // now ready for data reception
  // receive 40 bits data. Details are described in datasheet
  for (i = 0; i < 5; i++)
    dht11_dat[i] = read_dht11_dat();

  // set DHT11 port to output value '1', after data is received
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);

  // verify checksum
  byte dht11_check_sum =
    dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3];
  if (dht11_dat[4] != dht11_check_sum)
    Serial.println("DHT11 checksum error");

  return true;
}


boolean update_avg(int minutes)
{
  nsamples += 1;
  humd_sum += dht11_dat[0];
  temp_sum += dht11_dat[2];

  if (minutes == cur_minute)
    return false;

  cur_minute = minutes;
  nsamples = 0;
  humd_sum = 0;
  temp_sum = 0;
  return true;
}


void serial_output(unsigned long runtime, boolean updated)
{
  // report humidity and temperature on serial port
  Serial.print("Current runtime/humidity/temperature: ");
  Serial.print(runtime);
  Serial.print(" ms, ");
  Serial.print(dht11_dat[0], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[1], DEC);
  Serial.print(" %, ");
  Serial.print(dht11_dat[2], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[3], DEC);
  Serial.println(" C");
  Serial.print(analogRead (A1));
  Serial.print(" ");
  Serial.print(analogRead (A2));
  Serial.print(" ");
  if (updated) {
    Serial.print("Average humidity/temperature last minute: ");

    Serial.print("%, ");

    Serial.println("C");
  }
}


void lcd_output(int minutes, int seconds)
{
  byte humidity = dht11_dat[0];
  byte temperature = dht11_dat[2];

  // print humidity on lcd
  lcd.setCursor(0, 0);
  lcd.print("Humd:");
  if (humidity < 10)
    lcd.print(" ");
  lcd.print(humidity);
  lcd.print("% SET:");

  // print Set Point humidity
  lcd.print(h_tobe);
  lcd.print("%");
  /*
// print runtime on lcd
    if (minutes < 100) {
    lcd.print(" ");
    if (minutes < 10)
    lcd.print(0);
    }
    lcd.print(minutes);
    lcd.print(":");
    if (seconds < 10)
    lcd.print(0);
    lcd.print(seconds);
   */

  // print temperature on lcd
  lcd.setCursor(0, 1);
  lcd.print("Temp:");
  if (temperature < 10)
    lcd.print(" ");
  lcd.print(temperature);
  lcd.print("C SET:");

  // print Set Point temperature
  lcd.print(t_tobe);
  lcd.print("C");
}

void loop()
{

  humd_set = analogRead(A1);
  temp_set = analogRead(A2);

  h_tobe = map(humd_set, 0, 1023, 0, 100);  //  convert to 0-100% humidity
  t_tobe = map(temp_set, 0, 1023, 0, 80);   //  convert to 0-80degF

  acquire_dht11_sample();
   

  unsigned long runtime = millis();
  unsigned long minutes = runtime / 60000;
  unsigned long seconds = (runtime / 1000) % 60;

  boolean updated = update_avg(minutes);

  serial_output(runtime, updated);

  lcd_output(minutes, seconds);

  if (dht11_dat[0] < h_tobe)
  {
      digitalWrite(HumSSR, HIGH);
  }
  else
  {
      digitalWrite(HumSSR, LOW);
  }

  if (dht11_dat[2] > t_tobe)
  {
      digitalWrite(TemSSR, HIGH);
  }
  else
  {
      digitalWrite(TemSSR, LOW);
  }
    if (updated)


      // wait 2 seconds until next reading
      delay(2000);

}

Logged

Matt

New Jersey
Offline Offline
Faraday Member
**
Karma: 65
Posts: 3643
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
The only last thing is to work on the high/low for the fridge.

You can use exactly the same method as you did for the humidity, at least to start with.
Logged

Montana
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

.[/quote]

You can use exactly the same method as you did for the humidity, at least to start with.
[/quote]

I have the fridge on a simple on/off scheme. I need to ensure that the switching doesn't harm the fridge. Can I just have the fridge over cool the set point by a few degrees and turn on a few degrees above the set point?
Logged

Matt

Rapa Nui
Offline Offline
Edison Member
*
Karma: 60
Posts: 2066
Pukao hats cleaning services
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Pito, you said fuzzy logic is commonly used in this case. I'm not very familiar with this application, do you have an example?
I am afraid I do not. There are papers on the web available..

You do not have the hysteresis built in. So near a setpoint it could switch on/off erratically.

Let say your hysteresis at temperature will be 4 degF.

So you want to:
1. switch the fridge on when t_asis is 2degF higher than the t_tobe, and
2. you switch the fridge off when t_asis is 2 deg lower that t_tobe.. Or something like that smiley

I would strongly recommend you to use variables with meaningfull names, ie. instead of "dht11_dat.." do use "t_asis"..

Code:
...
  int t_hhyst = 2;    // hyst = 4degF - you need to experiment with proper value
  int h_hhyst = 2;    // hyst = 4% - you need to experiment with proper value

 // *****   humidifier on/off with hysteresis:
 if (h_asis < (h_tobe - h_hhyst)) {
digitalWrite(HumSSR, HIGH);    // humidifier ON
//humid_led = ON;
}
 if (h_asis > (h_tobe + h_hhyst)) {
digitalWrite(HumSSR, LOW);     // humidifier OFF
//humid_led = OFF;
}
 // *****

 // *****   fridge on/off with hysteresis:
 if (t_asis > (t_tobe + t_hhyst)) {
digitalWrite(TemSSR, HIGH);    // fridge ON
//fridge_led = ON;
}
 if (t_asis < (t_tobe - t_hhyst)) {
digitalWrite(TemSSR, LOW);     // fridge OFF
//fridge_led = OFF;
}
 // *****
...

That will switch on/off around the tobe setpoints in a "controlled manner" - a kind of oscillations between the hysteresis margins. The average value will be the tobe.
No warranties of any kind smiley
http://forum.arduino.cc/index.php?topic=76820.0


* hysttemp.jpg (7.68 KB, 279x218 - viewed 23 times.)
« Last Edit: May 30, 2013, 05:15:24 am by pito » Logged

Rapa Nui
Offline Offline
Edison Member
*
Karma: 60
Posts: 2066
Pukao hats cleaning services
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
I need to ensure that the switching doesn't harm the fridge.
That is not an easy job. The issues you might to face (that is what we like) smiley :

1. the t_tobe and h_tobe values may jump maybe +/-3 when the adc conversion is not fixed properly (hw or sw-wise). The same with t-asis and h_asis.

2. when the arduino crashes/hangs or you interrupt/stop the control loop somehow, the fridge and/or the humidifier may stay on or off permanently

3. the current delay (2000) may switch on/off the fridge and humidifier each 2 seconds worst case (when the fridge and humidifier have enough power to change the physical conditions in the cave fast). Therefore I suggested you on certain Step to investigate how fast those systems react on a change. Based on that you may set the delay accordingly (so to minimize the switching on/off).

4. the fridge and humidifier may not switch off worst case (when the fridge and humidifier do not have enough power to change the physical conditions in the cave). So you have to check whether the fridge and humidifier have enough power to meet your preset tobe values (within your ranges of interest), with some safety margin..

Good luck..

« Last Edit: May 30, 2013, 05:19:26 am by pito » Logged

New Jersey
Offline Offline
Faraday Member
**
Karma: 65
Posts: 3643
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have the fridge on a simple on/off scheme. I need to ensure that the switching doesn't harm the fridge. Can I just have the fridge over cool the set point by a few degrees and turn on a few degrees above the set point?
That will do it. For a bit of extra insurance, you could note the time when you turn the fridge off using millis and leave the fridge alone, whatever the temperature suggests until some period of time has passed.
Logged

Montana
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Everything works great! The hysteresis is perfect, just need to field test this baby and find the perfect values.  I added some notes and clarified a few variables. This a fantastic sketch. Thank you very much for your assistance and guidance. Here is the working sketch that i will start use on the cheese cave once i stuff it in a box.
Code:
/*
 * Measure humidity and temperature with a DHT11 every 2 seconds,
 * references two potentiometers for set-point values to control
 * two SSR that will drive a refrigerator and a humidifier,
 * and output the readings on the serial port, and a 16x2 LCD panel.
 *
 *
 * Originally based on the DHT11 example code from http://www.dfrobot.com/wiki/index.php?title=DHT11_Temperature_and_Humidity_Sensor_(SKU:_DFR0067) (unknown license)
 * and the LCD 16x2 tutorial/example code from http://www.arduino.cc/en/Tutorial/LiquidCrystal (Public Domain)
 * Furthere based on Johan Herland <johan@herland.net> DHT 11, LCD code
 * Completely ruined by Matt Moore <mdmoore00@hotmail.com> with thanks to Pito and WildBill.
 */

#include <LiquidCrystal.h>
#include <EEPROM.h>

// Initialize LCD library with the numbers of the interface pins
LiquidCrystal lcd(11, NULL, 12, 7, 8, 9, 10);

// DHT11 signal pin is connected to this analog port
const unsigned int DHT11_PIN = 0;

// EEPROM size (1024 bytes on ATmega328)
const unsigned int EEPROM_SIZE = 1024;

// Current datagram from DHT11 (2B humidity, 2B temperature, 1B checksum)
byte dht11_dat[5];

int cur_minute;               // Used in serial output averaging
int humd_sum;                 // Used in serial output data
int temp_sum;                 // Used in serial output data
int nsamples;                 // Used in serial output averaging
int humd_set = A1;            // Potentiometer value read from analog pin A1 to set humidity
int temp_set = A2;            // Potentiometer value read from analog pin A1 to set temperature
int h_tobe;                   // Mapped value from converting pot value to humidity scale
int t_tobe;                   // Mapped value from converting pot value to temperature scale
int HumSSR = 2;               // Digital pin for Solid State Relay driving the humidifier
int TemSSR = 3;               // Digital pin for Solid State Relay driving the refrigerator
int h_actual = dht11_dat[0];  // Actual humidity value as read by DHT 11 sensor
int t_actual = dht11_dat[2];  // Actual temperature vvalue as read by DHT 11 sensor
int t_hhyst = 2;              // hyst = 4degF - you need to experiment with proper value
int h_hhyst = 2;              // hyst = 4% - you need to experiment with proper value
unsigned int eeprom_addr;     // EEPROM crap

void setup()
{
  // Set DHT11 port as output port with initial value '1'
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);

  // Initialize serial port
  Serial.begin(9600);
  Serial.println("Ready");

  // Set up 16x2 LCD panel
  lcd.begin(16, 2);
 
// Dump EEPROM to serial port
lcd.setCursor(0, 0);
lcd.print("Dumping EEPROM  ");
lcd.setCursor(0, 1);
lcd.print("to serial port..");
Serial.println("EEPROM dump start");
int i, j;
byte b = 0;
for (i = 0; i < EEPROM_SIZE; i += 0x10) {
Serial.print(i, HEX);
Serial.print(":");
for (j = 0; j < 0x10; j++) {
if (j % 2 == 0)
Serial.print(" ");
else
Serial.print("/");
b = EEPROM.read(i + j);
if (b == 0xff)
break;
Serial.print((float)b / 4.0);
}
Serial.println();
lcd.setCursor(15, 1);
if (i % 0x80 >= 0x40)
lcd.print(".");
else
lcd.print(" ");
if (b == 0xff)
break;
}
Serial.println("EEPROM dump end");

  cur_minute = millis() / 60000;
  humd_sum = 0;
  temp_sum = 0;
  nsamples = 0;
  humd_set = 0;
  temp_set = 0;
  h_tobe   = 0;
  t_tobe   = 0;
}


byte read_dht11_dat()
{
  byte i = 0;
  byte result = 0;
  for (i = 0; i < 8; i++) {
    // wait forever until analog input port 0 is '1'
    // (NOTICE: PINC reads all the analog input ports
    // and _BV(X) is the macro operation which pull up
    // positon 'X' to '1' and the rest positions to '0'.
    // It is equivalent to 1 << X.)
    while(!(PINC & _BV(DHT11_PIN)));
    // if analog input port 0 is still '1' after 30 us
    // this position is 1.
    delayMicroseconds(30);
    if(PINC & _BV(DHT11_PIN))
      result |= (1 << (7 - i));
    // wait '1' finish
    while((PINC & _BV(DHT11_PIN)));
  }
  return result;
}


boolean acquire_dht11_sample()
{
  byte dht11_in;
  byte i; // start condition

  PORTC &= ~_BV(DHT11_PIN); // 1. pull-down i/o pin for 18ms
  delay(18);
  PORTC |= _BV(DHT11_PIN);  // 2. pull-up i/o pin for 40ms
  delayMicroseconds(1);
  DDRC &= ~_BV(DHT11_PIN);  // let analog port 0 be input port
  delayMicroseconds(40);

  dht11_in = PINC & _BV(DHT11_PIN); // read only the input port 0
  if (dht11_in) {
    // wait for DHT response signal: LOW
    Serial.println("dht11 start condition 1 not met");
    delay(1000);
    return false;
  }
  delayMicroseconds(80);
  dht11_in = PINC & _BV(DHT11_PIN);
  if (!dht11_in) {
    // wait for second response signal: HIGH
    Serial.println("dht11 start condition 2 not met");
    return false;
  }

  delayMicroseconds(80); // now ready for data reception
  // receive 40 bits data. Details are described in datasheet
  for (i = 0; i < 5; i++)
    dht11_dat[i] = read_dht11_dat();

  // set DHT11 port to output value '1', after data is received
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);

  // verify checksum
  byte dht11_check_sum =
    dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3];
  if (dht11_dat[4] != dht11_check_sum)
    Serial.println("DHT11 checksum error");

  return true;
}


boolean update_avg(int minutes)
{
  nsamples += 1;
  humd_sum += dht11_dat[0];
  temp_sum += dht11_dat[2];

  if (minutes == cur_minute)
    return false;

  cur_minute = minutes;
  nsamples = 0;
  humd_sum = 0;
  temp_sum = 0;
  return true;
}


void serial_output(unsigned long runtime, boolean updated)
{
  // report humidity and temperature on serial port
  Serial.print("Current runtime/humidity/temperature: ");
  Serial.print(runtime);
  Serial.print(" ms, ");
  Serial.print(dht11_dat[0], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[1], DEC);
  Serial.print(" %, ");
  Serial.print(dht11_dat[2], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[3], DEC);
  Serial.println(" C");
 
  if (updated) {
    Serial.print("Average humidity/temperature last minute: ");

    Serial.print("%, ");

    Serial.println("C");
  }
}


void lcd_output(int minutes, int seconds)
{
  byte h_actual = dht11_dat[0];
  byte t_actual = dht11_dat[2];

  // print humidity on lcd
  lcd.setCursor(0, 0);
  lcd.print("Humd:");
  if (h_actual < 10)
    lcd.print(" ");
  lcd.print(h_actual);
  lcd.print("% SET:");

  // print Set Point humidity
  lcd.print(h_tobe);
  lcd.print("%");
  /*
// print runtime on lcd
    if (minutes < 100) {
    lcd.print(" ");
    if (minutes < 10)
    lcd.print(0);
    }
    lcd.print(minutes);
    lcd.print(":");
    if (seconds < 10)
    lcd.print(0);
    lcd.print(seconds);
   */

  // print temperature on lcd
  lcd.setCursor(0, 1);
  lcd.print("Temp:");
  if (t_actual < 10)
    lcd.print(" ");
  lcd.print(t_actual);
  lcd.print("C SET:");

  // print Set Point temperature
  lcd.print(t_tobe);
  lcd.print("C");
}

void log_to_eeprom()
{
eeprom_addr %= EEPROM_SIZE;
}

void loop()
{
            // For some reason this needs to be here...
  int h_actual = dht11_dat[0];  // Actual humidity value as read by DHT 11 sensor
  int t_actual = dht11_dat[2];  // Actual temperature vvalue as read by DHT 11 sensor

 
  humd_set = analogRead(A1);                // Read potentiometer
  temp_set = analogRead(A2);                // Read potentiometer

  h_tobe = map(humd_set, 0, 1023, 0, 100);  //  convert potentiometer value to 0-100% humidity
  t_tobe = map(temp_set, 0, 1023, 0, 80);   //  convert potentiometer value to 0-80degF

  if (!acquire_dht11_sample())
return;

  unsigned long runtime = millis();
  unsigned long minutes = runtime / 60000;
  unsigned long seconds = (runtime / 1000) % 60;

  boolean updated = update_avg(minutes);

  serial_output(runtime, updated);

  lcd_output(minutes, seconds);

   // *****   humidifier on/off with hysteresis:
 if (h_actual < (h_tobe - h_hhyst)) {
digitalWrite(HumSSR, HIGH);    // humidifier ON
//humid_led = ON;
}
 if (h_actual > (h_tobe + h_hhyst)) {
digitalWrite(HumSSR, LOW);     // humidifier OFF
//humid_led = OFF;
}

  // *****   fridge on/off with hysteresis:
 if (t_actual > (t_tobe + t_hhyst)) {
digitalWrite(TemSSR, HIGH);    // fridge ON
//fridge_led = ON;
}
 if (t_actual < (t_tobe - t_hhyst)) {
digitalWrite(TemSSR, LOW);     // fridge OFF
//fridge_led = OFF;
}

    if (updated)
            log_to_eeprom();


      // wait 2 seconds until next reading
      delay(2000);

}

Logged

Matt

Rapa Nui
Offline Offline
Edison Member
*
Karma: 60
Posts: 2066
Pukao hats cleaning services
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Here is the working sketch that i will start use on the cheese cave once i stuff it in a box.
I would test it before using it in your cave. Otherwise your cheese may get barbecued.. smiley smiley

This will crash your system when the dht returns false in the loop():
Code:
  if (!acquire_dht11_sample())
return;

What is this:
Code:
int humd_set = A1;            // Potentiometer value read from analog pin A1 to set humidity
int temp_set = A2;            // Potentiometer value read from analog pin A1 to set temperature

What does this:
Code:
void log_to_eeprom()
{
eeprom_addr %= EEPROM_SIZE;
}
« Last Edit: May 30, 2013, 11:10:04 am by pito » Logged

Rapa Nui
Offline Offline
Edison Member
*
Karma: 60
Posts: 2066
Pukao hats cleaning services
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

If I were you I would add a controlled exit based on the error value coming from the sensor, for example:
Code:
..
  if (!acquire_dht11_sample()) {       //HERE you READ the new actual data from sensor - right?
             error_condition();
          }

              // That must be here I think - new read actual data are here (Pito says)
  int h_actual = dht11_dat[0];  // Actual humidity value as read by DHT 11 sensor
  int t_actual = dht11_dat[2];  // Actual temperature vvalue as read by DHT 11 sensor
  
  if ((t_actual > 80) || (t_actual < 40)) error_condition();
  if ((h_actual > 100) || (h_actual <50)) error_condition();
..

And the error condition may do for example:
Code:
void error_condition() {
            switch_fridge_off();
            switch_humid_off();
            switch_ERORR_LED_on();
            call_national_guard();
            while(1){ };                          // stop here
        }

Also you may add a watchdog - measure the typical duration the fridge motor is running during the operation, and then put into your code a watchdog measuring time the fridge is HIGH - when much longer call error_condition();
etc., etc..
« Last Edit: May 30, 2013, 11:55:57 am by pito » Logged

Global Moderator
Boston area, metrowest
Offline Offline
Brattain Member
*****
Karma: 525
Posts: 26570
Author of "Arduino for Teens". Available for Design & Build services. Now with Unlimited Eagle board sizes!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I keep reading this as cheese cake control   smiley-mr-green
Logged

Designing & building electrical circuits for over 25 years. Check out the ATMega1284P based Bobuino and other '328P & '1284P creations & offerings at  www.crossroadsfencing.com/BobuinoRev17.
Arduino for Teens available at Amazon.com.

Rapa Nui
Offline Offline
Edison Member
*
Karma: 60
Posts: 2066
Pukao hats cleaning services
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
I keep reading this as cheese cake control   smiley-mr-green
@Xroads: Did you ever perform an Agile software development?   smiley  smiley-razz
http://en.wikipedia.org/wiki/Agile_software_development
« Last Edit: May 30, 2013, 11:58:19 am by pito » Logged

Global Moderator
Boston area, metrowest
Offline Offline
Brattain Member
*****
Karma: 525
Posts: 26570
Author of "Arduino for Teens". Available for Design & Build services. Now with Unlimited Eagle board sizes!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No, I'm a hardware designer.  smiley-wink
Browsing that and looking at how I code for a project, I do sort of follow the process.
Get pieces sort of layed out, get small parts working, get pieces working together, then refine down to a somewhat final product.
But being an engineer, the final product is never quite done smiley-wink
For example, I made 6 scoring machines for my fencing club and 6 sets of repeater lights. Each one is a little different as I used pieces I had on hand, adjusting the software to suit the hardware (octal registers vs shift registers, common anode vs common cathode displays, small things like that), improving the software as I went, improving the assembly as I went, replacing promini's with '328P funtionality as I used up stock...
They only support Epee at the moment, will add Foil & Sabre some day.  Different timing, different touch detection methods needed, different score lights to turn on/off.
The hardware will support all 3, the code has hooks/placeholder for adding the other 2.
Logged

Designing & building electrical circuits for over 25 years. Check out the ATMega1284P based Bobuino and other '328P & '1284P creations & offerings at  www.crossroadsfencing.com/BobuinoRev17.
Arduino for Teens available at Amazon.com.

Rapa Nui
Offline Offline
Edison Member
*
Karma: 60
Posts: 2066
Pukao hats cleaning services
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Get pieces sort of layed out, get small parts working, get pieces working together, then refine down to a somewhat final product.
That's the way I do prefer..  smiley-wink
I sometimes call it Step by Step approach..
Logged

Global Moderator
Boston area, metrowest
Offline Offline
Brattain Member
*****
Karma: 525
Posts: 26570
Author of "Arduino for Teens". Available for Design & Build services. Now with Unlimited Eagle board sizes!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yes, works good when making a design up on the fly and figuring out what to do as you go.
Surely would be frowned on in the corporate world - no requirements, no headers, no test plan.
More of a modified top down, bottom up approach, with an expanding middle as things become clear.
Logged

Designing & building electrical circuits for over 25 years. Check out the ATMega1284P based Bobuino and other '328P & '1284P creations & offerings at  www.crossroadsfencing.com/BobuinoRev17.
Arduino for Teens available at Amazon.com.

London
Offline Offline
Edison Member
*
Karma: 46
Posts: 1368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

... with an expanding middle ...

Indicates insufficient cheese cake control  smiley-grin
Logged

Pages: 1 [2]   Go Up
Jump to: