All posts by haotianli

FINAL PROJECT

  • Concept

The topic of my project is “TALK TO ME”.

Contemporary, new kinds of technologies are changing people’s lives constantly. Sometimes we even can’t notice these changes are happening to us. However, technologies can’t really understand people’s emotion need. For instance, the mobile phones and the Internet make distance nothing but can’t make you feel really close to each other.

In this project, I design a sound piece to solve one emotional problem for roommates when they are dissatisfied with each other. You can also use this to give yourself some surprise.

It usually happens in my country that roommates don’t want talk to each other after quarreling and no one want to talk first. It kind of means you surrender if you talk first and really can make you lose face.  We are reactive culture type. We never confront, usually react to others’ actions and must not lose face. But we need to solve problem after quarreling and talk to each other is the only efficient method. How can we make people feel more comfortable to be the first one to talk?

Then I design a sound piece as a bridge to connect people together, initiate conversation. When you are dissatisfied with your roommate, you can use this sound piece to record message to him/her.

  • Function

IMG_3693

There are seven buttons on the wooden box. Because in China we always have six to seven roommates in dorm. Each roommate has one specific button for themselves. The big buttons and little stars combine together to make a letter “t”, which means “Talk to me”. The shape of the box is just like a tree truck and the shape of the edge is just like growth ring, which represents time.

Self-record mode: If you want to leave some message to yourself, you can just click on your button to record messages, then click on your button to save message. The machine can choose a random day from three days to one month. On that day, all the lights will be on and you click on your button to hear the one message from your self, just like a time capsule.

Contact mode: If you want to say something to your roommates but don’t want to knock on their doors or say something face by face, you can click on your button to record message, then click on your roommate’s button to save the message on his/her spot. All the lights will be on immediately to remind your roommates to listen to the message. Only the roommate who you leave message to can hear the message from you. Other roommates can only hear the message from themselves. Through this method, we can avoid the awkward of talking some dissatisfied things face by face and avoid the unpleasant feeling of talking first.

  • Structures and Pieces

I use 7 LED buttons, one NEO pixel ring, one microphone, one speaker with amplifier and one sound chip. It takes me a lot of time to put all these stuff into the wooden box.

IMG_3624 IMG_3626 IMG_3690 IMG_3689 IMG_3688IMG_3628 IMG_3691

  • Code

// include SPI, MP3 and SD libraries
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>
#include <Adafruit_NeoPixel.h>

// define the pins used
#define RESET 9 // VS1053 reset pin (output)
#define CS 10 // VS1053 chip select pin (output)
#define DCS 8 // VS1053 Data/command select pin (output)
#define CARDCS A0 // Card chip select pin
#define DREQ A1 // VS1053 Data request, ideally an Interrupt pin

#define REC_BUTTON 7
#define PLAY_BUTTON 5

#define PIN 3

Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(RESET, CS, DCS, DREQ, CARDCS);

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

File recording; // the file we will save our recording to
#define RECBUFFSIZE 128 // 64 or 128 bytes.
uint8_t recording_buffer[RECBUFFSIZE];

int led=2;
void setup() {
Serial.begin(9600);
Serial.println(“Record_Play”);

strip.begin();
strip.show();

rainbow(20);

pinMode(led, OUTPUT);

// initialise the music player
if (!musicPlayer.begin()) {
Serial.println(“VS1053 not found”);
while (1); // don’t do anything more
}

musicPlayer.sineTest(0x44, 500); // Make a tone to indicate VS1053 is working

if (!SD.begin(CARDCS)) {
Serial.println(“SD failed, or not present”);
while (1); // don’t do anything more
}
Serial.println(“SD OK!”);

// Set volume for left, right channels. lower numbers == louder volume!
musicPlayer.setVolume(40,40);

// when the button is pressed, record!
pinMode(REC_BUTTON, INPUT);
digitalWrite(REC_BUTTON, HIGH);
pinMode(PLAY_BUTTON, INPUT);
digitalWrite(PLAY_BUTTON, HIGH);

// load plugin from SD card! We’ll use mono 44.1KHz, high quality
if (! musicPlayer.prepareRecordOgg(“v44k1q05.img”)) {
Serial.println(“Couldn’t load plugin!”);
while (1);
}
}

uint8_t isRecording = false;

int num;

void loop() {
if (!isRecording && !digitalRead(REC_BUTTON)) {
Serial.println(“Begin recording”);
isRecording = true;

digitalWrite(led, HIGH);

// Check if the file exists already
char filename[15];
strcpy(filename, “RECORD00.OGG”);
for (uint8_t i = 0; i < 100; i++) {
filename[6] = ‘0’ + i/10;
filename[7] = ‘0’ + i%10;

num=i;
// create if does not exist, do not open existing, write, sync after write
if (! SD.exists(filename)) {
break;
}
}
Serial.print(“Recording to “); Serial.println(filename);
recording = SD.open(filename, FILE_WRITE);
if (! recording) {
Serial.println(“Couldn’t open file to record!”);
while (1);
}
musicPlayer.startRecordOgg(true); // use microphone (for linein, pass in ‘false’)
}
if (isRecording)
saveRecordedData(isRecording);
if (isRecording && !digitalRead(REC_BUTTON)) {
Serial.println(“End recording”);

digitalWrite(led, LOW);

musicPlayer.stopRecordOgg();
isRecording = false;
// flush all the data!
saveRecordedData(isRecording);
// close it up
recording.close();
delay(100);
}

if(!isRecording && !digitalRead(PLAY_BUTTON)){
if (! musicPlayer.begin()) { // initialise the music player
Serial.println(F(“Couldn’t find VS1053, do you have the right pins defined?”));
while (1);
}
Serial.println(F(“VS1053 found”));

SD.begin(CARDCS); // initialise the SD card

// Set volume for left, right channels. lower numbers == louder volume!
musicPlayer.setVolume(40,40);

// Timer interrupts are not suggested, better to use DREQ interrupt!
//musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // timer int

// If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background
// audio playing
musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int

char filename[15];
strcpy(filename, “RECORD00.OGG”);
filename[6] = ‘0’ + num/10;
filename[7] = ‘0’ + num%10;
// Play one file, don’t return until complete

musicPlayer.playFullFile(filename);

// File is playing in the background
if (musicPlayer.stopped()) {
Serial.println(“Done playing music”);
}

delay(100);
}
}

uint16_t saveRecordedData(boolean isrecord) {
uint16_t written = 0;

// read how many words are waiting for us
uint16_t wordswaiting = musicPlayer.recordedWordsWaiting();

// try to process 256 words (512 bytes) at a time, for best speed
while (wordswaiting > 256) {
//Serial.print(“Waiting: “); Serial.println(wordswaiting);
// for example 128 bytes x 4 loops = 512 bytes
for (int x=0; x < 512/RECBUFFSIZE; x++) {
// fill the buffer!
for (uint16_t addr=0; addr < RECBUFFSIZE; addr+=2) {
uint16_t t = musicPlayer.recordedReadWord();
//Serial.println(t, HEX);
recording_buffer[addr] = t >> 8;
recording_buffer[addr+1] = t;
}
if (! recording.write(recording_buffer, RECBUFFSIZE)) {
Serial.print(“Couldn’t write “); Serial.println(RECBUFFSIZE);
while (1);
}
}
// flush 512 bytes at a time
recording.flush();
written += 256;
wordswaiting -= 256;
}

wordswaiting = musicPlayer.recordedWordsWaiting();
if (!isrecord) {
Serial.print(wordswaiting); Serial.println(” remaining”);
// wrapping up the recording!
uint16_t addr = 0;
for (int x=0; x < wordswaiting-1; x++) {
// fill the buffer!
uint16_t t = musicPlayer.recordedReadWord();
recording_buffer[addr] = t >> 8;
recording_buffer[addr+1] = t;
if (addr > RECBUFFSIZE) {
if (! recording.write(recording_buffer, RECBUFFSIZE)) {
Serial.println(“Couldn’t write!”);
while (1);
}
recording.flush();
addr = 0;
}
}
if (addr != 0) {
if (!recording.write(recording_buffer, addr)) {
Serial.println(“Couldn’t write!”); while (1);
}
written += addr;
}
musicPlayer.sciRead(VS1053_SCI_AICTRL3);
if (! (musicPlayer.sciRead(VS1053_SCI_AICTRL3) & _BV(2))) {
recording.write(musicPlayer.recordedReadWord() & 0xFF);
written++;
}
recording.flush();
}

return written;
}
//RING
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}

void rainbow(uint8_t wait) {
uint16_t i, j;

for(j=0; j<256; j++) {
for(i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i+j) & 255));
}
strip.show();
delay(wait);
}
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;

for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
for(i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
for (int j=0; j<10; j++) { //do 10 cycles of chasing
for (int q=0; q < 3; q++) {
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, c); //turn every third pixel on
}
strip.show();

delay(wait);

for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
for (int q=0; q < 3; q++) {
for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, Wheel( (i+j) % 255)); //turn every third pixel on
}
strip.show();

delay(wait);

for (int i=0; i < strip.numPixels(); i=i+3) {
strip.setPixelColor(i+q, 0); //turn every third pixel off
}
}
}
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r – g – b – back to r.
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 – WheelPos;
if(WheelPos < 85) {
return strip.Color(255 – WheelPos * 3, 0, WheelPos * 3);
} else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 – WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 – WheelPos * 3, 0);
}
}

 

Final Project Proposal

I combine this with my major studio final project. This is a recorder used by roommates, which can record the word you want to say to yourself. Also others can give good suggestions, blessing  or funny word to you through this recorder. The big stars on the box are LED buttons. Each one have their own button. You press your button to record sound then press your button again to finish recording. The recorder will choose a random day from 3 days to 10 days to repeat the word to you. When it repeat word, all the lights are on first to remind you that there is a word to you from the past or the space. So it’s just like a time machine. You go to the recorder, press your button and listen to the word from yourself or others then your light goes off.

You can also use this to say something you are not willing to tell your roommates face by face. It gives you a media to avoid some awkward and conflict.

The buttons and little stars make up the letter “t”, which means the theme of “Talk to me”.

IMG_3542 IMG_0001

Midterm_Haotian Li

Drawing Robot

This robot can draw four different shapes according to the distance. The shapes are rectangle, trapezoid, transverse line and vertical line. It draws vertical lines when distance is between 27cm and 37 cm, transverse lines when distance is between 20cm and 27 cm, rectangle when distance is between 10 cm and 20 cm, trapezoid when distance is between 0 cm and 10 cm. The robot is sleeping when it lies down so it doesn’t work. It begins working when it stands up.

I use ultrasonic distance sensor to measure the distance and use three servos to control the arms and draw shapes. There is a triple-axis accelerometer inside to control it working or not.

I design the machinery structures and out looking of the robot in AI. Then use laser cutter to make all the components.

IMG_3281 IMG_3283 647C35D0-B629-42AA-BC74-290FD7DF29ED

Code_______________________

#define SERVOPINLIFT 2
#define SERVOPINLEFT 3
#define SERVOPINRIGHT 4

#define trigPin 9
#define echoPin 8

#include <Servo.h>

Servo servo1; //
Servo servo2; //
Servo servo3; //

//ADXL 335
const int xInput = A0;
const int yInput = A1;
const int zInput = A2;

int xRawMin = 512;
int xRawMax = 512;

int yRawMin = 512;
int yRawMax = 512;

int zRawMin = 512;
int zRawMax = 512;

const int sampleSize = 10;

int led1=13;
int led2=12;

void setup()
{
analogReference(EXTERNAL);
Serial.begin(9600);
servo1.attach(SERVOPINLIFT); // lifting servo
servo2.attach(SERVOPINLEFT); // left servo
servo3.attach(SERVOPINRIGHT); // right servo
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);

servo1.write(25);
servo2.write(30);
servo3.write(150);

}

void loop()
{

int xRaw = ReadAxis(xInput);
int yRaw = ReadAxis(yInput);
int zRaw = ReadAxis(zInput);

int duration,distance;
digitalWrite(trigPin,HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin,LOW);
duration=pulseIn(echoPin,HIGH);
distance=(duration/2)/29.1;
Serial.println(distance);
delay(100);

if(zRaw>470){
digitalWrite(led1,HIGH);
digitalWrite(led2,HIGH);

//up down
if(distance>37){
servo2.write(30);
servo3.write(150);
delay(15);
}

if(distance>27 && distance<=37){
for(int i=20; i<50; i+=1)
{
servo2.write(i);
servo3.write(180-i);
delay(15);
}

for(int i=50; i>20; i-=1)
{
servo2.write(i);
servo3.write(180-i);
delay(15);
}
}

//left right
if(distance>20 && distance<=27){
for(int i=85; i>20; i-=1)
{
servo2.write(i);
servo3.write(180+i-85);
delay(15);
}
for(int i=20; i<85; i+=1)
{
servo2.write(i);
servo3.write(180+i-85);
delay(15);
}
}

//rectangle
if(distance>10 && distance<=20){
for(int i=85; i>45; i-=1)
{
servo2.write(i);
servo3.write(160+(0.37*(85-i)));
delay(15);
}
for(int i=45; i>15; i-=1)
{
servo2.write(i);
servo3.write(175+i-45);
delay(15);
}
for(int i=15; i<40; i+=1)
{
servo2.write(i);
servo3.write(145-i+15);
delay(15);
}
for(int i=40; i<85; i+=1)
{
servo2.write(i);
servo3.write(120+(i-35)*0.7);
delay(15);
}
}

//???
if(distance>0 && distance<=10){
for(int i=65; i>30; i-=1)
{
servo2.write(i);
servo3.write(168-(0.5*(65-i)));
delay(15);
}
for(int i=30; i>25; i-=1)
{
servo2.write(i);
servo3.write(150-4.4*(30-i));
delay(15);
}
for(int i=25; i<62.5; i+=1)
{
servo2.write(i);
servo3.write(128+0.4*(62.5-i));
delay(15);
}
for(int i=62.5; i<65; i+=1)
{
servo2.write(i);
servo3.write(143+10*(65-i));
delay(15);
}
}
}
if(zRaw<=470){
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
servo2.write(30);
servo3.write(150);
}

Serial.println(distance);
}

int ReadAxis(int axisPin)
{
long reading = 0;
analogRead(axisPin);
delay(1);
for (int i = 0; i < sampleSize; i++)
{
reading += analogRead(axisPin);
}
return reading/sampleSize;
}

LOL SHIELD

DT!

Code_________________________

/*
Basic LoL Shield Test

Writen for the LoL Shield, designed by Jimmie Rodgers:
http://jimmieprodgers.com/kits/lolshield/

This needs the Charliplexing library, which you can get at the
LoL Shield project page: http://code.google.com/p/lolshield/

Created by Jimmie Rodgers on 12/30/2009.
Adapted from: http://www.arduino.cc/playground/Code/BitMath

History:
December 30, 2009 – V1.0 first version written at 26C3/Berlin

This is free software; you can redistribute it and/or
modify it under the terms of the GNU Version 3 General Public
License as published by the Free Software Foundation;
or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include <avr/pgmspace.h> //AVR library for writing to ROM
#include <Charliplexing.h> //Imports the library, which needs to be
//Initialized in setup.

//Sets the time each frame is shown (milliseconds)
const unsigned int blinkdelay = 300;

/*
The BitMap array is what contains the frame data. Each line is one full frame.
Since each number is 16 bits, we can easily fit all 14 LEDs per row into it.
The number is calculated by adding up all the bits, starting with lowest on
the left of each row. 18000 was chosen as the kill number, so make sure that
is at the end of the matrix, or the program will continue to read into memory.

Here PROGMEM is called, which stores the array into ROM, which leaves us
with our RAM. You cannot change the array during run-time, only when you
upload to the Arduino. You will need to pull it out of ROM, which is covered
below. If you want it to stay in RAM, just delete PROGMEM
*/
PROGMEM const uint16_t BitMap[][9] = {
//Diaganal swipe across the screen
{ 1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,1 },{ 3 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,3 },{ 7 ,1 ,1 ,1 ,1 ,1 ,1 ,1 ,7 },{ 15,1 ,1 ,9 ,9 ,9 ,1 ,1 ,15 },{ 31 ,1 ,1 ,25 ,25 ,25 ,1 ,1 ,31 },{ 31 ,1 ,1 ,25,25,25,1 ,1 ,31 },{ 127 ,65 ,65 ,25 ,25 ,25 ,65 ,97 ,127 },{ 127 ,65 ,65 ,25 ,25 ,25 ,65 ,97 ,127 },{ 511 ,65 ,65 ,409 ,409 ,409 ,449 ,481 ,511 },{1023 ,65 ,65 ,409 ,409 ,409 ,449 ,481 ,1023 },{ 2047 ,65 ,65 ,409 ,409 ,409 ,449 ,481 ,2047 },{ 4095 ,65 ,65 ,2457 ,2457 ,2457 ,2497 ,2529 ,4095 },{ 8191 ,65 ,65 ,6553 ,6553 ,6553 ,6593 ,6625 ,8191 },{ 16383 ,8257 ,8257 ,14745 ,14745 ,14745 ,14785 ,14817 ,16383 },{ 16383 ,8257 ,8257 ,14745 ,14745 ,14745 ,14785 ,14817 ,16383 },

{18000}
};

void setup() {
LedSign::Init(DOUBLE_BUFFER | GRAYSCALE); //Initializes the screen
}
void loop() {
//for (uint8_t gray = 1; gray < SHADES; gray++)
DisplayBitMap(4); //Displays the bitmap
}

void DisplayBitMap(uint8_t grayscale)
{
boolean run=true; //While this is true, the screen updates
byte frame = 0; //Frame counter
byte line = 0; //Row counter
unsigned long data; //Temporary storage of the row data
unsigned long start = 0;

while(run == true) {

for(line = 0; line < 9; line++) {

//Here we fetch data from program memory with a pointer.
data = pgm_read_word_near (&BitMap[frame][line]);

//Kills the loop if the kill number is found
if (data==18000){
run=false;
}

//This is where the bit-shifting happens to pull out
//each LED from a row. If the bit is 1, then the LED
//is turned on, otherwise it is turned off.
else for (byte led=0; led<14; ++led) {
if (data & (1<<led)) {
LedSign::Set(led, line, grayscale);
}
else {
LedSign::Set(led, line, 0);
}
}
}

LedSign::Flip(true);

unsigned long end = millis();
unsigned long diff = end – start;
if ( start && (diff < blinkdelay) )
delay( blinkdelay – diff );
start = end;

frame++;
}
}

HAOTIAN_HOMEWORK

I make a fortune cat by using a servo and a pressure sensor. The fortune cat waves his hand to gather good luck and fortune. If you press his right hand, he will moves his hand faster.IMG_3141 IMG_3144

 

Code_________________________________________

#include <Servo.h>

Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position

int sensorPin = 0;
int pre = 0;
int val = 0;

void setup()
{
Serial.begin(9600);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop()
{
pre = analogRead(sensorPin);
val = map(pre,0,500,1,10);

for(pos = 30; pos < 160; pos += val) // goes from 30 degrees to 160 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 160; pos>=30; pos-=val) // goes from 160 degrees to 30 degrees
{
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(15); // waits 15ms for the servo to reach the position
}
Serial.println(val);
}

Haotian_Pressure Measurement

Press the face then the LCD screen can show the pressure.

When you are angry, you may want to hit somebody. This help you to express your angry and show you angry level.

7F43438E-85F7-4CFD-9ABB-4E18FB38540C

#include <LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);
int sensorPin = A2;
int val=0;

void setup()
{
lcd.begin(16,2);
lcd.print(“press”);
delay(2000);JN
lcd.clear();
}

void loop()
{
val= analogRead(sensorPin);
lcd.print(“Pressure”);
lcd.setCursor(0,1);
lcd.print(val);
delay(1000);
lcd.clear();
Serial.print(val);

}

HAOTIAN_HOMEWORK

I use the RGB LED light with photoresistors to make the LED change color. The LED can show different colors when you change the amount of light that hits on the photoresistors.

WEEK2

Video:

Pcomp_week2

Arduino code


const int greenLEDPin=9;

const int redLEDPin=10;
const int blueLEDPin=11;

const int redSensorPin=A0;
const int greenSensorPin=A1;
const int blueSensorPin=A2;

int redValue=0;
int greenValue=0;
int blueValue=0;

int redSensorValue=0;
int greenSensorValue=0;
int blueSensorValue=0;

void setup(){
Serial.begin(9600);
pinMode(greenLEDPin,OUTPUT);
pinMode(redLEDPin,OUTPUT);
pinMode(blueLEDPin,OUTPUT);
}

void loop(){
redSensorValue = analogRead(redSensorPin);
delay(5);
greenSensorValue = analogRead(greenSensorPin);
delay(5);
blueSensorValue = analogRead(blueSensorPin);
Serial.print(“Raw Sensor Value \t Red:”);
Serial.print(redSensorValue);
Serial.print(“\t Green:”);
Serial.print(greenSensorValue);
Serial.print(“\t Blue:”);
Serial.println(blueSensorValue);
redValue = redSensorValue/4;
greenValue = greenSensorValue/4;
blueValue = blueSensorValue/4;

Serial.print(“Mapped Sensor Value \t Red:”);
Serial.print(redValue);
Serial.print(“\t Green:”);
Serial.print(greenValue);
Serial.print(“\t Blue:”);
Serial.println(blueValue);

analogWrite(redLEDPin, redValue);
analogWrite(greenLEDPin, greenValue);
analogWrite(blueLEDPin, blueValue);

}


Continue reading

INTRO_HAOTIAN LI

Hi! My name is Haotian Li. I just graduated this summer and my background is Industrial design. This is my first year in MFA Design and Technology. I feel that everything is very cool here and want to combine software and hardware in my design.

I went to Ericsson China company in my fourth year of undergraduate as a UI designer. I designed the interface of an app which used by workers to feed back information after work. Also I designed the interaction ways of this app.

I used the Arduino to make an intelligent flower pot in my fourth year which can measure the CO2, temperature and humidity of the air inside our home. Then the flower can show the air condition by its open angle. I find that we can do a lot of things by using Arduino.HAOTIAN