final report - Winlab

advertisement
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 2nd, 2012
1
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
2
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 available 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 scanner 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 system calculates recipes involving the products in the
user’s refrigerator.
3
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. The
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 user 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.
4
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 converts 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
UPC 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 product 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 converted 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.
5
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, each
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 connection
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
keyboard 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.
6
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 strain 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 then 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 the 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
7
product (forming the refrigerator inventory). In order to retrieve these strain gauges our
group 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
weight is applied. In order to fulfill the project goal, we purchased three kitchen weight
scales whose strain gauges were more sensitive to an ounce.
The strain gauge shown above was used for measuring the weight in this project. When
the excite cables are 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
voltage. 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
connected to the excite cables and the amplifier to power it. The schematic shown below
displays the circuit used to measure the change in voltage.
8
Wire wrapping was used to build the circuit above. The output voltage is about 2.2V and
it decreases as weight’s applied 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 products 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 to 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. However, these scales are not temperature resistant and
will change its output weight 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.
9
Wireless Communication
In order to send the data to the database to match the scanned items, we used 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 technology 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 order 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
10
used an arduino ZigBee shield. The ZigBee shield allows the antenna (series 2) to send
the 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 connectivity 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 voltage from the
scaled varied and called that variable y. Now, assume z= voltage reading of the scale
11
(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 following 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 connected 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 established.
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.
12
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
called 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 issues 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 but 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 Python27 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
13
window and the program will run continuously until 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 weight1 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
this 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 connected 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.
14
Figure 10- Scale and Arduino set-up
Database
As products are scanned into the refrigerator, the database is 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 weight, 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.
15
Figure 1
When the UPC code is entered into column A (simply 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 searchupc.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 Available”, 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 refrigerator. 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
16
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 programmed 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 gallon of
milk on the way home since the old one is running out.
Figure 2
17
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 These 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 different 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 each 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 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
that, 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.
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 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 because
18
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 objective 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
that, 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.
19
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 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 because
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.
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 analysis, 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 eliminate 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 calculate 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.
20
Also, we were unable to set up the recipe data base function like we did with the UPC
process. In the future we 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 the
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 refrigerator. Right now
our user interface was a laptop.
21
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 = "";
22
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": weight2 = 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 Service 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 we want to call...
Set objSClient = New SoapClient30
Call
objSClient.MSSoapInit(par_WSDLFile:="http://www.searchupc.com/service/UPCSearch
.asmx?wsdl")
23
' Call the web service
fResult = objSClient.GetProduct(upc, "0DE2D3E6-90A0-4169-8EE816CEFB6FD342")
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+xml; 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">
<soap12: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-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">
24
<soap12:Body>
<GetProductResponse 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:sequence>
</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:sequence>
</s:complexType>
</s:element>
25
−
<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:element 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 name="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">
−
26
<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:string"/>
</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:element>
−
<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">
−
27
<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"/>
</wsdl: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 name="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="ConvertToUPCASoapOut">
<wsdl:part name="parameters" element="tns:ConvertToUPCAResponse"/>
</wsdl:message>
−
<wsdl:message name="GenerateBarcodeSoapIn">
<wsdl:part name="parameters" element="tns:GenerateBarcode"/>
</wsdl:message>
28
−
<wsdl:message name="GenerateBarcodeSoapOut">
<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"/>
</wsdl: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"/>
<wsdl: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:SuggestProductSoapOut"/>
</wsdl:operation>
</wsdl:portType>
−
29
<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/GetProduct" 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/GetProductJSON"
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"/>
30
</wsdl:input>
−
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
−
<wsdl:operation name="GenerateBarcode">
<soap:operation soapAction="http://searchupc.com/GenerateBarcode"
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/SuggestProduct" 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 transport="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>
31
</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:body 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 use="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:body 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"/>
32
</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:output>
<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.asmx"/>
</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
33
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/sbaa154/sbaa154.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/~jml414/ui/assign3/smart_refrig.html
34
Download