The Fridge Calculator: Refrigulator

peanutunderwearΛογισμικό & κατασκευή λογ/κού

7 Νοε 2013 (πριν από 3 χρόνια και 11 μήνες)

215 εμφανίσεις



1




The Fridge Calculator: Refrigulator


Michael Gerstein

Jesse Farfan

Juan Antialon

Karen Flores


Rutgers University, School of Engineering

Department of Electrical and Computer Engineering

Capstone Design Proposal


Professor Christopher Rose

May 2
nd
, 2012





2

Table of Contents

Abstract








3











Design








4









The Breakdown










Scanning







5
-
7




Weighing







7
-
9



Communication






10
-
15



Databases







15
-
19


Future








19
-
21


Appendix








22
-
33


References







34
















3

Abstract

In today’s society all kitchen appliances are digital, “smart”, and futuristic, except
the refrigerator. Coffee machines are designed to start brewing the second it’s owner hops
out of bed, toasters can predict the 5
-
day weather forecast
, and ovens can display top
news stories for each day. The purpose of our project is to propel the modern day kitchen
even further into the future. The Refrigulator serves to take a digital inventory of the
refrigerator and determine which recipes are avai
lable to cook
-
up based on the user’s
diet. The breakdown of our system can be separated into four portions; scanning,
weighing, weireless transmission, and data analysis. The product’s UPC code is scanned,
and then placed on the weighing device. The scanne
r transmits the UPC code information
to the user interface via USB, and the scale wirelessly transmits the weight information to
the user interface via single
-
board microcontroller. As the user interface accumulates the
refrigerator inventory data, our sys
tem calculates recipes involving the products in the
user’s refrigerator.












4

Design


The components of the Refrigerlator are a charged coupled device (scanning), a
strain gage (weighing), an arduino (wireless transmission), and a user interface (data

accumulation and analysis). The scanner is programmed to acquire any product’s UPC
information, send it directly to the user interface, and accumulate an inventory of
refrigerator products. After scanning, the product is placed on the strain gage scale. T
he
strain gage scales are reverse engineered, coupled with an arduino, and designed to read
an amplified voltage change. The arduino converts the amplified voltage change into a
force applied (weight in ounces), and sends this information wirelessly to a u
ser interface.
The user interface couples the information, product name and weight, and stores it in the
four tablet Microsoft Excel sheet. The first tab stores the refrigeratory inventory
(accumulated through the scanning and weighing process), the second

tab contains a list
of recipes (that we had to input ourselves), the third tab displays the list of recipes
available for concoction (based on the first and second tab), and the fourth tab instructs
the user how to cook
-
up the recipes currently available.










5

The Breakdown

As previously stated, our project is divided into four sections: the scanner, the
strain gage scales, the communication, and the databases.


The Scanner

we have chosen for our project is a Charged Couple Device (CCD). The
CCD convert
s optical images to electrical signals. In terms of our refrigulator system, the
CCD scanner converts the Universal Product Code (UPC) on each product into a digital
signal. The digital signal is sent to a computer where the information pertaining to the
U
PC is stored in a Microsoft Excel file.


Scanning Process

The basic function of a Charged Couple Device Scanner (CCD) is to convert optical
images to electrical signals. In terms of our refrigulator system, the CCD scanner
converts the bar code on each pr
oduct into digital signal. The process at which it does this
is as follows:

1.

The scanner inside the CCD shines a light at the bar code and the reflection is
captured in the form of an image via the CCD for reading.

2.

The image of the bar code reflection is co
nverted into an analog waveform.

3.

This analog waveform is then converted into a digital signal using a sampling
method of the given analog signal, digitization.

4.

The digital signal is decoded and sent to a computer where it stores the data.



6








There is
a linear photo
-
diode within the scanner head. This photo
-
diode can read the
reflected light off the lines on the bar
-
code. This reflection is a digital image that is then
scanned electronically within the device. When the image is scanned electronically, e
ach
bar on the bar
-
code is converted to the corresponding number or letter. The bar
-
code
scanner is connected to a PC or Mac and the CCD scanner then sends the sequence of
numbers and/or letters to the PC or Mac to populate the field of entry. This connect
ion
can be made in a number of ways. One way is with a keyboard wedge. This is a Y
connection where one end of the Y connects to the keyboard and the other end of the Y
connects to the scanner with the bottom of the Y plugging into the PC where the
keyboar
d would normally connect. This method is used many times when the PC does
not have enough interfaces. Serial is another connection method and works with just a
straight serial cable from the bar
-
code scanner directly to the PC serial connection. USB
is now

about the most popular method, because most PC's and Mac's today have many
USB ports.




7

The communication design concepts behind this are retrieving an analog signal,
converting an analog signal to a digital signal, decoding the digital signal, and sending

the decoded information to a computer for storage.


The Strain Gauge Scales

we have designed for our senior capstone entails a unique
story of reverse engineering. Firstly, a strain gauge system consists of multiple strain
gauges and these individual stra
in gauges are designed to measure stress and strain, hence
the name strain gauge. A strain gauge is a sensor whose resistance varies with applied
force. It converts force, pressure, tension, weight, etc., into a change in electrical
resistance that can the
n be measured as

a voltage difference. For our project purposes, the
voltage difference measured by the strain gauge will be sent to the arduino, the arduino
converts the voltage difference to weight in ounces, sends the information (weight in
ounces) to t
he computer and pairs it with the appropriate UPC information. The paired
information is stored in the Microsoft Excel file (via arduino) and accumulates for each


8

product (forming the refrigerator inventory). In order to retrieve these strain gauges our
g
roup took

apart a simple weight watchers bathroom scale. We used power tools, saws
and drills, to “get under the hood” and evaluate the circuit layout. We discovered a four
strain gauge system that helped us understand how a strain gauge works when heavy
w
eight is applied. In order to fulfill the project goal, we purchased three kitchen weight
scales
whose

strain gauge
s

were

more sensitive to an ounce.


The strain gauge shown above was used for measuring the weight in this project. When
the excite cables a
re connected to a DC voltage, there is a change in voltage in the sense
cables. The more weight applied, the higher the change in voltage. As you can see above,
the weight is applied on the left side of the strain gauge which gives a negative change in
vol
tage. Unfortunately, the change in voltage from the strain gauge is too low and cannot
be read by the arduino. Therefore, an AD620 low drift low power instrumentation
amplifier was used to amplify its signal. A battery of approximately 5.7Vdc was
connecte
d to the excite cables and the amplifier to power it. The schematic shown below
displays the circuit used to measure the change in voltage.




9

Wire wrapping was used to build the circuit above. The output voltage is about 2.2V and
it decreases as weight’s a
pplied to the strain gauge. This is demonstrated in the picture of
the integrated circuit shown below.


Weighing Process

We want to divide the refrigerator by placing several weight scale “pads” in allotted
positions. This will limit the amount of product
s the refrigerator can store; however, it
will
supply the

refrigerator database
with information such as the
amount of product
being stored. Our idea is to build a scale that varies in size, lays flat on the refrigerator
draws/side
-
door, and is resistant t
o cold temperatures. For this project
, we have created a
prototype that consists of three scales that demonstrates what would happen
when
products are added
to
the fridge
.

H
owever
,

these scales

are not temperature resistant and

will change
its
output weigh
t when
it’s
exposed to cold temperatures.
This is a pristine
design that would complement the project if anyone ever continued to build off of this
concept.




10

Wireless Communication

In order to send the data to the database to match the scanned items, we us
ed UNO
arduinos and ZigBee series 2 antennas. Arduinos are useful micro controllers that can be
programmed to read analog data and send it to another device. The UNO arduino is
usually connected via USB in order to transfer data but since the system needed

signals to
be transmitted wirelessly, we chose to use ZigBee technology. ZigBee is a low
-
cost and
low
-
power wireless networking standard. Due to its low
-
cost, it is widely used in
different wireless control applications. It has a edge on Bluetooth technol
ogy because of
its low
-
power usage which allows longer life with smaller batteries and provides a larger
range of communication, without compromising its rate and reliability.













Figure 1
-
Uno Arduino




Figure 2
-

ZigBee series 2 antenna

In orde
r to connect these two together and be able to send the information wirelessly, the
ZigBee antenna needs to be mounted to the UNO arduino. To accomplish this task, we


11

used an arduino ZigBee shield. The ZigBee shield allows the antenna (series 2) to send
th
e information from the UNO arduino to another ZigBee antenna (series 2).







Figure 3
-

ZigBee Shield



Figure 4
-

Arduino with ZigBee set
-
up


Initially, the project began using a Bluetooth Arduino but it was proven to be unreliable
and had many connecti
vity issues. The UNO arduino provided stability and was a lot
easier to program using the arduino programming language. In order to read the signal
from the scale, we connected the output of the scale circuit to one of the analog pins of
the arduino. After

doing so, we set the baud rate to be 9600 which is the default for UNO
arduino boards and programmed the arduino to read the analog pin. The result obtained
was not in volts but in a range of 0 to 1024. In order to convert this number to a number
between
0 to 5V, we used a simple conversion: value x 5/1024 to figure out the voltage
transmitted.


Once the value represented the voltage from the scale, there was the need to convert this
voltage to weight. Using a 1 ounce object, we determined how much the vol
tage from the
scaled varied and called that variable y. Now, assume z= voltage reading of the scale


12

(once an object has been placed on top) and x= voltage reading when there is nothing on
the scale or the “zero” voltage. Then we can find weight by followin
g a simple formula:
(z
-
x)/ y and this will give the result in pounds. The entire code used to program the UNO
arduino can be found in the Appendix.

The next part of the system is to program the ZigBee antennas to communicate with one
another and create a
network. In order to accomplish this task, the X
-
CTU software was
used. The X
-
CTU software is designed to read COM ports and to configure them. To
have effective communication in this network, one ZigBee antenna was designed to be
the receiver and was conn
ected directly to the computer containing the database. After
adjusting the other ZigBee antennas to the same PANID and assigning the same baud rate
for the network and the address in which they will send the information, the network
communication was esta
blished.








Figure 5
-

X
-
CTU set up




Figure 6
-

Receiver Connection


After creating a network of ZigBee antennas, the last part of the wireless communication
aspect was to save the data that the receiver antenna was outputting to the COM port.


13

This
task was the most challenging part because of the inability of the arduino
programming language to do so. Since the arduino language (which is based on C) is not
capable to save data into a file, we explored into the option of using a software language
cal
led Processing, which enables the user to save the data coming from the arduino but it
required the user to keep pressing the “Run” option which will not work in the real world
application. Since the database chosen for this project was built in Microsoft
Excel, there
were two options to save the data, either a text file or a csv file (which is compatible with
the .xlsm format).

Upon encountering the issue with Processing, we turned to Java to read
the COM port and save the data but it created different iss
ues and turned to be a complex
task. We wanted to save the different data from the different arduinos as weight 1
(representing scale 1), weight 2 and so forth but rewriting the data over and over.
Essentially, we did not want to just add data to a file bu
t instead keep re
-
writing over the
value for scale 1 (for example), every time the arduino read a signal for scale one.







Figure 7
-

Wrong Saving Data Format


Figure 8
-

Successful Data Saving Format

In order to obtain the desired output, we used Py
thon27 to read the COM port and save
the data to a text file named “data.txt”. The code for this file called final.py can be found
in the Appendix. The user can run the Python program from the command prompt


14

window and the program will run continuously unt
il the user decides to stop the data
from being written on the text file. The picture below shows the command and the output
from the command window and though it looks like the data keeps showing on the
screen, in the text file, only the last values for w
eight1 and weight 2 are being kept.


Figure 9
-

Command Window Prompt

Once the data is saved into the “data.txt” file then the Microsoft Excel database grabs the
value for scale 1 and 2 and aligns it with the corresponding scanned item. The last part of
t
his aspect of the system is being able to work wirelessly. Originally, we had the arduinos
either connected to a power supply or to a USB cable in order to turn them on, but since
this will be ineffective in the real world, we obtained 5V batteries and con
nected the
output from the scale to the pin so that no unnecessary cables were used in the system.
The outcome of this combination is shown below.



15


Figure 10
-

Scale and Arduino set
-
up

Database


As products are scanned into the refrigerator, the database i
s populated with inventory (as
well as in multiples, i.e. 2 apples). The database, in Microsoft Excel, consists of multiple
excel sheets. The first excel sheet has four main columns which display the product’s
UPC code, scale associated with it, actual wei
ght, and information associated with it from
searchupc.com. This Excel workbook has VBA coding along with built in Excel
functions that help gather all the information we need for our products. If you look at
Figure 1,
you’ll see how the columns are set up
. We have built
-
in Excel functions such
as “vlookup”, which searches for a value in the leftmost column of a table, and then
returns a value in the same row from a column you specify in the table.



16

Figure 1

When the UPC code is entered into column A (simp
ly done automatically by the
scanner), column D automatically updates the cell with information that pertains to that
specific UPC code. We created a public function within Visual Basic which allowed us to
gather information over the web and connect to sea
rchupc.com’s database. The latter is
what helped display the product’s information. This code can be found in the
Appendix
section.


The second excel sheet entails four tabs; “Ingredients Currently Available”, “Ingredients
Needed”, and “Recipes Currently A
vailable”, and “Recipes Available” which will
facilitate the tracking of inventory along with characteristics that are associated with them
(weight, name, quantity, etc.). Ingredients Currently Available shows the information of
products scanned into the r
efrigerator. Ingredients Needed displays all of the user’s
recipes and which ingredients are needed to cook these recipes. Recipes Currently
Available shows all of the user’s recipes in the database and a simple yes or no, regarding
if there are sufficient

ingredients to produce each recipe. Recipes Available displays all


17

the recipes that the user is able to produce, and the directions in order to cook. The
database will be programmed to initiate queries through keywords (i.e. “chicken.”) by an
option progr
ammed in the touch screen menu, labeled “Possible recipes” for example.
The queries within the database will be programmed in order to display possible recipes
that can be created based on the current levels of inventory within the refrigerator. Along
with

querying recipes, the database will also be able to export information detailing
what’s in the fridge as well as how much of it. This feature will allow users to remotely
“look” into their refrigerator and take any necessary action, such as picking up a g
allon of
milk on the way home since the old one is running out.











Figure 2
















18

In order to accomplish these goals, we will use the C++ programing language. First, the
database will contain all the recipes acquired from allrecipes.com The
se recipes will be
inserted into a text file and the program will extract the data from these text files and
import them into the database. The entire process will be implemented through the usage
of Binary Search Trees. The recipes will be sorted by diff
erent types of dishes: main
courses, entrees, desserts and drinks. In order to organize all of these recipes the Binary
Search Tree will be implementing a sorting algorithm such that it will aid the user find
the recipe faster. This algorithm will sort ea
ch type of recipe alphabetically using a
recursive loop that checks the title of the recipes and arranges them in order.


The second main objective of the database is to search for the recipes according to the
inventory in the refrigerator. The binary se
arch tree (BST) has a built in algorithm that
does the searching that is needed to find the specific recipe that the user wants. Not only
that, the BST will have an inserting and deleting algorithm so that it will be easier to
organize and to get rid of a
ny unwanted recipes. This program will recognize what the
data that scanner sends and will show whether it goes with a specific recipe or not by
using the search algorithm. Once the database finds recipes that matches what is on the
fridge, it will displa
y a list to the user in alphabetical order.


After the user has taken out the products from the fridge, the weight sensors will check
the amount of the products left and will inform the database, who will update the amount
of products stored and will reca
lculate the recipes that match what is left inside. The
reason why we feel that it is necessary to use BST to implement this database is because


19

linked lists consists of one pointer pointing at an object but the way this seems to be set
up it will consist

of multiple pointers pointing at an object. Binary Search Trees are
known for having multiple pointers pointing at a particular object. It will make it more
organized and will help us navigate better through the entire database.


Future

The database will

be programmed to initiate queries through keywords (i.e. “chicken.”)
by an option programmed in the touch screen menu, labeled “Possible recipes” for
example.

Along with querying recipes, the database will also be able to export
information detailing what
’s in the fridge as well as how much of it. This feature will
allow users to remotely “look” into their refrigerator and take any necessary action, such
as picking up a gallon of milk on the way home since the old one is running out.


The second main obje
ctive of the database was to search for the recipes according to the
inventory in the refrigerator. The binary search tree (BST) has a built in algorithm that
does the searching that is needed to find the specific recipe that the user wants. Not only
tha
t, the BST will have an inserting and deleting algorithm so that it will be easier to
organize and to get rid of any unwanted recipes. This program will recognize what the
data that scanner sends and will show whether it goes with a specific recipe or not

by
using the search algorithm. Once the database finds recipes that matches what is on the
fridge, it will display a list to the user in alphabetical order.




20

After the user has taken out the products from the fridge, the weight sensors will check
the amo
unt of the products left and will inform the database, who will update the amount
of products stored and will recalculate the recipes that match what is left inside. The
reason why we feel that it is necessary to use BST to implement this database is beca
use
linked lists consists of one pointer pointing at an object but the way this seems to be set
up it will consist of multiple pointers pointing at an object. Binary Search Trees are
known for having multiple pointers pointing at a particular object. It w
ill make it more
organized and will help us navigate better through the entire database.


The idea of a user interface on a refrigerator, that tracks the every
-
day data of your fridge
is unique and brings for future potential. With a more advanced data ana
lysis, a futuristic
version of this system can communicate a multitude of information to the user; expiration
dates, purchase trends, shopping lists, expenses by day/week/month/year, budgeting,
savings, etc. In addition, incorporating an RFID system to eli
minate the constant
scanning of items would be user friendly and efficient. RFID combined with
refrigeratorshelf
-
scales would increase the user
-
friendliness. This technology would
require the shelf to measure the perimeter of the product’s bottom, and calc
ulate the force
applied absed off the area of that perimeter.


Unfortunately, we were unable to move along fast enough to implement our system into a
refrigerator. This implementation would obviously need to happen in order to complete
our system. For this

implementation we would need to test components at cooler
temperatures which would bring forth some complications that would need to be solved.




21

Also, we were unable to set up the recipe data base function like we did with the UPC
process. In the future w
e will have to coordinate our system to perform the same function
as the UPC (hooking up to a recipe data base and pulling in recipes based on our
refrigerator inventory.


The scales we built were too small to insert the arduino piece inside of them. For t
he
future we would have to design scales that could hold the arduinos inside and hide them
from view of the user. In order to make the user interface complete, we will need to set
up a touch screen micro
-
controller and place it on the door of the refrigera
tor. Right now
our user interface was a laptop.
















22

Appendix

Arduino Code

double sesorValue=0;

void setup()


{



Serial.begin(9600);

}


void loop()


{



double sensorValue = analogRead(A5);



double value = sensorValue * 5.0/1023.0;



if (value <

1.5000) // anything lower than this is assumed to have nothing on the scale



{ //char* a= "weight= ";





Serial.print("weight1 = ");




// Serial.print(",");





Serial.println(value,4);





Serial.flush();





delay (3000);







}



if (value > 1.5000
)



{//char* a= "weight= ";





// if value is less than 1 V then it assumes there is no object in scale




Serial.println("weight1 = 0.0000");




//Serial.print (",");




//Serial.println(value,4);




Serial.flush();




delay (3000);



}

}


Python 27 Code

import serial

ser=serial.Serial('COM4', 9600, timeout=.8)

ser.flushInput()

ser.flushOutput();

weight1 = "";



23

weight2 = "";

while True:



msg=ser.readline();


if msg.isspace()==False and len(msg)>0:


print msg


x = msg.split(" ");


if(x[0]) == "weight1": weight1 = x[2]


if(x[0]) == "weight2": weight
2 = x[2]


f = open('data.txt','w')


f.write("weight1 = " + weight1)


f.write("weight2 = " + weight2)


f.flush()


f.close()

ser.close()





Excel VBA Coding


' Excel VBA Function wrapper to call currency conversion Web Ser
vice on the web!

Public Function upcConvert(ByVal upc As String) As String


Dim objSClient As MSSOAPLib30.SoapClient30 ' Remove the 30 if using an
earlier version of SOAP


Dim fResult As String



' Point the SOAP API to the web service that w
e want to call...


Set objSClient = New SoapClient30


Call
objSClient.MSSoapInit(par_WSDLFile:="http://www.searchupc.com/service/UPCSearch
.asmx?wsdl")




24


' Call the web service


fResult = objSClient.GetProduct(upc, "0DE2D3E6
-
90A0
-
4169
-
8EE8
-
16CEF
B6FD342")


Set objSClient = Nothing



upcConvert = fResult



End Function


Public Sub refresh()


Application.CalculateFull


ThisWorkbook.RefreshAll

End Sub


'Code I can use to delete product entries if weight is 0

Sub Delete()

For i = Cells(
Rows.Count, 2).End(xlUp).Row To 1 Step
-
1


If Left(Cells(i, 2), 1) = 0 Then Cells(i, 15).EntireRow.Delete

Next i

End Sub

Access Code to “searchupc.com”


POST /supc/service/UPCSearch.asmx HTTP/1.1

Host: www.searchupc.com

Content
-
Type: application/soap+xm
l; charset=utf
-
8

Content
-
Length: length


<?xml version="1.0" encoding="utf
-
8"?>

<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema
-
instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap
-
envelope">


<s
oap12:Body>


<GetProduct xmlns="http://searchupc.com/">


<upc>string</upc>


<accesstoken>string</accesstoken>


</GetProduct>


</soap12:Body>

</soap12:Envelope>

HTTP/1.1 200 OK

Content
-
Type: application/soap+xml; charset=utf
-
8

Content
-
Lengt
h: length


<?xml version="1.0" encoding="utf
-
8"?>

<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema
-
instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap
-
envelope">



25


<soap12:Body>


<GetProductRes
ponse xmlns="http://searchupc.com/">


<GetProductResult>string</GetProductResult>


</GetProductResponse>


</soap12:Body>

</soap12:Envelope>


WSDL Code


<wsdl:definitions targetNamespace="http://searchupc.com/">



<wsdl:types>



<s:schema elementFormDefault="qualified" targetNamespace="http://searchupc.com/">



<s:element name="GetProduct">



<s:complexType>



<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="upc" type="s:string"/>

<s:element minOccurs="0"

maxOccurs="1" name="accesstoken" type="s:string"/>

</s:sequence>

</s:complexType>

</s:element>



<s:element name="GetProductResponse">



<s:complexType>



<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="GetProductResult" type="s:string"/>

</s:se
quence>

</s:complexType>

</s:element>



<s:element name="GetProductJSON">



<s:complexType>



<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="upc" type="s:string"/>

<s:element minOccurs="0" maxOccurs="1" name="accesstoken" type="s:string"/>

</s:s
equence>

</s:complexType>

</s:element>



26



<s:element name="GetProductJSONResponse">



<s:complexType>



<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="GetProductJSONResult"
type="s:string"/>

</s:sequence>

</s:complexType>

</s:element>



<s:elemen
t name="Validate">



<s:complexType>



<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="upc" type="s:string"/>

<s:element minOccurs="0" maxOccurs="1" name="accesstoken" type="s:string"/>

</s:sequence>

</s:complexType>

</s:element>



<s:element nam
e="ValidateResponse">



<s:complexType>



<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="ValidateResult" type="s:string"/>

</s:sequence>

</s:complexType>

</s:element>



<s:element name="ConvertToUPCA">



<s:complexType>



<s:sequence>

<s:element

minOccurs="0" maxOccurs="1" name="upce" type="s:string"/>

<s:element minOccurs="0" maxOccurs="1" name="accesstoken" type="s:string"/>

</s:sequence>

</s:complexType>

</s:element>



<s:element name="ConvertToUPCAResponse">





27

<s:complexType>



<s:sequence>

<
s:element minOccurs="0" maxOccurs="1" name="ConvertToUPCAResult"
type="s:string"/>

</s:sequence>

</s:complexType>

</s:element>



<s:element name="GenerateBarcode">



<s:complexType>



<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="upc" type="s:s
tring"/>

</s:sequence>

</s:complexType>

</s:element>



<s:element name="GenerateBarcodeResponse">



<s:complexType>



<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="GenerateBarcodeResult"
type="s:string"/>

</s:sequence>

</s:complexType>

</s:elem
ent>



<s:element name="SuggestProduct">



<s:complexType>



<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="upc" type="s:string"/>

<s:element minOccurs="0" maxOccurs="1" name="productnamewithmanufacturer"
type="s:string"/>

<s:element minOccurs="
0" maxOccurs="1" name="productattribute" type="s:string"/>

<s:element minOccurs="0" maxOccurs="1" name="accesstoken" type="s:string"/>

</s:sequence>

</s:complexType>

</s:element>



<s:element name="SuggestProductResponse">





28

<s:complexType>



<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="SuggestProductResult"
type="s:string"/>

</s:sequence>

</s:complexType>

</s:element>

</s:schema>

</wsdl:types>



<wsdl:message name="GetProductSoapIn">

<wsdl:part name="parameters" element="tns:GetProduct"/>

</ws
dl:message>



<wsdl:message name="GetProductSoapOut">

<wsdl:part name="parameters" element="tns:GetProductResponse"/>

</wsdl:message>



<wsdl:message name="GetProductJSONSoapIn">

<wsdl:part name="parameters" element="tns:GetProductJSON"/>

</wsdl:message>



<wsdl:message name="GetProductJSONSoapOut">

<wsdl:part name="parameters" element="tns:GetProductJSONResponse"/>

</wsdl:message>



<wsdl:message name="ValidateSoapIn">

<wsdl:part name="parameters" element="tns:Validate"/>

</wsdl:message>



<wsdl:message na
me="ValidateSoapOut">

<wsdl:part name="parameters" element="tns:ValidateResponse"/>

</wsdl:message>



<wsdl:message name="ConvertToUPCASoapIn">

<wsdl:part name="parameters" element="tns:ConvertToUPCA"/>

</wsdl:message>



<wsdl:message name="ConvertToUPCASo
apOut">

<wsdl:part name="parameters" element="tns:ConvertToUPCAResponse"/>

</wsdl:message>



<wsdl:message name="GenerateBarcodeSoapIn">

<wsdl:part name="parameters" element="tns:GenerateBarcode"/>

</wsdl:message>



29



<wsdl:message name="GenerateBarcodeSoapO
ut">

<wsdl:part name="parameters" element="tns:GenerateBarcodeResponse"/>

</wsdl:message>



<wsdl:message name="SuggestProductSoapIn">

<wsdl:part name="parameters" element="tns:SuggestProduct"/>

</wsdl:message>



<wsdl:message name="SuggestProductSoapOut">

<wsdl:part name="parameters" element="tns:SuggestProductResponse"/>

</wsdl:message>



<wsdl:portType name="UPCSearchSoap">



<wsdl:operation name="GetProduct">

<wsdl:input message="tns:GetProductSoapIn"/>

<wsdl:output message="tns:GetProductSoapOut"/>

</w
sdl:operation>



<wsdl:operation name="GetProductJSON">

<wsdl:input message="tns:GetProductJSONSoapIn"/>

<wsdl:output message="tns:GetProductJSONSoapOut"/>

</wsdl:operation>



<wsdl:operation name="Validate">

<wsdl:input message="tns:ValidateSoapIn"/>

<wsd
l:output message="tns:ValidateSoapOut"/>

</wsdl:operation>



<wsdl:operation name="ConvertToUPCA">

<wsdl:input message="tns:ConvertToUPCASoapIn"/>

<wsdl:output message="tns:ConvertToUPCASoapOut"/>

</wsdl:operation>



<wsdl:operation name="GenerateBarcode">

<wsdl:input message="tns:GenerateBarcodeSoapIn"/>

<wsdl:output message="tns:GenerateBarcodeSoapOut"/>

</wsdl:operation>



<wsdl:operation name="SuggestProduct">

<wsdl:input message="tns:SuggestProductSoapIn"/>

<wsdl:output message="tns:SuggestProductSoapO
ut"/>

</wsdl:operation>

</wsdl:portType>





30

<wsdl:binding name="UPCSearchSoap" type="tns:UPCSearchSoap">

<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>



<wsdl:operation name="GetProduct">

<soap:operation soapAction="http://searchupc.com/G
etProduct" style="document"/>



<wsdl:input>

<soap:body use="literal"/>

</wsdl:input>



<wsdl:output>

<soap:body use="literal"/>

</wsdl:output>

</wsdl:operation>



<wsdl:operation name="GetProductJSON">

<soap:operation soapAction="http://searchupc.com/GetP
roductJSON"
style="document"/>



<wsdl:input>

<soap:body use="literal"/>

</wsdl:input>



<wsdl:output>

<soap:body use="literal"/>

</wsdl:output>

</wsdl:operation>



<wsdl:operation name="Validate">

<soap:operation soapAction="http://searchupc.com/Validate"

style="document"/>



<wsdl:input>

<soap:body use="literal"/>

</wsdl:input>



<wsdl:output>

<soap:body use="literal"/>

</wsdl:output>

</wsdl:operation>



<wsdl:operation name="ConvertToUPCA">

<soap:operation soapAction="http://searchupc.com/ConvertToUPCA"
style="document"/>



<wsdl:input>

<soap:body use="literal"/>



31

</wsdl:input>



<wsdl:output>

<soap:body use="literal"/>

</wsdl:output>

</wsdl:operation>



<wsdl:operation name="GenerateBarcode">

<soap:operation soapAction="http://searchupc.com/GenerateBarcod
e"
style="document"/>



<wsdl:input>

<soap:body use="literal"/>

</wsdl:input>



<wsdl:output>

<soap:body use="literal"/>

</wsdl:output>

</wsdl:operation>



<wsdl:operation name="SuggestProduct">

<soap:operation soapAction="http://searchupc.com/SuggestProdu
ct" style="document"/>



<wsdl:input>

<soap:body use="literal"/>

</wsdl:input>



<wsdl:output>

<soap:body use="literal"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>



<wsdl:binding name="UPCSearchSoap12" type="tns:UPCSearchSoap">

<soap12:binding tran
sport="http://schemas.xmlsoap.org/soap/http"/>



<wsdl:operation name="GetProduct">

<soap12:operation soapAction="http://searchupc.com/GetProduct" style="document"/>



<wsdl:input>

<soap12:body use="literal"/>

</wsdl:input>



<wsdl:output>

<soap12:body use
="literal"/>

</wsdl:output>



32

</wsdl:operation>



<wsdl:operation name="GetProductJSON">

<soap12:operation soapAction="http://searchupc.com/GetProductJSON"
style="document"/>



<wsdl:input>

<soap12:body use="literal"/>

</wsdl:input>



<wsdl:output>

<soap12:b
ody use="literal"/>

</wsdl:output>

</wsdl:operation>



<wsdl:operation name="Validate">

<soap12:operation soapAction="http://searchupc.com/Validate" style="document"/>



<wsdl:input>

<soap12:body use="literal"/>

</wsdl:input>



<wsdl:output>

<soap12:body u
se="literal"/>

</wsdl:output>

</wsdl:operation>



<wsdl:operation name="ConvertToUPCA">

<soap12:operation soapAction="http://searchupc.com/ConvertToUPCA"
style="document"/>



<wsdl:input>

<soap12:body use="literal"/>

</wsdl:input>



<wsdl:output>

<soap12:b
ody use="literal"/>

</wsdl:output>

</wsdl:operation>



<wsdl:operation name="GenerateBarcode">

<soap12:operation soapAction="http://searchupc.com/GenerateBarcode"
style="document"/>



<wsdl:input>

<soap12:body use="literal"/>



33

</wsdl:input>



<wsdl:output>

<soap12:body use="literal"/>

</wsdl:output>

</wsdl:operation>



<wsdl:operation name="SuggestProduct">

<soap12:operation soapAction="http://searchupc.com/SuggestProduct"
style="document"/>



<wsdl:input>

<soap12:body use="literal"/>

</wsdl:input>



<wsdl:o
utput>

<soap12:body use="literal"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>



<wsdl:service name="UPCSearch">



<wsdl:port name="UPCSearchSoap" binding="tns:UPCSearchSoap">

<soap:address location="http://www.searchupc.com/supc/service/UPCSearch.as
mx"/>

</wsdl:port>



<wsdl:port name="UPCSearchSoap12" binding="tns:UPCSearchSoap12">

<soap12:address location="http://www.searchupc.com/supc/service/UPCSearch.asmx"/>

</wsdl:port>

</wsdl:service>

</wsdl:definitions









34

References

http
://
www
.
denso
-
wave
.
com
/
en
/
adcd
/
fundamental
/
barcode
/
scanner
.
html

http
://
www
.
ece
.
iit
.
edu
/~
pfelber
/
ccd
/
project
.
pdf

http://www.carolinabarcode.com/how
-
barcode
-
scanners
-
work
-
a
-
69.html

http
://
www
.
ti
.
com
/
lit
/
wp
/
sbaa
154/
sbaa
154.
pdf

Arduino Home Page

http
://
arduino
.
cc
/

How
-
to: Setting up XBee ZNet 2.5 (Series 2) modules
http
://
www
.
embedded
.
arch
.
ethz
.
ch
/
xbee
-
setup
.
pdf

Sparkfun Electronics


http
://
www
.
sparkfun
.
com


Textbook Sources:

How To Program C++ by, Paul Deitel and Harvey Deitel

Digital Signal Processing: A Computer
-
Based Approacach

by, Sanjit K. Mitra

Microelectronic Circuits by Sedra/Smitch

http
://
www
.
ece
.
rutgers
.
edu
/~
marsic
/
books
/
SE
/

Smart Refrigerator Model:

http
://
cs
.
nyu
.
edu
/~
jml
414/
ui
/
assign
3/
smart
_
refrig
.
html