4 Agustus 2015, melalui pembicaraan singkat team Code4nation pada platform slack, salah satu member dari Techinasia mengemukakan ide dari CTO mereka tentang campaign acara Hackathon Merdeka yaitu membuat kerekan bendera yang dikontrol via twitter, jadi ketika ada tweet dengan hashtag tertentu maka si bendera akan dengan sendirinya naik perlahan. Hal ini disambut positif oleh mas Ainun Najib (penggagas kawalpemilu dan laporpresiden). “@sofianhw bisa upayakan IoT (Internet of Things) -nya?” ucap mas Ainun Najib. Seketika itu juga saya jawab “Bisa!!”.
Diselah-selah kesibukan mempersiapkan eventTresemme pada acara Market Museum. Saya mencoba menyiapkan bahan, pertama yang terngiang dipikiran saya yaitu stepper motor agar pegerakannya lebih persisi. Dan untuk katrolnya sendiri saya akan menggunakan timing belt printer.
Pencarianpun dimulai, dari online maupun offline. Timing belt printer mayoritas pendek, saya membutuhkan minimal satu meter. Akhirnya nemu timing belt 3d printer di tokopedia panjangnya pas banget satu meter.
Pada tanggal 13 Agustus 2015, timing belt 3d printer yang saya pesan tiba di tempat tinggal saya. Tapi saat itu saya lagi sibuk-sibuknya loading barang untuk event. Akhirnya tanggal 16 Agustus 2015, barulah saya punya kesempatan untuk menyelesaikan projek ini. Berikut barang-barang yang saya gunakan :
Intel Edison
ULN2803a
Stepper Motor
Timing belt 3d printer
Dudukan untuk kamera
Gagang Sapu
Kabel Tie
Pertama-tama saya akan rakit tiang benderanya dulu. Ikatkan dudukan kamera dan stepper motor pada gagang sapu menggunakan kabel tie.
pastikan timing belt tidak terlalu kencang maupun kendor.
Setelah itu marilah kita rakit rangkaian ULN dan intel edison sebagai berikut :
Mari kita sambungkan keseluruhan system
Selanjutnya mari kita putar-putar kerekannya. Berikut kode yang saya tulis menggunakan bahasa python.
importtimefromwiringx86importGPIOEdisonasGPIOgpio=GPIO(debug=False)pin1=3pin2=4pin3=5pin4=6index=0print'Setting up pin %d'%pin1gpio.pinMode(pin1,gpio.OUTPUT)print'Setting up pin %d'%pin2gpio.pinMode(pin2,gpio.OUTPUT)print'Setting up pin %d'%pin3gpio.pinMode(pin3,gpio.OUTPUT)print'Setting up pin %d'%pin4gpio.pinMode(pin4,gpio.OUTPUT)print'Go up now...'try:while(True):gpio.digitalWrite(pin4,gpio.LOW)gpio.digitalWrite(pin2,gpio.HIGH)time.sleep(0.01)gpio.digitalWrite(pin1,gpio.LOW)gpio.digitalWrite(pin3,gpio.HIGH)time.sleep(0.01)gpio.digitalWrite(pin2,gpio.LOW)gpio.digitalWrite(pin4,gpio.HIGH)time.sleep(0.01)gpio.digitalWrite(pin3,gpio.LOW)gpio.digitalWrite(pin1,gpio.HIGH)time.sleep(0.01)index=index+1# When you get tired of seeing the led blinking kill the loop with Ctrl-C.exceptKeyboardInterrupt:print'\nCleaning up...'print'total step %d'%indexgpio.digitalWrite(pin1,gpio.LOW)gpio.digitalWrite(pin2,gpio.LOW)gpio.digitalWrite(pin3,gpio.LOW)gpio.digitalWrite(pin4,gpio.LOW)# Do a general cleanup. Calling this function is not mandatory. gpio.cleanup()
eksekusi kode tersebut, ketika bendera sudah mencapai puncaknya tekan “Ctrl + C” untuk interrupt program, lalu program akan memberikan output berapa putaran yang diperlukan untuk mencapai puncak.
Terminal
1
$ python countFlagSteps.py
Ketika semua step dianggap sukses sekarang marilah kita hubungkan ke twitter.
sebelum memulai ada baiknya kita membuat aplikasi pada twitter kita.
Kita akan memanfaatkan API Streaming untuk mendapatkan jumlah tweet secara real-time.
importargparseimporttimefromwiringx86importGPIOEdisonasGPIOfromTwitterAPIimportTwitterAPI,TwitterOAuth,TwitterRestPagergpio=GPIO(debug=False)pin1=3pin2=4pin3=5pin4=6COUNT=100# search download batch sizedefsetup():print'Setting up pin %d'%pin1gpio.pinMode(pin1,gpio.OUTPUT)print'Setting up pin %d'%pin2gpio.pinMode(pin2,gpio.OUTPUT)print'Setting up pin %d'%pin3gpio.pinMode(pin3,gpio.OUTPUT)print'Setting up pin %d'%pin4gpio.pinMode(pin4,gpio.OUTPUT)defputer():print"muter"foriinrange(100):printigpio.digitalWrite(pin4,gpio.LOW)gpio.digitalWrite(pin2,gpio.HIGH)time.sleep(0.01)gpio.digitalWrite(pin1,gpio.LOW)gpio.digitalWrite(pin3,gpio.HIGH)time.sleep(0.01)gpio.digitalWrite(pin2,gpio.LOW)gpio.digitalWrite(pin4,gpio.HIGH)time.sleep(0.01)gpio.digitalWrite(pin3,gpio.LOW)gpio.digitalWrite(pin1,gpio.HIGH)time.sleep(0.01)defcount_old_tweets(api,word_list):words=' OR '.join(word_list)count=0whileTrue:pager=TwitterRestPager(api,'search/tweets',{'q':words,'counforiteminpager.get_iterator():if'text'initem:count+=1print(count)elif'message'initem:ifitem['code']==131:continue# ignore internal server error elifitem['code']==88:print('Suspend search until %s'%searchraiseException('Message from twitter: %s'%itedefcount_new_tweets(api,word_list):words=','.join(word_list)count=0total_skip=0whileTrue:skip=0try:r=api.request('statuses/filter',{'track':words})whileTrue:foriteminr.get_iterator():if'text'initem:count+=1puter()print(count+skip+total_skip)elif'limit'initem:skip=item['limit'].get('track'#print('\n\n\n*** Skipping %d twelif'disconnect'initem:raiseException('Disconnect: %s'exceptExceptionase:print('*** MUST RECONNECT %s'%e)total_skip+=skipif__name__=='__main__':parser=argparse.ArgumentParser(description='Count occurance of word(s)parser.add_argument('-past',action='store_true',help='search historic parser.add_argument('-oauth',metavar='FILENAME',type=str,help='read Oparser.add_argument('words',metavar='W',type=str,nargs='+',help='worargs=parser.parse_args()oauth=TwitterOAuth.read_file(args.oauth)api=TwitterAPI(oauth.consumer_key,oauth.consumer_secret,oauth.accesstry:setup()ifargs.past:count_old_tweets(api,args.words)else:count_new_tweets(api,args.words)exceptKeyboardInterrupt:print('\nTerminated by user\n')gpio.digitalWrite(pin1,gpio.LOW)gpio.digitalWrite(pin2,gpio.LOW)gpio.digitalWrite(pin3,gpio.LOW)gpio.digitalWrite(pin4,gpio.LOW)# Do a general cleanup. Calling this function is not mandatory. gpio.cleanup()exceptExceptionase:print('*** STOPPED %s\n'%e)