tx & rx pins

If a lack of Serial becomes too much of a burden and you have one unused pin, let me know. I may be able to help.

My first project is coming up with 19 pins. Too bad it's not 18,

Post the requirements or a schematic, maybe someone can save you a pin or two.


Rob

What about this multiplexer: Analog/Digital MUX Breakout - CD74HC4067

That would free up a lot of pins on your Uno.

nice mux andy

and what about the good old shift registers ? 74HC595 & 74HC165 ?

Once SouthernAtHeart comes back we can see what he's doing with all these pins.
In other posts he has asked about driving motors and keypad interfacing.

CrossRoads:
Once SouthernAtHeart comes back we can see what he's doing with all these pins.
In other posts he has asked about driving motors and keypad interfacing.

I'll fill you in here on my project, later today, if you promise not to laugh!

well you've mentioned a wide track 4' robot, motors, keypad for # of coffee cups, what else are you adding?

It's the coffee lovers' automaton.
Your coffee maker sets in the kitchen cabinet, at counter top level. A few knocks on the door (user customizable knocks) brings the self grinding machine out, opening the doors on it's way. the dovetailed platform mounted on undermount drawer glides will be likely driven by Sparkfun's 100:1 gearmotor. (Although, a stepper motor controled by a rotary encoder option moving the platform precisely how you want it sounds 'nice'.)
Then you are looking at a nice anodized aluminum enclosure housing a 4x3 keypad and an LCD display giving helpful tips to enter the number of cups of coffee you think you need to get you going. (the user will also have the option to 'bring on the coffee" by the keypad, if they're not up to knocking). Upon pressing start, your Asco NEMA rated water valve opens, and begins filling your coffee pot with the designated amount of water through 1/4" tubing routed from the undersink water filter system. The tubing is connected to the underside of the platform not unlike that ribbon connected to your printhead that allows it to move back and forth. The water is being monitored by seeedstudio's flow sensor. The # of pulses for each water setting (2,4,6,8,10) is stored in EEPROM, so it is user configurable using a secret keycode to enter the setup menu. The setup menu will also allow you to choose options: Enable knock sensor, enable photocell (if it's a dark early morning, the LCD screen in standby mode may show some ZZZZZZZZZZZZZZ's on the screen). Another option will be to enable audio. Ever hear the melodic tone played by one of these expensive washing machines when it's done? Not sure until I experiment, if I get that nice of a sound from 1 I/O pin, to give a little 'cupboard door open' and 'cupboard door closed' tone.
So, that about maxes out my Uno's pins. (I'm wondering how far into this paragraph I maxed out it's 2K of ram?) I'll be asking for help on that after my Uno comes in 2 days.
I can't think of any other sensors to incorporate, unless it's SparkFun's Optical Detector Optical Detector / Phototransistor - QRD1114 - SEN-00246 - SparkFun Electronics to monitor when to turn the gearmotor off upon opening and closing of the coffee platform. That might be easier than trying to wire up 2 unseen limit switches ...I'm still pondering that area of the project...
It's kind of interesting, I'd never even heard of Arduino a month ago!
I'll probably be coding, decoding, and recoding for awhile. I didn't know the first thing about C++, but this forum has been REALLY helpful and enjoyable.
So, that's my project. :slight_smile:

sensor.bmp (469 KB)

valve.jpg

enclosure.jpg

I can't think of any other sensors to incorporate,

Heck there's a lot of sensors around, I'm sure you can add a few, for example isn't it important to have the coffee at just the right temperature. :slight_smile:

Sounds real interesting and a fun project. I lost track of the pins required, when you get a schematic (even a rough one) give us a look and we may be able to trim things a bit.


Rob

I'd be happy to post my code with offers on improvement! If that's not imposing on anyone...
If it's split up into tabs, is there any way to post it here? Or just zip it up and attach?

Pins Description Arduino Pin#
2 Serial to PC (debugging) 0,1
2 Shift LCD 12,13
1 Motor (on/off) A4 (18)
1 Motor Relay 2P2T (reverse) A3 (17)
1 Optical Detector A2 (16)
1 I/O Knock sensor A1 (15)
1 I/O Photocell A0 (14)
1 Solenoid (water valve) 10
1 Flow Sensor 2
7 Keypad 3,4,5,6,7,8,9
1 I/O for Audio 11
19 Total

This is my pin line up

Here's my rough draft. Ugh. If anyone would like to re-model it into real code I would be VERY happy. I've only ever coded in basic before a week ago, so this probably looks 'basic'.
All I worked on was the actual water flow part of the code. I figured I should get that up and running first, before adding any frills like audio feedback or light sensing photocells...

attatchment removed, it was terrible!

At a quick glance the code looks reasonable but I doubt you have compiled it yet.

so this probably looks 'basic'.

Yep

//Load Settings from eeprom
LoadSettings;

try

LoadSettings();

I'll look a bit more later.


Rob

I think my code needs a LOT of help! If anyone can tell what I'm trying to have it do and can fix it up a bit in a few minutes, they'll save me hours...

My first attempt was pretty bad, so I deleted it. This seems a lot more concise. It even compiles!
Could someone please look it over and tell me if it will work?
My Uno will be here tomorrow.

Coffe_Project_V_2.zip (3.53 KB)

For someone who's never written any C I think you've done well.

I have not looked at the overall logic, just the syntax and local issues.

In Confirm_Pour()

do
  {
    if (key == '*') PourWater;  //turn on the water
    if (key == '#') 
    {
      srlcd.clear();
      srlcd.print("Action canceled");
      delay (5000); //wait for user to read message
      return;  //go back to the main loop routine
    }
  }
  while(key = NO_KEY);

Two problems here. "key" is never updated here so there's no need for a while loop.

while(key = NO_KEY);

Assignment instead of comparison.

PourWater => PourWater()

   while (key != NO_KEY)
    {
      key = keypad.getKey();
      //just waiting for a key press here to start water flow...
    }

Shouldn't these be "key == NO_KEY"?

void CountPulse() 
{
   FlowSensorCount++;  //increases the count from the interupt pin 2
}

Is the interrupt signal debounced?

in UserSettings()

while (key != '1' || key != '0'); => while (key != '1' && key != '0');

I'll keep browsing.


Rob

Thanks! I'm trying to take in everything you said, I got most of it.
What about the Confirm_Pour() function, I will need the while statement or some kind of loop statement, won't I. It's to give the user the option to cancel, after they enter a number.
How does this look:

void Confirm_Pour()
{
  srlcd.clear(); // Clear display, set cursor position to zero
  srlcd.print(key);  //LCD display the number they selected
  srlcd.print(" cups"); //plus cups
  srlcd.setCursor(0, 1); // Sets cursor position to the 2nd line
  srlcd.print("Press '*' to start or # to cancel"); //This needs to scroll across the 2nd line somehow so it can all be read
  do
  {
    key = keypad.getKey();
    if (key == '*') PourWater();  //turn on the water
    if (key == '#') 
    {
      srlcd.clear();
      srlcd.print("Action canceled");
      delay (5000); //wait for user to read message
      return;  //go back to the main loop routine
    }
  }
  while(key == NO_KEY);   
}

while(key = NO_KEY);

fixed

PourWater => PourWater()

fixed

   while (key != NO_KEY)

{
      key = keypad.getKey();
      //just waiting for a key press here to start water flow...
    }



Shouldn't these be "key == NO_KEY"?

yes, fixed

void CountPulse() 

{
  FlowSensorCount++;  //increases the count from the interupt pin 2
}



Is the interrupt signal debounced?

I reckon it doesn't need to be, does it? It's an interrupt signal on pin 2 coming from this flow sensor (hall effect):
http://www.seeedstudio.com/depot/datasheet/water%20flow%20sensor%20datasheet.pdf

while (key != '1' || key != '0'); => while (key != '1' && key != '0');

Are you sure? That's actually what I had first, but then I thought, key will NEVER be 1 and 0 at the same time so the while statement will never end... I'll go back and re-reason through it.

I'll keep browsing.

THANKS!

I said

Two problems here. "key" is never updated here so there's no need for a while loop.

because at the time there was no

key = keypad.getKey();

inside the loop. Now there is so yes you need the loop.

The flow sensor data sheet doesn't spec the exact nature of the output signal. However for the moment I think it's safe to assume it's clean, you can always add debouncing later if needed.

That's actually what I had first, but then I thought, key will NEVER be 1 and 0

Maybe, I always have trouble getting my head around these multiple !=, ==, !!, && constructs. So how about we remove the ambiguity and do this.

do
    {
      key = keypad.getKey();  //check for key event
      if (key = '0') return;       //action canceled
      if (key = '1')
      {
        for (int i=0; i < 5; i++){
          MySettings.mySensVals[i] = 0;  //reset sensor values
        }
        EEPROM_writeAnything(0, MySettings);  //save the settings
        srlcd.print("Completed!");
        delay(4000);  //wait for user to read message
        return;
      }
    }
  while (1);

Rob

do

{
      key = keypad.getKey();  //check for key event
      if (key = '0') return;      //action canceled
      if (key = '1')
      {
        for (int i=0; i < 5; i++){
          MySettings.mySensVals[i] = 0;  //reset sensor values
        }
        EEPROM_writeAnything(0, MySettings);  //save the settings
        srlcd.print("Completed!");
        delay(4000);  //wait for user to read message
        return;
      }
    }
  while (1);

I like it. I can read it. I looked at the conglomeration of NOTs, ORs, AND's, and WHILEs, and still couldn't get it.
I can follow this!

Yes it's important for code to be clear to a human as well as correct for the computer. And just to show that I don't practice what I preach, here's a line from the app I'm writing now.

Serial.print (isprint(((*(start + i)) & 0xFF)) ? (*(start + i)& 0xFF) : '.', BYTE);

Quick, you have 5 seconds to tell me what this does :slight_smile:


Rob